RailsをAWS ECS(Fargate)でホストする環境構築のすべて【1. 前談、N/W+α】

## 本記事シリーズの構成
1. 前談、N/W+α（これ）
2. Docker定義、ECRの設定
3. ECSへのデプロイ、SSMでの接続

## 構築環境全体像
こんな感じを目指します。
<img width="989" alt="スクリーンショット 2020-08-11 17.39.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/3e28d2d2-9f73-b3ff-7bc4-f0ded8e72746.png">

実現したいポイント
* Docker環境で開発を行っているRailsプロジェクトを、Fargate起動のECSでホストします。
* ECSタスクは複数設け、負荷分散します。
* AWS System Manager セッションマネージャを使用してECSに「接続し、CUIで操作可能にします。

## ネットワーク＋ALB＋RDSの環境構築

### VPC

サンプルなのでシンプルに作ります。
<img width="1437" alt="スクリーンショット 2020-08-11 18.03.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/ac13bea5-2955-6b54-b33a-dabb4b46c0d4.png">


作成した後、VPC一覧右上のアクション>DNSホスト名の編集から有効化をしておきます。
<img width="1437" alt="スクリーンショット 2020-08-11 18.18.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/33e4437a-a8a3-2168-abd8-82296e3d530d.png">

### サブネット

下記の通り、わかりやすくサブネットを切っておきます。

|subnet|CIDR|
|---|---|
|public-subnet-a|10.0.10.0/24|
|public-subnet-c|10.0.20.0/24|
|public-subnet-d|10.0.30.0/24|

<img width="1437" alt="スクリーンショット 2020-08-11 18.04.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/ce7dd075-7368-43c8-4b62-6942e44d43ed.png">

### インターネットゲートウェイ

<img width="1437" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3433303630332f62343233356531372d633765372d353266352d616636622d3963356164396331336638622e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/9b67e40b-4470-53c9-cbe8-0f768977cb68.png">


作成したら、右上のアクション>VPCにアタッチから、
sample-vpcにアタッチするのを忘れずに。

<img width="863" alt="スクリーンショット 2020-08-11 18.07.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/b978561e-f324-24d1-9b94-b8de01a76120.png">


### エンドポイント

この後設定していくサービスを利用するために、４つのエンドポイントを設けます。

* com.amazonaws.ap-northeast-1.ecr.api
* com.amazonaws.ap-northeast-1.ecr.dkr
* com.amazonaws.ap-northeast-1.s3
* com.amazonaws.ap-northeast-1.ssm

エンドポイントを選択して、
アタッチしたいサブネットはpublic-subnet-a,public-subnet-cの２つのみ指定。
<img width="1437" alt="スクリーンショット 2020-08-11 18.08.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/ada1d05f-75cd-19b5-9091-bc1bcc91fa32.png">

Interfaceタイプのエンドポイントには、セキュリティグループを適用する。
<img width="1437" alt="スクリーンショット 2020-08-11 18.18.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/cee557ef-5838-932a-2a24-f09d2fb70f7c.png">

エンドポイント用のセキュリティグループとして、443ポートを開けたセキュリティグループを作っておきましょう。
<img width="1437" alt="スクリーンショット 2020-08-11 18.17.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/87ae22c8-d33c-8a11-14ab-fc5638d86bfc.png">

S3はGatewayタイプなのでセキュリティグループではなく、ルートテーブルに従います。
<img width="1437" alt="スクリーンショット 2020-08-11 18.20.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/1fa2be1f-7bdd-c11b-60ca-282f31d44ca7.png">

### ルートテーブル

VPC作成時に自動作成されているものを編集します。

ルート一覧に、先ほど追加したエンドポイントの設定が加わっています。
ルートの編集ボタンを押下します。
<img width="1437" alt="スクリーンショット 2020-08-11 19.37.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/955797aa-e8ff-22c9-cebb-d66a8d572b57.png">

