はじめに

AWS CodePipelineを使ってGitHubのコード変更をECS Fargateに自動デプロイするCI/CDパイプラインをやってみた内容を執筆しました。今回は、AWS CodeDeployを使用せずに、ECS標準のローリングアップデート機能を使ってデプロイを実行しております。

CI/CDとは?

ソフトウェア開発において、コードを書いてからリリースするまでに、ビルド・テスト・デプロイなどの工程を自動化して、効率的にリリースするための仕組みのことです。

  • CI(Continuous Integration)

CIは、開発中のコードを自動で統合・テストする仕組みです。

開発者がGitHubなどにコードをpush(登録)すると、自動的にビルドやテストが実行され、コードの不具合や依存関係の問題を早期に検出できます。

 

  • CD(Continuous Delivery / Continuous Deployment)

CIでテスト済みのアプリケーションを、リリース工程まで自動化する仕組みがCDです。

CDには2つのタイプがあります。

  • Continuous Delivery(継続的デリバリー)

    テストまでを自動化し、本番リリースは「人の承認」で行います。

    → 品質を確保しながら段階的にリリースする方式

  • Continuous Deployment(継続的デプロイメント)

    テストを通過したら、自動的に本番環境へ反映します。

    → スピードを重視したリリース方式

 

CI/CDを導入するメリット

  • コードの品質を安定して保てる
  • リリース作業の手間を減らせる
  • 開発スピードが向上する
  • ヒューマンエラーを防止できる

AWS CodePipelineとは

ソフトウェア開発・デプロイメントのプロセスを自動化する、継続的デリバリー(CD)サービス

今回構築したアーキテクチャ

下図は、今回のCI/CDパイプライン構成です。

使用したAWSサービス

サービス 役割
AWS CodePipeline 一連の自動化フローを定義(ステージ管理)
AWS CodeBuild ソースコードのビルド・テスト
Amazon ECS 実行環境(Fargate)
Amazon ECR Dockerイメージの保存場所
Git Hub ソースリポジトリ(GitHub連携)

CI/CDパイプラインの流れ

CI/CDでは、一連の自動化処理をパイプラインと呼びます。

以下のような流れで、自動的にビルド・テスト・デプロイが進みます。

①ソースコードの更新(GitHub)

開発者がGitHubリポジトリにコードをPushすると、CodePipelineの ソースステージ がトリガーされます。GitHub Connectionを通して最新のソースを取得します。

# 例:ソースコードを修正後にpush(index.html等)
$ git add .
$ git commit -m "source update"
$ git push origin main

GitHub コネクション

AWS CodePipelineを利用してソースステージではGitHub (GitHub アプリ経由)を選択し、新しくGitHubとの接続を作成しております。

GitHubとの接続方法に関しては、以下のAWS公式ドキュメントを参照ください。

<ソースステージ:設定値>

設定項目 設定値
ソースプロバイダー GitHub (GitHub アプリ経由)
接続 上記で作成した接続
リポジトリ名 GitHubのリポジトリ名
デフォルトブランチ main(任意)

 

②CodePipeline が自動実行(ビルド・デプロイ開始)

パイプラインは3つのステージで構成しています。

ステージ 内容
ソースステージ GitHubのmainブランチからソースを取得
ビルドステージ CodeBuildでDockerイメージをビルドし、ECRにイメージをプッシュ
デプロイステージ imageDefinitions.json をECSに渡して、新しいタスク定義でサービスを更新

CodeBuild(buildspec.yml)

変数ECR_REPOSITORYは、CodeBuildの環境変数を利用しております。

version: 0.2

phases:
 pre_build:
  commands:
   - echo Logging in to Amazon ECR...
   - aws ecr get-login-password --region ap-northeast-1 \
      | docker login --username AWS --password-stdin ${ECR_REPOSITORY}
 build:
  commands:
   - echo Building the Docker image...
   - docker build -t container-test-app .
   - docker tag container-test-app:latest ${ECR_REPOSITORY}:latest
 post_build:
  commands:
   - echo Pushing the Docker image...
   - docker push ${ECR_REPOSITORY}:latest
   - echo Build completed on `date`
   - echo Creating imagedefinitions.json...
   - printf '[{"name":"container-test","imageUri":"%s"}]' \
      "${ECR_REPOSITORY}:latest" \
      > imagedefinitions.json
   - echo imagedefinitions.json created.
   - cat imagedefinitions.json

