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

この記事は、[IBM Cloud VPCでシンプルなウェブサイト構築を体験する](https://qiita.com/kenichit/items/796b0cff7d09a0f517f6)の構築ステップを説明しています。IBM CloudのUI変更により連載記事構成の変更が必要となったため、2022年版として補足記事を作成しました。

このステップでは、VPCに仮想サーバー・インスタンス(VSI)を3台作成します。[IBM Cloud VPC でシンプルなウェブサイト構築を体験する(2022年版) - 1. VPC作成](https://qiita.com/kenichit/items/aa63cedf7f0a0aee71a1)のステップ完了が前提です。
![dialog-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/b4d5a5f1-7962-3df5-eee0-41ed0b9d8144.png)

## ステップ3-0: 準備
VSI作成時にOSセットアップとHello Worldページの書き込みを行うため、cloud-initファイルを準備します。cloud-initの詳細については、[cloud-init Documentation](https://cloudinit.readthedocs.io/en/latest/)を参照してください。
### ステップ3-0-1: SSH鍵の準備
ssh-keygenコマンドの例を示します。

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

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

```shell_session: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が書き込まれます。

<details><summary>webサーバー1 用のcloud-initファイル</summary><div>

```yaml: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
```

</div></details>

<details><summary>webサーバー2 用のcloud-initファイル</summary><div>


```yaml: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
```

</div></details>

<details><summary>bastion 用のcloud-initファイル</summary><div>

```yaml: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
```

</div></details>

## ステップ3-1
「VPCインフラストラクチャー」>「コンピュート」>「仮想サーバー・インスタンス」をクリックします。
画面右側の「作成」ボタンをクリックします。
![vsi-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/fa03f8b8-073d-ea64-e975-7abb528ee462.png)

## ステップ3-2
パラメーター・シートの「仮想サーバー webサーバー1」のパラメーターを入力します。

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

入力が完了したら画面右側の「仮想サーバーの作成」ボタンをクリックします。
![vsi-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/75d511ac-ea33-a47a-5b41-0034256b3f80.png)


## ステップ3-3
サーバーが作成されます。ステップ3-2と同様に、webサーバー2とbastionを作成します。
![vsi-03-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/3f2c4fa5-f6e0-7a51-f6c5-e0b09bbd9467.png)
### webサーバー2
* パラメーター・シートの「仮想サーバー webサーバー2」のパラメーターを入力します。
* 「ユーザー・データのインポート」をクリックし、ステップ3-0-2で作成したcloudinit_web2.yamlファイルを読み込ませます。

![vsi-03-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/0c9bdd94-0ec4-cfef-5d9e-72fcf7d8046c.png)

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

![vsi-03-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/fb7ec351-e6f7-37a6-eefd-7e0c857abfca.png)

## ステップ3-4
3台のサーバーが作成されます。
![vsi-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/fe5d74c3-e8c8-2155-e92b-8ea58876d2fe.png)

次に、[浮動IP取得とバインド](https://qiita.com/kenichit/items/63003852c4424d4c024d)に進みます。