0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】完成したポートフォリオをAWSにデプロイするpart6 (ECS)

Posted at

はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
ついにMVPが完成し、あとはデプロイするだけ!というところまで来ました。
今回は、ECRとFargate(ECS)の設定手順を紹介します。

前提条件

  • 今回はReact × Rails × Docker × PostgreSQLの構成です
  • AWSアカウントを持っていること
  • ドメインを取得していること(私はお名前.comで取得しました)
  • 公開リージョンは東京リージョン(ap-northeast-1)
  • 著者は2025年10月12日に記事を書いています

現時点で想定している構成図は以下の通りです。なおこれから若干変更する可能性がありますのでご了承ください

infra.png

1. ECSを設定する

今回はFargateを使ってECSを構築します。
手順としては以下のようになります。

  1. クラスターの作成
  2. タスク定義の作成
  3. サービスの作成

2. クラスターの作成

  1. まずはECSのコンソール画面に移動します。
  2. 「クラスター」→「クラスターの作成」をクリックします。
  3. クラスターの名前を入力します(例: yourappname-cluster)
  4. 「Fargate」を選択し、「次のステップ」をクリックします。
  5. モニタリング設定をクリックし、「Container Insights 」の「オブザーバビリティが強化された Container Insights」 にチェックを入れます
    これはCloudWatchでコンテナのメトリクスを収集するために必要です。
  6. 「クラスターの作成」をクリックします。

3. タスク定義の作成

  1. 「タスク定義」→「新しいタスク定義の作成」をクリックします。
  2. タスク定義ファミリー名を入力します(例: yourappname-task)
  3. 「AWS Fargate」を選択し、「次のステップ」をクリックします。
  4. オペレーティングシステム(OS)はそのままのLinux/X86_64を選択します。
  5. タスクサイズは以下のように設定します。
  • タスクメモリ(GB): 0.5
  • タスクCPU(vCPU): 1
    今回は以下の理由からそこまで重い処理がないと想定し、最小構成にしています。
  • API専用Rails(フロントは別のReact)
  • バッチ処理や重いジョブがない
  • 同時アクセスが多くない(個人ポートフォリオや学習用)
  1. 「コンテナの追加」をクリックします。
  2. 条件付きのタスクロールを選択し、SESを使用している方は以前作成したタスクロール(例: ecsTaskExecutionRole)を選択します。
  3. タスク実行ロールは新規作成を選択します。(ecsTaskExecutionRole が自動で作成されます)
  4. コンテナ1 の設定を行います。
  • コンテナ名: yourappname-backend-container
  • イメージ: 以前ECRにプッシュしたイメージを選択します(例: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/yourappname-backend:latest)
  • プライベートレジストリの認証: そのまま
  • コンテナポート : 3000 (Railsのデフォルトポート),
  • ポート名: 例: yourappname-backend-port
  • アプリケーションプロトコル: HTTP
  1. 環境変数を設定します。以下は例です。
  • 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 (必要に応じて調整してください)
  1. ValueForm にSecret Managerで作成したシークレットを設定します。
  • RAILS_MASTERKEY= シークレットARN:rails_master_key:: ※
  • SECRET_KEY_BASE=シークレットARN:secret_key_base:: ※
  • DB_PASSWORD=シークレットARN:password:: ※
  • DB_USERNAME=シークレットARN:username:: ※
  1. それ以外はデフォルトのままでOKです。
  2. 「作成」をクリックします。

※ 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. ポリシーのアタッチ

  1. AWSコンソールで「IAM」→「ロール」に移動します。
  2. ecsTaskExecutionRoleを検索してクリックします。
  3. 「許可ポリシー」の「ポリシーをアタッチ」をクリックします。
  4. 以下のポリシーを検索してアタッチします。
  • AmazonSSMManagedInstanceCore (ecs execを使用する場合)
  • SecretsManagerReadWrite (Secret Managerを使用する場合)

これでecsTaskExecutionRoleに必要な権限が付与されました。

5. サービスの作成

  1. タスク定義を開き、デプロイしたいタスクを選択します。
  2. 「アクション」→「サービスの作成」をクリックします。
  3. サービス名を入力します(例: yourappname-backend-service)
  4. Troubleshooting configuration - recommended をクリックして、「ECS Exec をオンにする」にチェックを入れます。
  5. 「デプロイ設定」の「必要なタスク」を入力します。今回は1つのタスクで十分なので1を入力します。
  6. 「ネットワーキング」の設定を行います。
  • VPC: 以前作成したVPCを選択します(例: yourappname-vpc)
  • サブネット: 以前作成したパブリックサブネットを1つ選択します(例: yourappname-public-subnet-1a)
  • セキュリティグループ: 以前作成したセキュリティグループを選択します(例: yourappname-sg-app)
  • パブリック IP: 有効
  1. ロードバランシングを使用しているので、「ロードバランサーを使用する」にチェックを入れます。
  • ロードバランサータイプ: Application Load Balancer
  • ロードバランサー名: 以前作成したALBを選択します(例: yourappname-alb)
  • Application Load Balancer: 既存のロードバランサーを選択します
  • リスナー:既存のリスナーを選択(例: HTTPS 443)
  • ターゲットグループ名: 既存のターゲットグループを選択します(例: yourappname-api-tg)
  1. サービスの作成をクリックします。

これでECSの設定は完了です。

6. 動作確認

curlコマンドで動作確認をします。ALB作成時にバックエンド用のドメインを設定している場合は、以下のように実行します。

curl -X GET https://api.yourdomain.com/api/v1/health_check
# api.yourdomain.com はALBのドメイン名に置き換えてください
# 例: {"status":"ok"}

まとめ

今回はECSの設定を行いました。これでおおむねの設定が終わりました。
最後にフロントバックエンドのCDを設定すれば完成です。
次回はCDの設定を行います。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?