第1回　AWSに自動でテスト/デプロイしてくれるインフラの設定・構築（AWS構築）

# 本シリーズ集
|  | タイトル |
|:-:|:-:|
| 0 | [目標・やりたいこと](https://qiita.com/drafts/c59c0df9eaf5e6b10111/edit) |
| 1 | ___AWS編___|
| 2 | [rails開発環境構築編](https://qiita.com/Dadadada-TT/items/f4ce8d997cc0bb3e0aca)|
| 3 | [Nginx・MySQL編](https://qiita.com/Dadadada-TT/items/4a7edd61a5d7c75f772d) |
| 4 | [Capistrano編](https://qiita.com/Dadadada-TT/items/79e33659eacda1cd0510) |
| 5 | [CircleCI編](https://qiita.com/Dadadada-TT/items/a9530630782c6f4c7cbc) |
| 6 | [総集編](https://qiita.com/Dadadada-TT/items/3d1fa7854d562ae1db1b) |

#AWSとは
　本記事では、AWSの __EC2（Elastic Compute Cloud）__、 __VPC（Virtual Private Cloud）__を使用して、サーバを構築していく。

　今回は、__VPC__ を構築し、その中に__サブネット__を構築。そして、そのサブネットの中に、__EC2__を使用して、Webサーバ、APサーバ、DBサーバを立てていく。

　ちなみに、AWSには、コンテナ用のサービス__ECS（Elastic Container Service）__や、RDB用のサービス__RDS（Relational Database Service）__もあるが、今回は使わず、全部EC2とDockerで済ます。（追々、__ECS__の使い方も学んでいきたいと思ってます）

# 参考サイト・記事・書籍
　参考サイト・書籍は以下。（書籍（AmazonWebServices〜）は執筆時点ではKindle Unlimited登録者は__無料__）
　
・（サイト）[(下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
・（書籍）[Amazon Web Services 基礎からのネットワーク＆サーバー構築](https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=aws+%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE&qid=1605325668&sr=8-1)

・（書籍）[AWSをはじめよう](https://booth.pm/ja/items/1032590)

##1. VPC構築
　__VPC（Virtual Private Cloud）__は、自前で構築できる仮想的なLANのようなもの。
　この章では、VPCの作成方法を示していく

1. AWSのサービスの（検索でも可能）VPCページにいく。
2. 左側に表示されるサイドバーの『VPC』をクリック
3. [VPCを作成]をクリック
4. [名前タグ] に好きな名前を。
　[IPv4CIDRブロック]には、『__10.0.0.0/16__』と入力
　[IPv6 CIDR ブロック]は『__なし__』
　[テナンシー]・[タグ]はデフォルトのままでOK
![スクリーンショット 2020-11-16 13.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/793fc0df-4a49-cb53-947f-6b74254f0348.png)
5. [VPCの作成]をクリック

 ->作成完了
続いて、__サブネットを構築__していく

##2. サブネット構築
1. ページはそのままで、サイドバーの[サブネット]をクリック
2. 表示された画面で[サブネットを作成]をクリック
3. [VPC ID]に、先程作成したVPCを紐付ける。
4. また、その下のサブネットの設定画面では、
　[サブネット名]に『__パブリックサブネット__』
　[アベイラビリティゾーン]に__任意の設定（覚えておく必要あり）__を
　[IPv4 CIDR ブロック] に 『__10.0.1.0/24__』
を入力
![スクリーンショット 2020-11-25 13.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/c0ce55c8-f698-b0be-9f17-d571429406f6.png)
5. [サブネットを作成]をクリック

-> サブネット作成終了

##3. ルートテーブル作成

　そのままの画面で、ルートテーブルを作成していく。

1. サイドバーの__[ルートテーブル]__をクリック。
2. 開かれる画面で__[ルートテーブルの作成]__をクリック。

3. __[名前タグ]__ に、__任意の名前__を入れ、
　__[VPC]__ に、先程作成したVPCを選択し、
　__[作成]__ をクリックして作成完了
![スクリーンショット 2020-11-25 13.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/b4b6dff7-d866-028a-30c2-55d999a34cf6.png)

##4. インターネットゲートウェイの作成
　そのまま作成したルートテーブルを編集する...前に、
__『インターネットゲートウェイの作成』__をする。
　これをしないと、サブネット内がインターネット上で通信できないままになってしまう。

1. サイドバーの__[インターネットゲートウェイ]__をクリック
2. 表示される画面で、__[インターネットゲートウェイの作成]__をクリック
3. __[名前タグ]__ に任意の名前をつけて、__[インターネットゲートウェイの作成]__をクリックして終了。


##5. ルートテーブル更新
1. インターネットゲートウェイ作成後、また、__[ルートテーブル]__画面に戻る。
2. ルートテーブル一覧で、__『先程作成したルートテーブル』__のチェックボックスにチェックを入れると、下側に__『概要』__、__『ルート』__等が表示されるので、その__『ルート』__タブをクリックしたら表示される__[ルートの編集]__をクリックする。

3. ルーティングテーブルの編集ができる画面が表示されるので、__[送信先]__に__『0.0.0.0/0』__、__[ターゲット]__に、__Internet Gateway（igw-xxxx）__ を選択する。![スクリーンショット 2020-11-25 14.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/6d91c5cc-0246-0d64-8990-c99b1a9c687c.png)

4. __[ルートの保存]__ をクリック。

-> ルートテーブル編集終了。

あとは、元のルートテーブル一覧の表示画面に戻るので、__[サブネットの関連づけ]__ から、作成したサブネット（筆者は__パブリックサブネット__）に関連づければ、OK。



#WEBサーバ用EC2インスタンス作成方法
###EC2とは
　__EC2__は、一言で言うと、『仮想サーバ構築サービス』
　イメージとしては、『__自分でサーバを立ててその中で好き勝手動かせますよー__』て感じなやつ。
　AWSでは、EC2の一つ一つを『インスタンス』と呼ぶ。（他のCloudサービスはどうか知らんけど）

1. サービスの__EC2__から__EC2の画面__へ行く
2. サイドバーの__[インスタンス]__をクリック
3. 表示された画面で、__[インスタンスを起動]__をクリック
4. __`Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-`を選択__
5. __[t2.micro]__（デフォルトで選択されている）を選択し、__[次のステップ:インスタンスの詳細の設定]__をクリック

6. 遷移先の画面では、インスタンスの詳細設定を行う画面が表示されるので、
　__[ネットワーク]__に、先程作成したVPCを、
　__[サブネット]__に、先程作成した『パブリックサブネット』を、
　__[自動割り当てパブリックIP]__ は、『有効』を
各々セットし、その他はデフォルトのままでOK。![スクリーンショット 2020-11-16 13.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/7904db87-abf8-b159-d39a-f85a36b979b3.png)
　全て設定終わったら、__[次のステップ:ストレージの追加]__をクリック

7. __『ストレージの追加』画面__ では、AMIに設定するサイズ等が選択できるが、ここは好みで（30GiBまでは無料）。
8. __『(※)セキュリティグループの設定』画面__ に遷移すると、セキュリティグループを設定する画面が出てくるので、
　__[新しいセキュリティグループを作成する]__にチェックをつけ、
　__[セキュリティグループ名]__に、『WEB-SG』と名付け、その内容は、全てのSSH、HTTPを通すように設定する。
![スクリーンショット 2020-11-16 14.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/60936b06-23f8-c911-d068-57ef1825a195.png)
9. __[確認と作成]__をクリック（もしかすると、セキュリティが甘い等の警告が出るかもしれないので、出たら無視してそのまま__[起動]__をクリック）すると、モーダルが開かれる（下図）ので、そこで
__[新しいキーペアの作成]__を選択し、キーペア名に任意の名前をつけて__[インスタンスの作成]__をクリック
![スクリーンショット 2020-11-25 13.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/cc543398-12df-6912-fe2e-daca03ea7c56.png)


-> インスタンス作成完了。

※ セキュリティグループ... ファイアウォールのような設定を行えるサービス。複数インスタンスに紐づけることができる。

# EC2インスタンスへのアクセス方法
　ローカルのPCからターミナルでEC2インスタンスへアクセスする方法を示す。
　まず、EC2インスタンスの__パブリックIP__を確認する。
　確認方法は、EC2インスタンスの対象インスタンスにチェックマークをつけた際に表示される__『詳細』__タブに表示される__『パブリックIPv4アドレス』__の欄を確認する。

![スクリーンショット 2020-11-16 14.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557656/e61e7a93-5e52-a7fa-6375-254e80564157.png)

　次に `chown`コマンドを使用してEC2インスタンス作成時にダウンロードした鍵の権限を変更する。

```
$ chmod 400 【鍵のPATH】
```

　これで（最低でも）__作成者のみ__ 読み取りできるようにしておく。そして、

```
$ ssh -i 【鍵のPATH】 ec2-user@【IPアドレス】
```

でAWSにアクセスできるようになる。

## パブリックIPを固定化する
　これで、終了したかと思いきや、AWSには思わぬ落とし穴がある。
　それは、__『インスタンスのパブリックIPは、起動毎に変更されてしまう』__ということである。
　なので、これを固定化するために、__[Elastic IP]__を使用する。
　
####ElasticIPの設定方法
1. EC2サービス画面のサイドバーから、__[Elastic IP]__ をクリックする
2. __[Elastic IP アドレスの割り当て]__をクリックする。
3. 表示される画面で、全て設定はデフォルト（__AmazonのUPv4アドレスプールにチェック__）のまま__[割り当て]__をクリック
4. 画面が切り替わるので、切り替わった先で、__[アクション]__-> __[Elastic IP アドレスの関連付け]__をクリックし、遷移先の画面で、関連付けしたいインスタンスによしなに関連付けする。

　これで、__起動毎に変更することない、不変なIPアドレス__ をインスタンスに割り当てることができた。

この、『EC2作成』->『ElasticIP設定』を__APサーバ__・__DBサーバ__ それぞれにやっていけばOK。


##SSH接続後、EC2インスタンス上でやっておくこと
　1. __docker__ のインストール
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html
　このサイトに則ってコマンドを打っていく。

<details><summary>詳細</summary>
1. `$ sudo yum update -y` コマンドでyum をアップデートする。
2. `$ sudo yum install docker`でdockerをインストール。
3. `$ sudo service docker start` でdockerを起動
　
　現行では、一々`docker`コマンドを呼び出すのに、`sudo`を付けなきゃいけないから、権限を変更する。
4. `$ sudo usermod -a -G docker ec2-user` 
　これで、EC2を一度シャットダウンして再びログインすれば、`docker`コマンドを`sudo`なしで使用できるようになる。
</details>

　2. __docker-compose__ のインストール
　https://qiita.com/kichise/items/f8e56c6d2d08eaf4a6a0
　この記事に従ってdocker-composeをインストールする。
　3. __git__ のインストール（capistranoで使用する）
　　`$ sudo yum install git`　とコマンドを打つ。

# 終わりに
　本来（きちんと世に送り出すもの）であれば、サブネットを __パブリック__・__プライベート__にわけ、
　・『パブリック』に__WEBサーバ__
　・『プライベート』に__APサーバ__・__DBサーバ__（APサーバはおそらく。）
　という分け方をするべきなのだが、NATゲートウェイの設定やらセキュリティグループの設定やらで、~~めんどくさくなったので~~説明が長くなってしまうので、本シリーズの中では全て__パブリックサブネット__に収まる形で構築しました。