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

はじめに

クラウドネイティブ開発が一般化する中で、コンテナ運用とCI/CDの整備は企業システムにおける重要な基盤要素となっています。

特にAWS環境でアプリケーションを運用する場合、

  • Dockerビルド
  • コンテナレジストリへの登録
  • タスク定義更新
  • 本番環境反映

といった一連の作業を手動で実施しているケースは少なくありません。

しかし、手動運用は属人化・ヒューマンエラー・監査対応の観点で限界があります。

本記事では、

GitHubへのpushを起点に、DockerビルドからECS(Fargate)本番反映までを自動化する構成

を、法人導入を前提とした実務レベルで解説します。

対象サービス:

  • GitHub
  • Amazon ECR
  • Amazon ECS
  • AWS Fargate

全体アーキテクチャ

デプロイフロー概要

  1. mainブランチへコードをpush
  2. GitHub Actionsが自動起動
  3. Dockerイメージをビルド
  4. ECRへイメージをpush
  5. ECSサービスを更新
  6. 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万円前後で運用可能です。

弊社へのお問い合わせはこちらまで

お問い合わせ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です