ここにインターネットゲートウェイへのルーティングを加えます。
<img width="1437" alt="スクリーンショット 2020-08-11 19.37.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/ff068919-1fb8-d2c4-b5f9-662bcc0b8b0b.png">

編集したルートテーブルにサブネットを関連づけます。
インターネットゲートウェイのルーティングを設定したルートテーブルに、サブネットを関連づけることで、
いわゆるpublic subnetになります。
<img width="1437" alt="スクリーンショット 2020-08-11 18.06.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/9b714fc2-1622-6c0c-c5c1-044add37eae2.png">

public-subnet-a,cはSSMを利用した接続時にパブリックでないとうまくできなかったため、セキュリティグループでIP、ポート制限をかけつつパブリック化する判断にしました。

public-subnet-dはデータベース用に取っていますが、データベースに外部からクライアント接続したいのでパブリックにしています。ここをパブリックにするかどうかは任意です。

---

### ALB

アプリケーションロードバランサーを選択して作成していきます。
<img width="1437" alt="スクリーンショット 2020-08-11 18.12.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/45e67f59-fd47-abb8-0172-291c8f57d1a3.png">

実用するときには、SSL証明書を適用して443ポート開けることになると思いますが、
今回は検証なので、80ポート開けておきます。
<img width="1437" alt="スクリーンショット 2020-08-11 18.13.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/a1e26cca-6985-7683-ed91-e3624ebf84b8.png">

ルーティング先はECSをおくサブネットに絞って設定しています。
<img width="1437" alt="スクリーンショット 2020-08-11 18.13.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/032bd4a4-dae0-547a-b227-b864f452a870.png">

セキュリティグループはここでついでに新規作成しています。
80ポートのインバウンドを設定しています。検証なのでマイIPのみにしたほうがよかったかも。
<img width="1437" alt="スクリーンショット 2020-08-11 18.14.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/8b2bbe4c-e276-37f1-d016-1f170a4a51f7.png">

ターゲットグループをここで一緒に新規作成します。
ターゲットの種類はIPにします。
ヘルスチェックはアプリケーションに用意したヘルスチェック用のパスを指定してください。
<img width="1437" alt="スクリーンショット 2020-08-11 18.14.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/dfb059ca-64af-0275-1b69-cf7dab3ed15e.png">

ここはそのままでOK。
<img width="1437" alt="スクリーンショット 2020-08-11 18.14.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/7d3d0b3d-37f4-f1f5-caff-a86e70fa48df.png">

---

### RDS

作成内容は完全に任意です。
MySQL 8.0.19でインスタンスをパブリックアクセスありで作成しました。
<img width="1437" alt="スクリーンショット 2020-08-11 19.58.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/833fa46e-6fe6-7e11-0642-2286470dad54.png">

このときに適用したセキュリティグループは以下の通りです。
3306ポートをマイIPからのみアクセス可能にしています。
<img width="1437" alt="スクリーンショット 2020-08-11 20.01.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/38541b1d-c495-12f1-278b-29d6e3a7ce00.png">

＜追記＞
訂正です。ECSから当然接続するので、ECSに適用するセキュリティグループも作成して、そこからの3306ポートアクセスを許容するようにしてください！
![スクリーンショット 2020-08-18 19.41.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/d1a01d93-fe63-d8f3-f7e3-b86b5354580b.png)

ECSに適用するセキュリティグループはこんな感じです。
ALBからの80ポートと、VPC endpointからのSSM用に443ポートを開けています。
![スクリーンショット 2020-08-18 21.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/e0c9172a-6e23-6005-c599-4fd3ef1a47e5.png)

## まとめ

ここまででこんな感じの大枠まで作りました。
次の記事で、Dockerの定義と、コンテナイメージをECRにプッシュするまでを記載したいと思います。
<img width="957" alt="スクリーンショット 2020-08-11 20.10.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/c069f4b1-c7fb-f7a6-3c8a-43f23fff7fba.png">

次の記事
https://qiita.com/polar_bear_tech/items/87f5795346d246a1e07c