RDSとEC2から成るシンプルなVPSを作ってみる

長く書いているが，以下のチュートリアルをなぞっただけ．
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/TUT_WebAppWithRDS.html

## 1. VPCのネットワーク設定を構築する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html#CHAP_Tutorials.WebServerDB.CreateVPC.SecurityGroupDB

EC2はパブリックサブネット，RDSのインスタンスはプライベートサブネットに置く構成となる．

### 手順
- AWSマネジメントコンソールにアクセスし，VPCサービスを選ぶ．
- 「パブリックとプライベート サブネットを持つ VPC」を選択する．
- ネットワークの設定を入力する．基本的にチュートリアルに書いてあるとおりにした．
    - 今回は東京リージョンを使っているのでAZもそこのやつから適当に選択．
    - NATインスタンスのインスタンスタイプはt2.nanoとした．
- 右下の「VPCの作成」を押すと，色々作成される．

## 2. 要らん課金要素を消す
※これ自体が要らん操作かもしれませんが，念のため．

上記対応では，勝手にNATインスタンスが作成されるが，要らんはずなので消しておく.

### 手順
- 再びVPCサービスにアクセスし，左のメニューから「サブネット」を選択する．
- 先ほど作ったプライベートサブネットを選択し，「ルートテーブル」タブを選ぶ．「0.0.0.0/0」の転送先に謎のリンクが記述されている（図1）．
- リンクを押下すると，ネットワークインターフェースのページに飛ぶ．色々書いているが，たぶん「このインスタンスが，このIPアドレスを使ってNATします」という意味になる（図2）．
- インスタンスのリンクを押すと，EC2インスタンスのページに飛ぶので，「アクション」から「インスタンスの状態->終了」を選択する．
- 「Elastic IP の解放」のチェックボックスを選択しつつ，「はい，削除する」を選択する．
- 完了すると，以下のステータスになっているはず．放置しても大丈夫な気がするが一応消していく．
    - NATインスタンスの「インスタンスの状態」が「terminated」（時間が経つと消える）
    - ルートテーブルのVPC以外の通信の「ステータス」が「blackhole」

![190916_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/9e4d483c-603a-546b-2df0-e36681ac2c66.png)
図1. ルートテーブルの記述

![190916_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/88cebcbc-7214-7481-2626-d445743c0ac0.png)
図2. ネットワークインターフェースの記述

## 3. サブネットを追加する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html#CHAP_Tutorials.WebServerDB.CreateVPC.AdditionalSubnets

RDSを活用するためには，別のAZ内にもう1つプライベートサブネットが必要とのことなので，作る．

### 手順
- VPCサービスの左のメニューから「サブネット」を選択する．
- 「サブネットを作る」を選択する．基本上記そのまんまで設定．
    - ルートテーブルは最初から1つ目のそれと同じものがセットされていたので特にいじっていない．

## 4. セキュリティグループを作成する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html#CHAP_Tutorials.WebServerDB.CreateVPC.SecurityGroupEC2
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html#CHAP_Tutorials.WebServerDB.CreateVPC.SecurityGroupDB

### 手順
- VPCサービスの左のメニューから「セキュリティグループ」を選択する．
- 「セキュリティグループの作成」ボタンを押して．パラメータはVPC以外適当で，「作成」を押す．
- 再び「セキュリティグループ」に戻り，先ほど作ったグループを選択して，「インバウンドのルール」タブを選ぶ．
- EC2に対し，自端末からのSSHと，インターネット（不特定多数）からのHTTP接続を許可する（図3）．
    - SSHするIPは，プロバイダや契約内容に依存するので自分で調べてください．
- 同じ要領で，今度はRDS用のセキュリティグループを作成し，インバウンドルールを編集する（図4）．
    - インバウンドのソースは，EC2のセキュリティグループIDを使用する．

![190916_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/a0a281a9-14e3-66b0-4e65-a11907752399.png)
図3. EC2用のインバウンド設定

![190916_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/d902958b-d57b-c446-8f48-638988c5d528.png)
図4. RDS用のインバウンド設定

