EC2、RDSによるアプリケーションサーバー環境構築

#概要
忘れないように、EC2、RDSによるサーバー環境構築の手順をアウトプット。下記の構成にする。
![AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/5b11d0f9-5060-17e7-9d3b-0aa465470e67.png)


#VPC（Virtual Private Cloud）の作成
VPCは仮想的なネットワークで、大きな箱のイメージ。後々、この中にEC2やRDSインスタンスを配置。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/3bdc9dc6-b13d-f8c3-1f1c-728acc1dffa3.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/b5d28641-e011-155d-9c06-9dff5c31e7c4.png" width=70%>


#IGWの作成とアタッチ
インターネットの玄関口をVPCにアタッチ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/c9e2649d-13c9-65a6-5fbb-88e680b67d55.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/ba7e4a8a-0a72-5ad4-2bbd-68ae15f84f68.png" width=70%>


#サブネットの作成
##用途別（EC2・RDS）サブネットの作成
VPCは大きな箱であるのに対し、サブネットはその中にある小さい箱のイメージ。今回は下記のサブネットを作成。
今回、シングルAZ配置としてRDSインスタンスは1つのみ作成。しかし、なぜか2つの異なったサブネット（しかも異なったAZのもの）が後のRDSの設定で必要になる（マルチAZ配置を見据えた構成？）。

※：Availability Zone：データセンター群

+ WEBサーバー用（Publicになる予定）:AZ→ap-notrheast-a
+ RDS用①（Privateになる予定）：AZ→ap-notrheast-a
+ RDS用②（Privateになる予定）：AZ→ap-notrheast-c

※PublicかPrivateは↓のルートテーブルで設定。
![サブネットserver用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/c60d1c37-7682-4c28-84c7-a64e1b8169af.png)
![サブネットDB１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/d3b13025-1ef9-5d69-da92-28629c4e1148.png)
※DB用の2つ目のサブネットはスクショ省略。

##ルートテーブル（サブネット毎の通信先）の作成

+ rtbはサブネット毎にどこに通信ができるかを定めたもの。
+ VPC→サブネットを作ったらルートテーブルが自動でできる。今回自動作成されたルートテーブルには合計3つのサブネットが割り当てられている。
+ IGWがrtbに関連づけられていないので、このままではすべてPrivateサブネットになる（上の画像）。
+ そのため、EC2用にrtbを新たに作成。IGWをルートに追加する。これでEC2用サブネットはPublicサブネットになる（下の画像）。
![rtb-private.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/5acf7946-afa7-7f77-2282-96e14b478ef9.png)
![rtb-public.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/7bf27b03-35e3-a425-5804-2f66a43ca82e.png)


##セキュリティグループの作成
 + EC2やRDSインスタンスに発信、着信の許可リスト（通信方法やポート番号など）を設定する。
 + webサーバー用インバウンドルール：SSH（ポート範囲22）、HTTP（80）、HTTPS（443）を許可
 + RDS用インバウンドルール：MySQL（ポート番号3306）を許可、ソースはWebサーバー用のセキュリティグループIDを選択
 + アウトバウンドは全てのトラフィックを許可
 ![セキュリティグループ：サーバー用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/78c92f6e-9442-8742-49df-c29368ad98d0.png)
![セキュリティグループ：DB用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/b81b6e62-2e50-fccd-100a-4b68172d27e9.png)
※webサーバーのスクショではTomcatのために8080ポートも許可してある。

 

#サーバー用EC2インスタンスの作成
##ssh接続に必要なキーペアの作成
ローカルの任意の場所に保存しておく。自分のPCからsshでEC2インスタンスに接続するのに必要。

##EC2インスタンスの作成（詳細）

+ AmazonLinux2
+ t2.micro
+ 作成したEC2用のセキュリティグループを設定
+ あとは適当

##ElasticIPの作成と割り当て

+ EC2インスタンスに割り当てられるパブリックIPアドレスは、デフォルトでは動的のため、起動しなおすと値が変わってしまう。
+ そのため、Elastic IPアドレスを設定すると固定のパブリックIPアドレスとすることができる。

今回の場合、EIPを割り当てたEC2が起動中は無料だが、逆にこのEC2を止めるとお金が発生するらしい。。。
https://dev.classmethod.jp/articles/cost-of-eip/

#RDSインスタンスの作成
##RDS用のサブネットグループを作成
VPCの中でどのサブネットたちがDB用なのかを設定する必要があるらしい。設定画面で、作成したVPCと下記のサブネットを選択しグループを作成。
このグループは後のRDSインスタンス作成で必要になる。

+ RDS用①（Private）：AZ→ap-notrheast-a
+ RDS用②（Private）：AZ→ap-notrheast-c

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/20ec79c7-aa4e-956e-1178-d57d1b34a9f3.png" width=70%>


##RDSインスタンス作成（詳細）
・MySQL(8.0.19：自分の場合)
・無料利用枠、マルチAZ配置にしない。
・DB用のサブネットグループを指定
・DB用に作成したセキュリティグループ選択
・作成したVPC選択
・パブリックアクセス可能→なし
・データベースポート：3306
・バックアップ保存期間：1日
・アベイラビリティーゾーン：指定無し（今回はap-northeastのaかcどっちかになるっぽい。指定しても良い）
・ユーザー名、パスワードは忘れないように（接続で必要）。

#EC2へSSHで接続確認
自分のPCのキーペアがあるディレクトリに移動。あとはターミナルでEC2コンソール画面通りにコマンドを実行。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/1e10110f-7b6c-7513-babd-d1344cf4f982.png" width=70%>
![EC2接続その２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/b99d11e9-44bc-a5fc-6010-d43b3111c9b6.png)

#EC2からRDSインスタンスへ接続確認
##EC2へMySQLをインストール
[こちらの記事](https://qiita.com/2no553/items/952dbb8df9a228195189#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)の「インストール」の項目を参考にさせていただきました（こちらの記事はMySQL5.7ですが、今回は8.0なので適宜読み替え）。インストール、自動起動設定まで終わらせておく。
AmazonLinux2に標準で入っているmariaDBは自動でMySQLと入れ替わるとのこと。
> 
```#mysqlがインストールできるか確認
$ yum info mysql
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
エラー: 表示するパッケージはありません

> #mysql8.0リポジトリの追加（このリポジトリに5.7も含まれています）
> $ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y

> #mysqlインストール
> $ sudo yum install mysql-community-server -y
> $ mysqld --version
> mysqld  Ver 5.7.22 for Linux on x86_64 (MySQL Community Server (GPL))

> #自動起動設定
> $ sudo systemctl start mysqld.service
> $ sudo systemctl enable mysqld.service
> $ systemctl status mysqld.service
```

##接続確認
```mysql -h {RDSのエンドポイント} -P 3306 -u {RDSインスタンスのユーザー名} -p```
設定したパスワードを入力。
![スクリーンショット 2020-09-03 13.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/b7a970eb-5d98-207a-1d9e-3668ab092fb9.png)

#参考
大きな流れはこちらを参考にさせていただきました。ありがとうございました。
https://tech.recruit-mp.co.jp/infrastructure/retry-aws-minimum-vpc-server-environment/