IBM Cloud VPC でシンプルなウェブサイト構築を体験する

# はじめに
IBM Cloud VPCを使ったシンプルなウェブサイト構築を題材に、やってみたことを入門レベルのチュートリアル記事としてまとめました。

# 構成図
この記事での前提となる構成図は以下の通りです。構成図の赤点線内を構築します。

* bastionは踏み台サーバーです。インターネットからSSHログインできる箇所を最小にしておきます。また、鍵認証でSSHログインできるよう設定します。
* ウェブサーバーが直接インターネットに接続されるのではなくロード・バランサーを経由することは、以下の観点で望ましいです。
    * ウェブサイトのスケールアウトが容易になること
    * ウェブサーバーとして必要なポート以外へのアクセスや攻撃を防げること

![simpleWebDiagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/f1f965c9-c66f-dddc-9103-90a720c23ace.png)

構成図で登場するサービスについて、[用語説明](#用語説明)があります。
#### 構成図を描く方向けの参考情報:
[Editable architecture diagram resources(英文)](https://www.ibm.com/cloud/architecture/architectures/edit/)では、構成図の素材の情報が提供されています。記事執筆時点では、IBM IT Architect Assistant、draw.io、Omnigraffle、PowerPoint、System Architect、Visio向けの情報があります。


## 用語説明
### リソース・グループ
* アクセス制御や請求処理を分かりやすくするため、システムやアプリに必要な一連の複数のリソースを編成して管理する仕組みです。

### VPC(Virtual Private Cloud)
* パブリック・クラウドの中にプライベートなコンピューティング環境を作るためのクラウドのサービスです。
* IBM Cloudの場合、VPCは単一のリージョンにデプロイされます。
* VPCは複数のゾーンにまたがることができます。

### リージョン
* VPCをデプロイする地理的領域です。「東京リージョン」というような呼ばれ方がされます。
* ３つの複数ゾーンで構成されるマルチゾーン・リージョンと、単一ゾーンで構成されるシングルゾーン・リージョンの２種類があります。IBM Cloudの東京リージョンは、マルチゾーン・リージョンです。

### ゾーン
* データー・センターのことです。
* 複数のゾーンを含むVPCを構成することで、耐障害性を高められます。

IBM Cloudでの「リージョン」と「ゾーン」という用語説明が、「[VPCのネットワーキングについて](https://cloud.ibm.com/docs/vpc?topic=vpc-about-networking-for-vpc#networking-terminology)」というページにあります。
VPC、リージョン、ゾーンという用語は、定義が異なる場合がありますがAWSやAzureなどのクラウドでも登場します。以下がIBM Cloud特有の用語です。
### VSI(Virtual Server Instance)
* 仮想サーバー・インスタンスと呼ばれています。

### アプリケーション・ロード・バランサー
* レイヤー7対応のロード・バランサーです。
* 詳細は「[VPC のロード・バランサーの概要](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-vs-elb&locale=ja)」で説明されています。

### 浮動IP
* インターネットからVSIやロード・バランサーへの接続が必要な時にアタッチ可能な、パブリックにアクセス可能なグローバルIPアドレスです。
* 構成図の下部にある緑色の矢印のアイコンが浮動IPを表しています。
* 詳細は「[仮想サーバー・インスタンスの外部接続のために浮動 IP アドレスを使用する](https://cloud.ibm.com/docs/vpc?topic=vpc-about-networking-for-vpc#floating-ip-for-external-connectivity)」で説明されています。

# 構築にあたっての準備
1. [パラメーター・シート](#パラメーターシート)の内容を確認します。IBM Cloudコンソールでサービス注文に必要な情報です。
2. [IBM Cloudコンソール](https://cloud.ibm.com)にアクセスし、ログインできることを確認します。
3. 構築作業するパラメーター・シートと同じことを確認します。IBM Cloudコンソール上部の「管理」の右側にアカウント番号が表示されます。以下の画像で赤枠で示した部分です。複数のアカウントが割り当てられている場合、アカウントを切り替えてパラメーター・シートと同じに設定します。
![account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/3654a216-0bb6-b4a5-e348-3a3db9fc2761.png)

準備が完了したら、以下の[構築ステップ](#構築ステップ)に進みます。

#### 前提についての注記:
構築ステップを簡潔に分かりやすく説明するため、以下の前提についての詳細を割愛しています。各自の状況に合わせてセットアップします。

* ドメイン
    * ドメイン取得サービスで、ドメイン登録とDNSレコード設定を行います。
    * IBM Cloudでもドメイン登録とDNSレコード設定が可能なサービスを提供しています。
* SSL証明書
    * 構築ステップ「6.ロード・バランサーの作成と動作確認」で使用するためのSSL証明書をIBM Cloud Certificate Managerで利用できるよう準備します。以下のどちらかの方法を実施します。
        * SSL認証局で証明書を取得して、IBM Cloud Certificate Managerへインポート
        * IBM Cloud Certificate Managerを利用してLet's Encryptの証明書を取得

ちなみに、この記事の執筆時にはIBM Cloudのドメイン・ネーム登録サービスを利用し、IBM Cloud Certificate Managerを利用してLet's Encryptの証明書を取得しました。

# パラメーター・シート
構築に必要なパラメーターを列挙します。

* 構築してみたときのパラメーターが代入されています。環境に合わせて値を変えて構築します。
* 特に記述の無いパラメーターは、デフォルトを使用しています。

### IBM Cloud
|リソース  |値  |説明  |
|---|---|---|
|アカウント|(利用中のアカウント)|構築に利用するアカウントであることを確認します|
|リソース・グループ|simpleWeb|アカウント管理者が払い出したリソース・グループを利用します|
|リージョン|東京||

### VPC
|リソース|値|説明|
|---|---|---|
|VPC|名前: vpc1||
|webサーバー用サブネット1|名前: subnet1<br>ロケーション: 東京1||
|webサーバー用サブネット2|名前: subnet2<br>ロケーション: 東京2||
|bastion用サブネット3|名前: subnet3<br>ロケーション: 東京3||
|SSHキー|名前: ssh-key-simpleweb|サーバー作成時に利用するSSHキー|

### VSI
|リソース|値|説明|
|---|---|---|
|webサーバー1|名前: web1<br>サブネット: subnet1||
|webサーバー2|名前: web2<br>サブネット: subnet2||
|bastion|名前: bastion<br>サブネット: subnet3||

VSIのスペック

|リソース|値|説明|
|---|---|---|
|仮想サーバーのタイプ|パブリック||
|オペレーティング・システム|Ubuntu Linux 20.04 LTS||
|プロファイル|Balanced &#124; bx2-2x8||
|SSHキー|ssh-key-simpleweb||
|ブート・ボリューム|(デフォルトを使用)||
|データ・ボリューム|(デフォルトを使用)||
|仮想プライベート・クラウド|(作成したVPC)||
|ネットワーク・インタフェース|eth0||

### 浮動IP
|リソース|値|説明|
|---|---|---|
|浮動IP|名前: fip-bastion|bastion用のIPアドレス|

### セキュリティー・グループ
* ロード・バランサー用セキュリティー・グループ

| リソース | 値 | 説明 |
|---|---|---|
| 名前 | security-group-lb |   |
| インバウンド・ルール1 | プロトコル: TCP<br>ポート: ポート範囲<br>ポート最小値: 443<br>ポート最大値: 443<br>ソースタイプ: すべて |   |
| アウトバウンド・ルール1 | プロトコル: TCP<br>ポート: すべて<br>ソースタイプ: すべて |   |

* webサーバー用セキュリティー・グループ

| リソース | 値 | 説明 |
|---|---|---|
| 名前 | security-group-web |   |
| インバウンド・ルール1 | プロトコル: TCP<br>ポート: ポート範囲<br>ポート最小値: 80<br>ポート最大値: 80<br>ソースタイプ: すべて |   |
|インターフェース|web1 - eth0<br>web2 - eth0||

### ロード・バランサー

| リソース | 値 | 説明 |
|---|---|---|
| 名前 | lb1 |   |
|ロード・バランサー|アプリケーション・ロード・バランサー||
|タイプ|パブリック||
|サブネット|subnet1<br>subnet2|2つともチェックを入れます|
|プール|名前: pool1|webサーバー1とwebサーバー2をメンバーとして追加します|
|フロントエンド・リスナー|プロトコル: HTTPS<br>Proxy Protocol: チェックしない<br>ポート: 443<br>バックエンド・プール: pool1<br>最大接続数: (入力しない)<br>SSL Region:(事前準備したリージョン)<br>SSL証明書: (事前準備したSSL証明書)|SSL証明書がIBM CloudのCertificate Managerに入っていることが前提|
|ホスト名|www|
|ドメイン名|(事前準備したドメイン名)|


# 構築ステップ
以下に構築のステップを示します。各ステップが個別のQiitaの記事として書かれています。
1. [VPC作成](https://qiita.com/kenichit/items/73c2e356a14a7a5ab8da)
2. [サブネット追加](https://qiita.com/kenichit/items/2971f9da1542c2efde80)
3. [仮想サーバー・インスタンス作成](https://qiita.com/kenichit/items/2a071bf70aef2a2f0683)
4. [浮動IP取得とバインド](https://qiita.com/kenichit/items/63003852c4424d4c024d)
5. [セキュリティー・グループ作成](https://qiita.com/kenichit/items/9624e7b93322f5d33b3a)
6. [ロード・バランサー作成と動作確認](https://qiita.com/kenichit/items/abed2a73cd567392f431)
#### UI変更について補足(2022/6/20)
IBM CloudコンソールUIが変更されています。2022/6/20時点でのUIに対応したステップを補足記事として掲載しました。以下に構築ステップを示します。
1. [VPC作成(2022年版)](https://qiita.com/kenichit/items/aa63cedf7f0a0aee71a1)
    * 従来の[1.VPC作成](https://qiita.com/kenichit/items/73c2e356a14a7a5ab8da)と[2.仮想サーバー・インスタンス作成](https://qiita.com/kenichit/items/2a071bf70aef2a2f0683)に相当するステップが含まれています。
2. (上記ステップに統合されたため、ステップ2を欠番とします)
3. [仮想サーバー・インスタンス作成(2022年版)](https://qiita.com/kenichit/items/6384aab1a17cddcf41b0) 
4. [浮動IP取得とバインド](https://qiita.com/kenichit/items/63003852c4424d4c024d)
5. [セキュリティー・グループ作成](https://qiita.com/kenichit/items/9624e7b93322f5d33b3a)
6. [ロード・バランサー作成と動作確認(2022年版)](https://qiita.com/kenichit/items/4633974e3ec2a4015df8)