2
1

More than 1 year has passed since last update.

DockerでRails環境(Nginx+Unicorn+MySQL)を構築してFargateへデプロイするまで〜本番環境編〜

Last updated at Posted at 2022-10-24

概要

今回は前回の続きで、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

vpc作成.png

サブネット

サブネットは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

サブネット作成.png

ルートテーブル

まずはルートテーブルの作成をします。

key value
VPC ID three-mouth-vpc
名前 three-mouth-route-table

ルートテーブル作成.png

ルートテーブルの作成が完了したら、次にルートの編集を行います。

key value
送信先 0.0.0.0/0
ターゲット インターネットゲートウェイ

ルート編集.png

ルートの編集が完了したら、最後にサブネットの関連づけを行います。
先ほど作成したサブネットのうち、パブリックサブネットを選択し、関連づけを保存します。
サブネットの関連づけ1.png
サブネット関連づけ2.png

セキュリティグループ

■ 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

SGforECS.png

■ RDSのセキュリティグループ

key value
セキュリティグループ名 three-mouth-SG-RDS
説明 Define of SG for RDS
VPC three-mouth-vpc
インバウンドルール タイプ:MYSQL/Aurora 
ソース:three-mouth-SG-ECS

SGforRDS.png

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

DBサブネットグループ.png

RDSの作成

key value
データベース作成方法 標準作成
エンジン MySQL8.0.28

RDS データベース作成方法.png

key value
テンプレート 無料利用枠

RDS 無料枠.png

項目
DBインスタンス識別子 three-mouth-mysql
マスターユーザー名 admin
マスターパスワード password

RDS 設定.png

key value
インスタンスクラス db.t3micro
ストレージタイプ 汎用SSD(gp2)
ストレージ割り当て 20
最大ストレージしきい値 1000

こちらは無料利用枠を指定するとデフォルトで入力されるため、特に修正する必要はありません。

RDS インスタンスの設定.png

key value
VPC three-mouth-vpc
DB サブネットグループ three-mouth-subnet-group
セキュリティグループ three-mouth-SG-RDS

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

3. ECRリポジトリの構築

key value
リポジトリ名(rails用) myapp-miguchi-rails
リポジトリ名(nginx用) myapp-miguchi-nginx

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

4. ECSの構築

タスク定義

タスク定義ではコンテナの数やリソース、コンテナ同士のリンク方法などを定義します。
それでは作成していきましょう。

まずは起動タイプを選択します。
今回はFargateを使用するので、以下の画面で選択し、次のステップへ進みます。
ECS 起動タイプ選択.png

次にタスクの定義を行なっていきます。

key value
タスク定義名 myapp-miguchi
タスクロール ecsTaskEcecutionRole
ネットワークモード awsvpc
オペレーティングシステムファミリー Linux

ECS タスクとコンテナの定義.png

key value
タスク実行ロール ecsTaskEcecutionRole
タスクメモリ 0.5GB
タスクCPU 0.25vCPU

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

key value
コンテナ名 rails
イメージ ECR作成時にメモしたURI:latest
ポートマッピング 3000

ECS コンテナ定義rails1.png

key value
DB_DATABASE three-mouth-mysql
DB_HOST RDSのエンドポイント
DB_PASSWORD password
DB_USERNAME admin
RAILS_ENV production

ECS コンテナ定義rails2.png

key value
コンテナ名 nginx
イメージ ECR作成時にメモしたURI:latest
ポートマッピング 80

ECS コンテナ定義nginx1.png
ECS コンテナ定義nginx2.png
ECS コンテナ定義編集済.png

クラスターの作成

ECS クラスター1.png
ECS クラスター2.png

5. アプリのデプロイ

Docker Imageのプッシュ

いよいよ、アプリのデプロイです。AWSコンソールにてECRを開きます。Nginx用のリポジトリを選択し、プッシュコマンドの表示を選択します。
ECRリポジトリ.png
terminalで以下の4つのコマンドを実行し、DockerのイメージをECRにプッシュします。
ECRプッシュコマンド.png
コマンド実行が完了したら、イメージがプッシュされているか、コンソール上で確認します。
確認が完了したら、rails用のリポジトリでも同様の操作を行います。
ECRイメージ確認.png
正直作成をしなくてもよいのですが、私は以下のような本番用docker-composeを作成しました。少しだけデプロイが楽になります(プッシュコマンドの2を実行)。

terminal
cd ~/Desktop
touch docker-compose.prd.yml
docker-compose.prd.yml
version: '3'

services:
  web:
    build:
      context: .
    image: myapp-miguchi-rails
    
  nginx:
    build:
      context: ./nginx
    image: myapp-miguchi-nginx
terminal
docker-compose -f docker-compose.prd.yml build

ECSデプロイ

Docker Imageのプッシュが完了したら、次はECSのサービスを作成していきます。
AWSコンソールにてECSを開きます。先ほど作成したクラスターを選択し、[サービス]にて[作成]をクリックします。
ECSクラスターサービス作成.png
サービスの設定画面ステップ1が表示されるので、以下の項目を入力します。
以下の項目以外の入力欄はデフォルトでOKです。入力が完了したら、次のステップ2に進みます。

key value
起動タイプ FARGATE
サービス名 myapp-miguchi(適当)
タスクの数 1

ECSクラスターサービス1.png
続いて、以下の項目を入力します。入力が完了したら、次のステップ3に進みます。

key value
クラスター VPC three-mouth-vpc
サブネット three-mouth-PublicSubnet-1a
three-mouth-PublicSubnet-1c
セキュリティグループ three-mouth-SG-ECS

ECSクラスターサービス2.png
ステップ3、4では情報の入力はないため、設定の確認ができたら作成します。
作成後は、サービスで確認できます。
ECSクラスターサービス作成後.png
サービスと同時にタスクも作成されます。
タスクをクリックし、パブリックIPを確認できたら、アクセスしてみます。
ECSクラスターサービスタスク.png
ECSクラスターサービスタスクIP.png
しっかり表示されることが確認できました。
ECSデプロイproducts.png
CRUD処理もしっかりできていますね。
ECSデプロイproducts後.png
今回はこれで以上です。

終わりに

CICDを作成するかも?!

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1