IBM Cloud VPC でシンプルなウェブサイト構築を体験する - 3. 仮想サーバー・インスタンス作成


この記事は、IBM Cloud VPCでシンプルなウェブサイト構築を体験するの構築ステップを説明しています。

このステップでは、VPCに仮想サーバー・インスタンス(VSI)を3台作成します。

ステップ3-0: 準備

VSI作成時にOSセットアップとHello Worldページの書き込みを行うため、cloud-initファイルを準備します。cloud-initの詳細については、cloud-init Documentationを参照してください。

ステップ3-0-1: SSH鍵の準備

ssh-keygenコマンドの例を示します。

  • 新たな空の作業用ディレクトリーを作りその中に鍵ファイルを作成するなどして、既存の鍵を上書きして壊さないよう注意を払います。
  • 鍵利用時に必要なパスフレーズを求められます。任意のパスフレーズを入力できます。
  • Windowsを利用されている方は、使い慣れている鍵生成ツールを利用可能です。

作成が完了すると、2つのファイルが作成されます。以下の例だと、秘密鍵はid_rsa、公開鍵はid_rsa.pubという名前になっています。

ssh-keygenコマンドの例
$ ssh-keygen -t rsa -b 4096 -f ./id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ./id_rsa.
Your public key has been saved in ./id_rsa.pub.
The key fingerprint is:
SHA256:5G0liQAJgEccj8pmt5SXr8clVhKW0f0yZIIf9//7DQE
The key's randomart image is:
+---[RSA 4096]----+
|o++o.o..= .      |
|. oo.  * = *     |
| .. . . = O E    |
|..  . .+ + = +   |
|.+ + o  S o o o  |
|o o o .o o     o |
|   .  o.o     . .|
|      .o       .o|
|     ..        .=|
+----[SHA256]-----+

ステップ3-0-2: cloud-initファイルの準備

ステップ3-2の「ユーザー・データのインポート」でアップロードするために、ファイルを準備します。作業している端末で:
1. 以下のyamlをコピペし3つのファイルを作成します。
2. それぞれのファイルの中で「(SSH公開鍵)」と書かれた部分を、ステップ3-0-1で作成したSSH公開鍵ファイルの中の鍵の部分で置き換えます。SSH公開鍵ファイル中の"ssh-rsa"や最後にある(ユーザー名)@(ホスト名)の部分とスペースは置き換えには使いません。

準備したcloud-initファイルを使うと、VSI作成時に以下の作業が自動化されます:

  • vpcuserというOSユーザーが作成されます。ステップ3-0-1で作成したSSH秘密鍵を使ってログインし、パスワードなしでsudo可能なユーザーです。
  • NGINXがインストールされます。
  • helloworld.htmlが書き込まれます。

webサーバー1 用のcloud-initファイル
cloudinit_web1.yaml
#cloud-config
users:
  - default
  - name: vpcuser
    group: admin
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-rsa (SSH公開鍵)

write_files:
- encoding: base64
  owner: root:root
  path: /var/www/html/helloworld.html
  permissions: '0644'
  content: PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImphIj4KICA8aGVhZD4KICAgIDwhLS0gUmVxdWlyZWQgbWV0YSB0YWdzIC0tPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4KICAgIDwhLS0gQm9vdHN0cmFwIENTUyAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9zdGFja3BhdGguYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvNC4yLjEvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiBpbnRlZ3JpdHk9InNoYTM4NC1HSnpacUZHd2IxUVRUTjZ3eTU5ZmZGMUJ1R0pwTFNhOURrS01wMERnaU1EbTRpWU1qNzBnWldLWWJJNzA2dFdTIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj4KICAgIDx0aXRsZT5IZWxsbywgd29ybGQhPC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8IS0tIE1vZGFsIC0tPgogICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImV4YW1wbGVNb2RhbENlbnRlciIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iZXhhbXBsZU1vZGFsQ2VudGVyVGl0bGUiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCIgcm9sZT0iZG9jdW1lbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImV4YW1wbGVNb2RhbENlbnRlclRpdGxlIj5IZWxsbyBXb3JsZCE8L2g0PgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgIDxoND7jgZPjgozjga8x5Y+w55uu44Gu44Km44Kn44OW44K144O844OQ44O844Gn44GZ44CCPC9oND4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGlkPSJidG5SZWxvYWQiPuODquODreODvOODiTwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8IS0tIE9wdGlvbmFsIEphdmFTY3JpcHQgLS0+CiAgICA8IS0tIGpRdWVyeSBmaXJzdCwgdGhlbiBQb3BwZXIuanMsIHRoZW4gQm9vdHN0cmFwIEpTIC0tPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0zLjMuMS5zbGltLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtcThpL1grOTY1RHpPMHJUN2FiSzQxSlN0UUlBcVZnUlZ6cGJ6bzVzbVhLcDRZZlJ2SCs4YWJ0VEUxUGk2aml6byIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcG9wcGVyLmpzLzEuMTQuNi91bWQvcG9wcGVyLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtd0hBaUZmUmxNRnk2aTVTUmF4dmZPQ2lmQlVReTF4SGRKL3lvaTdGUk5YTVJCdTVXSGRaWXUxaEE2Wk9ibGd1dCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zdGFja3BhdGguYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvNC4yLjEvanMvYm9vdHN0cmFwLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtQjBVZ2x5UitqTjZDa3Z2SUNPQjJqb2FmNUk0bDNnbTlHVTZIYzFvZzZMczdpNlUvbWtrYWR1S2FCaGxBWHY5ayIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CiAgICA8IS0tIE1vZGFsIGFuZCBCdXR0b24gLS0+CiAgICA8c2NyaXB0PgogICAgICAkKCgpID0+IHsKICAgICAgICAkKCcjZXhhbXBsZU1vZGFsQ2VudGVyJykubW9kYWwoKTsKICAgICAgfSk7CiAgICAgICQoJyNidG5SZWxvYWQnKS5jbGljaygoKSA9PiB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K