artifacts:
 files:
  - imagedefinitions.json

③ECSへのデプロイ(タスク定義の更新)

CodePipelineはECRにPushされた新しいイメージを参照し、imagedefinitions.json に基づいてECSサービスのタスク定義を更新します。

この処理により、ECSの新しいリビジョンが作成され、サービスが新しいタスク定義を使って再デプロイを開始します。

 

④ECSサービスのローリングアップデート

新しいタスクを少しずつ起動し、正常起動を確認しながら旧タスクを停止します。

また、AWS CodeDeployを使用せずに、ECS単体で安定した更新が可能できます。

ECSでは4つのデプロイタイプを選択可能

「ローリングアップデート」「ブルー/グリーン」「Canary」「リニア」を選択できます。

2025年7月に、ブルー/グリーンデプロイがCodeDeployを利用しない形でデプロイが可能となりました。また、2025年10月30日に新たに組み込みのリニアおよびカナリアデプロイメントのサポートを開始しております。それぞれを簡単に説明します。

①ローリングアップデート

  1. 新規タスクの起動: 新しいバージョンのタスクを起動
  2. 正常性の確認: 新しいタスクが「RUNNING」状態になり、ヘルスチェックに合格するまで待ちます。
  3. 旧タスクの停止: 新規タスクが正常に起動したら、古いバージョンのタスクを停止します。
  4. 繰り返し: 上記のプロセスをサービスのタスクすべてに適用し、すべてのタスクが新しいバージョンに置き換わるまで繰り返します。

ユースケース:ダウンタイムを最小限に抑えつつ 、アプリケーションを更新したい場合

 

②リニアデプロイ

指定期間内にトラフィックを段階的(例:10%ずつ)に新リビジョンへ移行し、各ステップ間でモニタリング時間(ベイク時間)を設けて段階的に切り替える方式です。

ユースケース:トラフィックを一定割合ずつ増やして移行することで、システム全体の安定性を確認しながら安定した状態を維持しながらリリースしたい場合。いきなりトラフィックを全量切り替えせず、段階ごとにモニタリングできるためリスクを低減したい場合。

 

③Canaryデプロイ

最初に一部トラフィックのみを新リビジョンへ流して動作を確認し、問題なければ残りを移行する方式です。

ユースケース:トラフィックの一部だけを新リビジョンに流し、実環境で問題がないか限定的に新機能を検証したい場合。ごく一部のユーザーにのみ新バージョンを試すケースや、問題発生時にすぐロールバックできる構成を取りたい場合に適しています。

④ブルー/グリーンデプロイ

新バージョンを別環境(Green)で起動し、既存環境(Blue)から段階的に切り替える方式です。

処理の流れ:

  1. Blue環境(旧バージョン)が本番トラフィックを処理中
  2. Green環境(新バージョン)を別に立ち上げてテストする。
  3. 問題がなければ、トラフィックをBlue → Greenに切り替える。
  4. Greenが本番になり、Blueは停止。

    • 初期展開状態:現在、本番トラフィックはブルー側(既存バージョン)のサービスが処理している
    • 進行中の展開状態:Blueサービスリビジョンは本番トラフィックを処理し、Greenサービスリビジョンはテストトラフィックを処理する
    • 最終的な展開状態:Greenサービスリビジョンが本番トラフィックを処理する

    まとめ

    CodePipeline + CodeBuild + ECS を用いて、AWS標準サービスだけで「ビルド〜デプロイ」までの流れをシンプルに構築できました。

    今回は CodeDeploy を使わずにデプロイまで完結でき、ECS単体でも十分にパイプラインを成立させられる点が大きな学びでした。

    また、デプロイ時にエラーが発生した際も、CloudWatch Logs を確認しながら設定を見直すことで原因を切り分け、解決まで持っていけました。

    次回は、業務でも利用している GitHub Actions と比較しつつ、GitHub Actions 版のパイプライン構築にも挑戦していきます。

     

    参考資料

    https://aws.amazon.com/jp/about-aws/whats-new/2025/10/amazon-ecs-built-in-linear-canary-deployments/

    https://aws.amazon.com/jp/blogs/news/accelerate-safe-software-releases-with-new-built-in-blue-green-deployments-in-amazon-ecs/

    https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/connections-github.html