はじめに
こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
ついにMVPが完成し、あとはデプロイするだけ!というところまで来ました。
今回は、ECRとFargate(ECS)の設定手順を紹介します。
前提条件
- 今回はReact × Rails × Docker × PostgreSQLの構成です
- AWSアカウントを持っていること
- ドメインを取得していること(私はお名前.comで取得しました)
- 公開リージョンは東京リージョン(ap-northeast-1)
- 著者は2025年10月12日に記事を書いています
現時点で想定している構成図は以下の通りです。なおこれから若干変更する可能性がありますのでご了承ください
1. ECSを設定する
今回はFargateを使ってECSを構築します。
手順としては以下のようになります。
- クラスターの作成
- タスク定義の作成
- サービスの作成
2. クラスターの作成
- まずはECSのコンソール画面に移動します。
- 「クラスター」→「クラスターの作成」をクリックします。
- クラスターの名前を入力します(例: yourappname-cluster)
- 「Fargate」を選択し、「次のステップ」をクリックします。
- モニタリング設定をクリックし、「Container Insights 」の「オブザーバビリティが強化された Container Insights」 にチェックを入れます
これはCloudWatchでコンテナのメトリクスを収集するために必要です。 - 「クラスターの作成」をクリックします。
3. タスク定義の作成
- 「タスク定義」→「新しいタスク定義の作成」をクリックします。
- タスク定義ファミリー名を入力します(例: yourappname-task)
- 「AWS Fargate」を選択し、「次のステップ」をクリックします。
- オペレーティングシステム(OS)はそのままのLinux/X86_64を選択します。
- タスクサイズは以下のように設定します。
- タスクメモリ(GB): 0.5
- タスクCPU(vCPU): 1
今回は以下の理由からそこまで重い処理がないと想定し、最小構成にしています。 - API専用Rails(フロントは別のReact)
- バッチ処理や重いジョブがない
- 同時アクセスが多くない(個人ポートフォリオや学習用)
- 「コンテナの追加」をクリックします。
- 条件付きのタスクロールを選択し、SESを使用している方は以前作成したタスクロール(例: ecsTaskExecutionRole)を選択します。
- タスク実行ロールは新規作成を選択します。(ecsTaskExecutionRole が自動で作成されます)
- コンテナ1 の設定を行います。
- コンテナ名: yourappname-backend-container
- イメージ: 以前ECRにプッシュしたイメージを選択します(例: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/yourappname-backend:latest)
- プライベートレジストリの認証: そのまま
- コンテナポート : 3000 (Railsのデフォルトポート),
- ポート名: 例: yourappname-backend-port
- アプリケーションプロトコル: HTTP
- 環境変数を設定します。以下は例です。
- RAILS_ENV=production
- RAILS_LOG_TO_STDOUT=true
- RAILS_SERVE_STATIC_FILES=true
- DB_HOST=your_rds_endpoint これはRDSのエンドポイントを指定します
- DB_NAME=your_db_name
- PORT=3000 (Rails の場合)
- RAILS_MAX_THREADS=3 (必要に応じて調整してください)
- ValueForm にSecret Managerで作成したシークレットを設定します。
- RAILS_MASTERKEY= シークレットARN:rails_master_key:: ※
- SECRET_KEY_BASE=シークレットARN:secret_key_base:: ※
- DB_PASSWORD=シークレットARN:password:: ※
- DB_USERNAME=シークレットARN:username:: ※
- それ以外はデフォルトのままでOKです。
- 「作成」をクリックします。
※ ARN はSecret Managerのシークレット詳細画面で確認できます。そして、そのリンクを張るだけでは動作せず、Secret Manager で定義したキーの名前を :キー名::
のように指定する必要があります。
これでタスク定義が完成しました。
上記では触れませんでしたが、ECSタスクには2種類のIAMロールがあります。
ロール名 | 役割 | 例 | 主な権限 |
---|---|---|---|
🧰 実行ロール(Task Execution Role) | ECSがタスクを起動する時に使う | ecsTaskExecutionRole |
ECRからイメージをpull、Secrets Manager取得、ログ出力、ECS Execなど |
🧑💻 タスクロール(Task Role) | コンテナ内のアプリがAWSを使う時に使う | ecsTaskRole |
例:アプリがS3やSES、DynamoDB、SNSなどを操作する |
そして、今回のタスク定義で実行ロールが作成されましたが、これから使用したい以下の権限が付与されていません
- Secrets Managerからシークレットを取得する権限
- ECS Execを使用する権限(rails console を実行したい場合に使用します)
そのため、サービスを作成する前にecsTaskExecutionRole
にポリシーをアタッチします
4. ポリシーのアタッチ
- AWSコンソールで「IAM」→「ロール」に移動します。
-
ecsTaskExecutionRole
を検索してクリックします。 - 「許可ポリシー」の「ポリシーをアタッチ」をクリックします。
- 以下のポリシーを検索してアタッチします。
-
AmazonSSMManagedInstanceCore
(ecs execを使用する場合) -
SecretsManagerReadWrite
(Secret Managerを使用する場合)
これでecsTaskExecutionRole
に必要な権限が付与されました。
5. サービスの作成
- タスク定義を開き、デプロイしたいタスクを選択します。
- 「アクション」→「サービスの作成」をクリックします。
- サービス名を入力します(例: yourappname-backend-service)
- Troubleshooting configuration - recommended をクリックして、「ECS Exec をオンにする」にチェックを入れます。
- 「デプロイ設定」の「必要なタスク」を入力します。今回は1つのタスクで十分なので1を入力します。
- 「ネットワーキング」の設定を行います。
- VPC: 以前作成したVPCを選択します(例: yourappname-vpc)
- サブネット: 以前作成したパブリックサブネットを1つ選択します(例: yourappname-public-subnet-1a)
- セキュリティグループ: 以前作成したセキュリティグループを選択します(例: yourappname-sg-app)
- パブリック IP: 有効
- ロードバランシングを使用しているので、「ロードバランサーを使用する」にチェックを入れます。
- ロードバランサータイプ: Application Load Balancer
- ロードバランサー名: 以前作成したALBを選択します(例: yourappname-alb)
- Application Load Balancer: 既存のロードバランサーを選択します
- リスナー:既存のリスナーを選択(例: HTTPS 443)
- ターゲットグループ名: 既存のターゲットグループを選択します(例: yourappname-api-tg)
- サービスの作成をクリックします。
これでECSの設定は完了です。
6. 動作確認
curlコマンドで動作確認をします。ALB作成時にバックエンド用のドメインを設定している場合は、以下のように実行します。
curl -X GET https://api.yourdomain.com/api/v1/health_check
# api.yourdomain.com はALBのドメイン名に置き換えてください
# 例: {"status":"ok"}
まとめ
今回はECSの設定を行いました。これでおおむねの設定が終わりました。
最後にフロントバックエンドのCDを設定すれば完成です。
次回はCDの設定を行います。