## 5. RDS用のサブネットグループを作成する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html#CHAP_Tutorials.WebServerDB.CreateVPC.DBSubnetGroup

DB作成時に必要になるそうなので設定しておく．

### 手順
- **RDS**のサービスにアクセスし，左のメニューの「サブネットグループ」を選択する．
- 「DBサブネットグループの作成」ボタンを押し，サブネットの設定を行う．
    - 今回だと「10.0.1.0/24」と「10.0.2.0/24」の2つを追加することになると思う．
- 「作成」ボタンを押す．

## 6. DBインスタンスを作成する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateDBInstance.html

ここでようやくDBを作る．今回はMySQLの無料枠を利用する．

### 手順
- RDSのサービスにアクセスし，上部の「データベースの作成」ボタンを押す．
- 基本はデフォルトのとおりだが，以下を変えている．
    - エンジンのタイプ：MySQL
    - テンプレート：無料利用枠
    - パスワードの自動生成：チェック
    - Virtual Private Cloud (VPC)：ここまでに作ったVPC
    - 既存の VPC セキュリティグループ：ここまでに作ったDB用のセキュリティグループ
- 「作成」ボタンを押し，しばし放置すると，インスタンスが作成される．
    - 「パスワードを自動生成」にしていた場合は，「認証情報の詳細を表示」ボタンを押し，忘れずにメモしておく．

## 7. EC2インスタンスを作成する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateWebServer.html

MySQLへのアクセス元（およびインターネットからのアクセス先）を用意する．

### 手順
- EC2のサービスにアクセスし，左のメニューの「インスタンス」を選択する．
- 「インスタンスの作成」ボタンを押す．
- 「Ubuntu Server 18.04 LTS (HVM), SSD Volume Type」のマシンイメージを選んで「選択」ボタンを押す．
    - 少なくとも今時点では年間無料枠．
    - チュートリアルを無視しているが，「たぶん大丈夫やろ」の精神で選択．
- t2.micro（無料枠）になっていることを確認して，「次の手順：インスタンスの詳細の設定」ボタンを押す．
- 以下の設定を変更して，「次の手順：ストレージの追加」ボタンを押す．
    - ネットワーク：ここまでに作ったVPC
    - サブネット：ここまでに作った**パブリック**サブネット
    - 自動割り当てパブリック IP：有効
- 特にイジらず，「次の手順：タグの追加」ボタンを押す．
- チュートリアルのとおりに1つだけタグを追加して「次の手順：セキュリティグループの設定」ボタンを押す．
- 「既存のセキュリティグループを選択する」から，ec2用のセキュリティグループを選択し，「確認と作成」ボタンを押す．
- 問題がなければ「起動」ボタンを押す．

## 8. 動作確認
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateWebServer.html

作成した2つのインスタンスの疎通確認．勝手にUbuntu18.04を選んだので細々と手順アレンジが必要．

### 手順
- ec2インスタンスにsshで接続する．
- `sudo apt-get update`および`sudo apt-get install -y apache2`を実行．
  - `apache2 -version`で確認したところ，バージョンは「2.4.29」．
- `sudo service apache2 start`でサーバを起動し，ブラウザから`http://<EC2のパブリックDNS>`でアクセスして確認．
    - これでec2サーバへのhttpおよび（この操作をしている時点で当然だが）sshプロトコルの疎通が完了．
- php関連は，[こちらの手順](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3532)を参照しつつ，`PHP7.3`および`php7.3-mysql`をインストール．
    - `php --version`で確認したところ，バージョンは「7.3.9」．
- 検証用ページの作成手順については完全にリファレンスどおりなので省略．図5のようなページがアクセスできた．
    - 最初何も表示されなくて焦ったが，`sudo service apache2 restart`したところ期待通りに表示された．
    - 図は省略するが，保存処理も問題なく実行できることを確認．
    - これでec2からmysqlサーバへの接続の疎通が完了，一通りのチェックがOKになる．

![190916_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/4142f220-276d-3ebc-e3d4-c8999392613f.png)
図5. 検証用ページ