概要
今回は前回の続きで、ECS Fargateへとデプロイを行う本番環境編となっています。
前回の記事:
DockerでRails環境(Nginx+Unicorn+MySQL)を構築してFargateへデプロイするまで〜開発環境編〜
設定手順
1. VPC周りの構築
2. RDSの構築
3. ECRリポジトリの構築
4. ECSの構築
5. アプリのデプロイ
1. VPC周りの構築
VPC
| key | value |
|---|---|
| 名前 | three-mouth-vpc |
| IPv4 CIDR | 10.0.0.0/16 |
サブネット
サブネットはECS用のパブリックサブネットと、RDS用のプライベートサブネットをそれぞれ二つずつ作成します。
画像は一つのみの作成ですが、「新しいサブネットを追加」から追加で作成することができます。
| key | value |
|---|---|
| パブリックサブネット① | three-mouth-PublicSubnet-1a |
| アベイラビリティーゾーン | ap-northeast-1a |
| IPv4 CIDR | 10.0.10.0/24 |
| key | value |
|---|---|
| パブリックサブネット② | three-mouth-PublicSubnet-1c |
| アベイラビリティーゾーン | ap-northeast-1c |
| IPv4 CIDR | 10.0.11.0/24 |
| key | value |
|---|---|
| プライベートサブネット① | three-mouth-PrivateSubnet-1a |
| アベイラビリティーゾーン | ap-northeast-1a |
| IPv4 CIDR | 10.0.20.0/24 |
| key | value |
|---|---|
| プライベートサブネット② | three-mouth-PrivateSubnet-1c |
| アベイラビリティーゾーン | ap-northeast-1c |
| IPv4 CIDR | 10.0.21.0/24 |
ルートテーブル
まずはルートテーブルの作成をします。
| key | value |
|---|---|
| VPC ID | three-mouth-vpc |
| 名前 | three-mouth-route-table |
ルートテーブルの作成が完了したら、次にルートの編集を行います。
| key | value |
|---|---|
| 送信先 | 0.0.0.0/0 |
| ターゲット | インターネットゲートウェイ |
ルートの編集が完了したら、最後にサブネットの関連づけを行います。
先ほど作成したサブネットのうち、パブリックサブネットを選択し、関連づけを保存します。


セキュリティグループ
■ ECSのセキュリティグループ
| key | value |
|---|---|
| セキュリティグループ名 | three-mouth-SG-ECS |
| 説明 | Define of SG for ECS |
| VPC | three-mouth-vpc |
| インバウンドルール① | タイプ:HTTP ソース:0.0.0.0/0 |
| インバウンドルール② | タイプ:HTTPS ソース:0.0.0.0/0 |
■ RDSのセキュリティグループ
| key | value |
|---|---|
| セキュリティグループ名 | three-mouth-SG-RDS |
| 説明 | Define of SG for RDS |
| VPC | three-mouth-vpc |
| インバウンドルール | タイプ:MYSQL/Aurora ソース:three-mouth-SG-ECS |
2. RDSの構築
DBサブネットグループの作成
| key | value |
|---|---|
| 名前 | three-mouth-subnet-group |
| 説明 | subnet-group(適当) |
| vpc | three-mouth-vpc |
| アベイラビリティーゾーン | ap-northeast-1a ap-northeast-1c |
| サブネット | 10.0.20.0/24 10.0.21.0/24 |
RDSの作成
| key | value |
|---|---|
| データベース作成方法 | 標準作成 |
| エンジン | MySQL8.0.28 |
| key | value |
|---|---|
| テンプレート | 無料利用枠 |
| 項目 | 値 |
|---|---|
| DBインスタンス識別子 | three-mouth-mysql |
| マスターユーザー名 | admin |
| マスターパスワード | password |
| key | value |
|---|---|
| インスタンスクラス | db.t3micro |
| ストレージタイプ | 汎用SSD(gp2) |
| ストレージ割り当て | 20 |
| 最大ストレージしきい値 | 1000 |
こちらは無料利用枠を指定するとデフォルトで入力されるため、特に修正する必要はありません。
| key | value |
|---|---|
| VPC | three-mouth-vpc |
| DB サブネットグループ | three-mouth-subnet-group |
| セキュリティグループ | three-mouth-SG-RDS |

