GitHub Actions ×AWS: ECS(Fargate)自動デプロイ完全ガイド― Dockerビルド〜本番反映の自動化設計 ―

はじめに
クラウドネイティブ開発が一般化する中で、コンテナ運用とCI/CDの整備は企業システムにおける重要な基盤要素となっています。
特にAWS環境でアプリケーションを運用する場合、
- Dockerビルド
- コンテナレジストリへの登録
- タスク定義更新
- 本番環境反映
といった一連の作業を手動で実施しているケースは少なくありません。
しかし、手動運用は属人化・ヒューマンエラー・監査対応の観点で限界があります。
本記事では、
GitHubへのpushを起点に、DockerビルドからECS(Fargate)本番反映までを自動化する構成
を、法人導入を前提とした実務レベルで解説します。
対象サービス:
- GitHub
- Amazon ECR
- Amazon ECS
- AWS Fargate
全体アーキテクチャ
デプロイフロー概要
- mainブランチへコードをpush
- GitHub Actionsが自動起動
- Dockerイメージをビルド
- ECRへイメージをpush
- ECSサービスを更新
- Fargateがローリングデプロイを実行
これにより、開発から本番反映までが一貫して自動化されます。
手動運用(AWS CLI)の課題
CI/CD未導入環境では、以下のようなコマンド操作が一般的です。
docker build -t sample-app .
docker tag sample-app:latest ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:latest
docker push ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:latest
aws ecs update-service \
--cluster sample-cluster \
--service sample-service \
--force-new-deployment
この運用には以下の課題があります。
1. 属人化
特定の担当者しか手順を把握していない。
2. ミスの発生
- リージョン間違い
- アカウント間違い
- タグ管理ミス
- クラスター名誤入力
3. 再現性の欠如
- どのコミットが本番か不明確
- ロールバック困難
- 監査ログが分散
4. デプロイ頻度の低下
手動作業は心理的ハードルが高く、結果としてリリースが遅延します。
CI/CD導入により、これらの課題を根本的に解決できます。
AWS側事前準備
1. ECRリポジトリ作成

aws ecr create-repository \
--repository-name sample-app \
--region ap-northeast-1
3. Fargate用タスク定義
必須設定:
- requiresCompatibilities: FARGATE
- networkMode: awsvpc
- cpu: 256
- memory: 512
image例:ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:latest
ECSサービス作成
aws ecs create-service \
--cluster sample-cluster \
--service-name sample-service \
--task-definition sample-task \
--desired-count 1 \
--launch-type FARGATE

作成したタスク定義からJSONをダウンロードします

ダウンロードしたJSONをGitリポジトリにpushします

下記コードも.github/workflows/の階層の中にpushします
(階層名などは必須です)
.github/workflows/deploy.yml
name: Deploy to Amazon ECS
on:
push:
branches:
- main
env:
AWS_REGION: us-east-1
ECR_REPOSITORY: test
ECS_SERVICE: my-test-task-service-vwkuc8js
ECS_CLUSTER: default
ECS_TASK_DEFINITION: task-definition.json
CONTAINER_NAME: my-web-app
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
IAM設計(CI専用ユーザー)
本構成ではアクセスキー方式を採用します。
アクセスキーがない方はIAMからユーザーを作成します

右側部分にある、ユーザーの作成をクリックします

必要最小権限
ECR関連
- ecr:GetAuthorizationToken
- ecr:BatchCheckLayerAvailability
- ecr:InitiateLayerUpload
- ecr:UploadLayerPart
- ecr:CompleteLayerUpload
- ecr:PutImage
ECS関連
- ecs:DescribeServices
- ecs:UpdateService
- ecs:RegisterTaskDefinition
※AdministratorAccessの付与は推奨しません。
GitHub Actions ワークフロー
弊社GitHubの参考リポジトリはこちら!
https://github.com/starscript-llc-Japan/GitHub_Actions_AWS_ECS
GitHub Secrets設定
GitHubリポジトリの設定画面から以下を登録します。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_ACCOUNT_ID
GitHubリポジトリの設定画面から以下を登録します。

下にスクロールしますと左項目にActions secrets and variablesという項目がありますので
そのActionsをクリックします

下記部分をクリックします

次に書きのようにNameには「AWS_ACCESS_KEY_ID」などとプレースホルダーに設定している部分を記載します
SecretにはAWS側で発行されたkey・idを入力します

作成後下記のように表示されます

次にワークフロー作成に入ります

そうすると一覧が表示されますので下記までスクロールし、赤枠部分を選択します

実行すると下記のようにビルド、コンテナ化、デプロイの一連処理が開始されます

成功すると下記のように表示されます

デプロイ後、aws:ecsに戻りクラスター→タスクを確認しますと、下記のようにデプロイされたアプリが存在します!

さらにクリックしていくと下記のようにパブリックip等が発行されているはずです!
(正確にはvpcなど詳細設計が必要になります)

実務上の重要ポイント
イメージタグ管理
latestタグの使用は避け、Git SHAを利用します。
これにより:
- デプロイ履歴の可視化
- ロールバック容易化
- 世代管理明確化
が実現できます。
セキュリティ設計
本番環境では以下構成を推奨します。
- ALBのみPublic
- ECSはPrivate Subnet
- セキュリティグループでアクセス制御
コスト目安(東京リージョン)
| 項目 | 月額目安 |
|---|---|
| Fargate 0.25vCPU/0.5GB | 約3,000〜4,000円 |
| ALB | 約2,000〜3,000円 |
| NAT Gateway | 約5,000円〜 |
小規模構成であれば月額1万円前後で運用可能です。
弊社へのお問い合わせはこちらまで