packages:
  - nginx
package_update: true
package_upgrade: true
package_reboot_if_required: true

webサーバー2 用のcloud-initファイル
cloudinit_web2.yaml
#cloud-config
users:
  - default
  - name: vpcuser
    group: admin
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-rsa (SSH公開鍵)

write_files:
- encoding: base64
  owner: root:root
  path: /var/www/html/helloworld.html
  permissions: '0644'
  content: PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImphIj4KICA8aGVhZD4KICAgIDwhLS0gUmVxdWlyZWQgbWV0YSB0YWdzIC0tPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4KICAgIDwhLS0gQm9vdHN0cmFwIENTUyAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9zdGFja3BhdGguYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvNC4yLjEvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiBpbnRlZ3JpdHk9InNoYTM4NC1HSnpacUZHd2IxUVRUTjZ3eTU5ZmZGMUJ1R0pwTFNhOURrS01wMERnaU1EbTRpWU1qNzBnWldLWWJJNzA2dFdTIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj4KICAgIDx0aXRsZT5IZWxsbywgd29ybGQhPC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8IS0tIE1vZGFsIC0tPgogICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImV4YW1wbGVNb2RhbENlbnRlciIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iZXhhbXBsZU1vZGFsQ2VudGVyVGl0bGUiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCIgcm9sZT0iZG9jdW1lbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImV4YW1wbGVNb2RhbENlbnRlclRpdGxlIj5IZWxsbyBXb3JsZCE8L2g0PgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgIDxoND7jgZPjgozjga8y5Y+w55uu44Gu44Km44Kn44OW44K144O844OQ44O844Gn44GZ44CCPC9oND4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGlkPSJidG5SZWxvYWQiPuODquODreODvOODiTwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8IS0tIE9wdGlvbmFsIEphdmFTY3JpcHQgLS0+CiAgICA8IS0tIGpRdWVyeSBmaXJzdCwgdGhlbiBQb3BwZXIuanMsIHRoZW4gQm9vdHN0cmFwIEpTIC0tPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0zLjMuMS5zbGltLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtcThpL1grOTY1RHpPMHJUN2FiSzQxSlN0UUlBcVZnUlZ6cGJ6bzVzbVhLcDRZZlJ2SCs4YWJ0VEUxUGk2aml6byIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcG9wcGVyLmpzLzEuMTQuNi91bWQvcG9wcGVyLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtd0hBaUZmUmxNRnk2aTVTUmF4dmZPQ2lmQlVReTF4SGRKL3lvaTdGUk5YTVJCdTVXSGRaWXUxaEE2Wk9ibGd1dCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zdGFja3BhdGguYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvNC4yLjEvanMvYm9vdHN0cmFwLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtQjBVZ2x5UitqTjZDa3Z2SUNPQjJqb2FmNUk0bDNnbTlHVTZIYzFvZzZMczdpNlUvbWtrYWR1S2FCaGxBWHY5ayIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CiAgICA8IS0tIE1vZGFsIGFuZCBCdXR0b24gLS0+CiAgICA8c2NyaXB0PgogICAgICAkKCgpID0+IHsKICAgICAgICAkKCcjZXhhbXBsZU1vZGFsQ2VudGVyJykubW9kYWwoKTsKICAgICAgfSk7CiAgICAgICQoJyNidG5SZWxvYWQnKS5jbGljaygoKSA9PiB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K

packages:
  - nginx
package_update: true
package_upgrade: true
package_reboot_if_required: true

bastion 用のcloud-initファイル
cloudinit_bastion.yaml
#cloud-config
users:
  - default
  - name: vpcuser
    group: admin
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-rsa (SSH公開鍵)

package_update: true
package_upgrade: true
package_reboot_if_required: true

ステップ3-1

「VPCインフラストラクチャー」>「コンピュート」>「仮想サーバー・インスタンス」をクリックします。
画面右側の「作成」ボタンをクリックします。

ステップ3-2

パラメーター・シートの「仮想サーバー webサーバー1」のパラメーターを入力します。

  • 「仮想プライベート・クラウド」の値が「1.VPC作成」で作成したVPCの名前と一致していることを確認してください。
  • 「ユーザー・データのインポート」をクリックしステップ3-0-2で作成したcloudinit_web1.yamlファイルを読み込ませると、「ユーザー・データ(オプション)」の項目にファイルの内容が入力されます。

入力が完了したら画面右側の「仮想サーバー・インスタンスの作成」ボタンをクリックします。

ステップ3-3

サーバーが作成されます。ステップ3-2と同様に、webサーバー2とbastionを作成します。

webサーバー2

  • パラメーター・シートの「仮想サーバー webサーバー2」のパラメーターを入力します。
  • 「ユーザー・データのインポート」をクリックし、ステップ3-0-2で作成したcloudinit_web2.yamlファイルを読み込ませます。

bastion

  • パラメーター・シートの「仮想サーバー bastion」のパラメーターを入力します。
  • 「ユーザー・データのインポート」をクリックし、ステップ3-0-2で作成したcloudinit_bastion.yamlファイルを読み込ませます。

ステップ3-4

3台のサーバーが作成されます。

次に、浮動IP取得とバインドに進みます。