他の項目については、デフォルトでOKです。入力が完了したら、データベースを作成します。RDSが作成できたらエンドポイントを確認し、メモしておきます(ECS構築時に使用)。

3. ECRリポジトリの構築
| key | value |
|---|---|
| リポジトリ名(rails用) | myapp-miguchi-rails |
| リポジトリ名(nginx用) | myapp-miguchi-nginx |


作成ができたらそれぞれのURIをコピーし、メモしておきます。
こちらもECS構築時に用います。

4. ECSの構築
タスク定義
タスク定義ではコンテナの数やリソース、コンテナ同士のリンク方法などを定義します。
それでは作成していきましょう。
まずは起動タイプを選択します。
今回はFargateを使用するので、以下の画面で選択し、次のステップへ進みます。

次にタスクの定義を行なっていきます。
| key | value |
|---|---|
| タスク定義名 | myapp-miguchi |
| タスクロール | ecsTaskEcecutionRole |
| ネットワークモード | awsvpc |
| オペレーティングシステムファミリー | Linux |
| key | value |
|---|---|
| タスク実行ロール | ecsTaskEcecutionRole |
| タスクメモリ | 0.5GB |
| タスクCPU | 0.25vCPU |

タスクの定義が完了したら、次はコンテナの定義です。
Rails用のコンテナとnginx用のコンテナの定義をしていきます。
同じ設定画面の「コンテナの定義」から「コンテナの追加」をクリックします。

| key | value |
|---|---|
| コンテナ名 | rails |
| イメージ | ECR作成時にメモしたURI:latest |
| ポートマッピング | 3000 |
| key | value |
|---|---|
| DB_DATABASE | three-mouth-mysql |
| DB_HOST | RDSのエンドポイント |
| DB_PASSWORD | password |
| DB_USERNAME | admin |
| RAILS_ENV | production |
| key | value |
|---|---|
| コンテナ名 | nginx |
| イメージ | ECR作成時にメモしたURI:latest |
| ポートマッピング | 80 |
クラスターの作成
5. アプリのデプロイ
Docker Imageのプッシュ
いよいよ、アプリのデプロイです。AWSコンソールにてECRを開きます。Nginx用のリポジトリを選択し、プッシュコマンドの表示を選択します。

terminalで以下の4つのコマンドを実行し、DockerのイメージをECRにプッシュします。

コマンド実行が完了したら、イメージがプッシュされているか、コンソール上で確認します。
確認が完了したら、rails用のリポジトリでも同様の操作を行います。

正直作成をしなくてもよいのですが、私は以下のような本番用docker-composeを作成しました。少しだけデプロイが楽になります(プッシュコマンドの2を実行)。
cd ~/Desktop
touch docker-compose.prd.yml
version: '3'
services:
web:
build:
context: .
image: myapp-miguchi-rails
nginx:
build:
context: ./nginx
image: myapp-miguchi-nginx
docker-compose -f docker-compose.prd.yml build
ECSデプロイ
Docker Imageのプッシュが完了したら、次はECSのサービスを作成していきます。
AWSコンソールにてECSを開きます。先ほど作成したクラスターを選択し、[サービス]にて[作成]をクリックします。

サービスの設定画面ステップ1が表示されるので、以下の項目を入力します。
以下の項目以外の入力欄はデフォルトでOKです。入力が完了したら、次のステップ2に進みます。
| key | value |
|---|---|
| 起動タイプ | FARGATE |
| サービス名 | myapp-miguchi(適当) |
| タスクの数 | 1 |

続いて、以下の項目を入力します。入力が完了したら、次のステップ3に進みます。
| key | value |
|---|---|
| クラスター VPC | three-mouth-vpc |
| サブネット | three-mouth-PublicSubnet-1a three-mouth-PublicSubnet-1c |
| セキュリティグループ | three-mouth-SG-ECS |

ステップ3、4では情報の入力はないため、設定の確認ができたら作成します。
作成後は、サービスで確認できます。

サービスと同時にタスクも作成されます。
タスクをクリックし、パブリックIPを確認できたら、アクセスしてみます。


しっかり表示されることが確認できました。

CRUD処理もしっかりできていますね。

今回はこれで以上です。
終わりに
CICDを作成するかも?!


















