ECS Fargate × CI/CD × Blue/GreenデプロイでWebアプリケーションをデプロイしてみる(CodeCommit / CodePipeline / CodeDeploy)

スポンサーリンク
ハンズオン
スポンサーリンク

はじめに

※2026年3月21日 コマンドでリソースを配備できるように改善しました。

「ECS や CI/CD を使ったアプリケーションのデプロイ、実際に一通り構築できますか?」
サービス名や仕組みは知っていても、CodePipeline や CodeDeploy をどのように組み合わせて、安全にアプリケーションをリリースするのかまで理解できている人は多くありません。
本記事では、CodeCommit から ECS へのデプロイまでの一連の流れを、CI/CD と Blue/Green デプロイを含めて構築しながら、実務で使える構成として理解できるように解説していきます。

具体的には、CloudFormation を使って、ソースコード管理からアプリケーションのビルド、コンテナイメージの登録、ECS へのデプロイまでを一連の流れとして構築します。
手動設定をできるだけ減らしながら、CodeCommit、CodePipeline、CodeBuild、Amazon ECR、CodeDeploy、ECS(Fargate)、Application Load Balancer を組み合わせた AWS ネイティブな CI/CD 環境を作成していきます。

また、本記事では単に動かすだけでなく、なぜこの構成にするのかという観点も大切にしています。ECS タスクをプライベートサブネットに配置して公開入口を ALB に限定することでセキュリティを高め、複数 AZ 構成によって可用性を確保し、Fargate を利用することでサーバ管理の負担を抑えながらコンテナ実行基盤を用意します。

ハンズオンを通して、Web アプリケーションをコンテナ化して動かすだけでなく、CI/CD による継続的なデプロイと、Blue/Green デプロイによる安全なリリースまでを一通り理解できるように進めていきます。

ECS を使ったアプリケーション運用の流れを、実際に手を動かしながら学んでいきましょう。

環境構成

本記事で構築する環境の全体像は以下の通りです。

開発者が CodeCommit にソースコードを push すると、CodePipeline が起動し、CodeBuild によってコンテナイメージがビルドされ、Amazon ECR に登録されます。(※)

その後、CodeDeploy によって ECS サービスに対して Blue/Green デプロイが実行され、Application Load Balancer を通じて新しいバージョンへトラフィックが切り替わります。
この一連の流れにより、コードの変更からデプロイまでを自動化し、安全にアプリケーションを更新できる構成となっています。

※補足
本記事ではハンズオンとしてシンプルに動作を確認できるよう、push をトリガーにパイプラインを起動する構成としていますが、実務ではブランチ戦略とコードレビューを組み合わせた運用が一般的です。
具体的には、開発ブランチで作業した内容をプルリクエストとして作成し、レビュー・承認後にメインブランチへマージされたタイミングでパイプラインを起動することで、品質を担保したデプロイが可能になります。

デプロイまでの流れ

  • CodeCommit にソースコードを push
  • CodePipeline が起動し、ビルド・デプロイ処理を実行
  • CodeBuild によりコンテナイメージを作成し、ECR に登録
  • CodeDeploy が ECS に対して Blue/Green デプロイを実施
  • ALB のターゲットグループを切り替え、トラフィックを新環境へ移行

本構成のポイント

  • CI/CD によるデプロイの自動化(CodePipeline)
  • 安全なリリース(CodeDeploy による Blue/Green)
  • セキュアな構成(Internal ALB + Private Subnet)
  • 可用性の確保(複数 AZ)
  • 運用負荷の軽減(Fargate によるサーバレスコンテナ)

このように、本構成では単にアプリケーションを動かすだけでなく、実務で利用されることを想定したデプロイ基盤を構築しています。

費用

以下は、このハンズオンを 2 時間で実施し、動作確認後にリソースを削除する前提での 1 回あたりの料金目安です(東京リージョン / 2025年11月時点の概算)。
設計全体の月額コストではなく、「実際にハンズオンを1回実施するといくらかかるか」が分かるように整理しています。

サービス 構成 1回あたりの料金目安 考え方
ECS (Fargate) vCPU 0.25 / 0.5GB × 2 タスク 約 0.06 USD 約 0.03 USD / 時間 × 2 時間
ALB (internal) 1 台 約 0.04 USD 約 0.02 USD / 時間 × 2 時間
Interface VPC Endpoint ECR API / ECR DKR / CloudWatch Logs × 各 2 サブネット 約 0.12 USD 合計 6 個 × 0.01 USD / 時間 × 2 時間の目安
S3 Gateway Endpoint 1 エンドポイント 0 USD Gateway Endpoint 自体の追加料金はありません
ECR 1 リポジトリ / 小容量イメージ保管 0.01 USD 未満 短時間・少容量のため少額になります
CodeBuild 初期シード + アプリビルド 約 0.01 USD 数分程度の実行を想定
CodePipeline 1 パイプライン 0 USD 作成後 30 日以内は無料です(参考
CodeDeploy ECS Blue/Green デプロイ 0 USD ECS への Blue/Green デプロイ自体の追加料金はありません
Route 53 Private Hosted Zone 1 ホストゾーン 0 USD 作成後 12 時間以内に削除する前提です(参考
S3(Artifact バケット) 1 バケット 0.01 USD 未満 成果物保管は少量のため少額になります
CloudWatch Logs ECS / CodeBuild / Lambda のログ 0.01 USD 未満 2 時間のハンズオンでは少額になります
CodeCommit 1 リポジトリ / 少人数利用 0.01 USD 未満 小規模なハンズオン用途のため少額になります
Lambda(初期シード用) 短時間実行 0.01 USD 未満 初回セットアップ時のみの軽微な費用です
Windows EC2(動作確認用) 1 台 約 0.10 USD 約 0.05 USD / 時間 × 2 時間
EBS (gp3) Windows EC2 のルートボリューム 0.01 USD 未満 2 時間利用では少額になります

合計:約 0.33 USD / 1 回(約 50 円 / 1 回)

注意事項
※ Blue/Green デプロイ時は、新旧 2 系統のタスクが一時的に同時稼働するため、その時間帯のみ Fargate の料金がわずかに増加します。
※ Interface VPC Endpoint は時間課金に加えてデータ処理料金もありますが、2 時間のハンズオンで発生する通信量は小さい想定のため、上記では無視できる程度として扱っています。
※ CodePipeline は作成後 30 日を超えると、アクティブな月に 1 USD / 月の課金対象になります。(参考
※ Route 53 Hosted Zone は、作成後 12 時間以内に削除すれば課金されません。12 時間を超えると標準の月額料金が発生します。(参考
※ ACM 証明書はテンプレートで事前作成済み ARN を受け取る構成のため、本表には含めていません。

各リソースの説明

本ハンズオンで利用する主要なリソースについて、それぞれの役割とポイントを簡単に説明します。

CodeCommit

AWS が提供する Git リポジトリサービスです。
本ハンズオンでは、ソースコードの管理とパイプラインのトリガーとして利用します。

CodeCommit への push を起点に CodePipeline が実行されるため、
CI/CD の入り口となる重要なコンポーネントです。

AWS 内で完結した構成とすることで、外部サービスに依存せずセキュアにソースコード管理とパイプライン実行を行うことができます。

CodePipeline

CI/CD パイプラインを構築するサービスです。
本ハンズオンでは、CodeCommit への変更をトリガーとして、
ビルドからデプロイまでの一連の処理を自動化します。

パイプラインは主に以下のステージで構成されています。

  • Source:CodeCommit からソースコードを取得
  • Build:CodeBuild によりコンテナイメージを作成
  • Deploy:CodeDeploy により ECS にデプロイ

ステージごとに処理を分離することで、
ビルドとデプロイの責務を明確にし、拡張性の高い CI/CD 構成を実現できます。

費用面では、作成後 30 日以内のため追加料金は発生しません。(参考

CodeBuild

ソースコードからコンテナイメージをビルドするサービスです。
本ハンズオンでは、Docker を利用してコンテナイメージを作成し、Amazon ECR にプッシュします。

CodeBuild では buildspec.yml に処理を定義することで、
ビルド手順をコードとして管理できます。

具体的には、Docker イメージのビルド、タグ付け、ECR への push といった処理を自動化し、
アプリケーションの変更を即座にデプロイ可能な形へ変換する役割を担います。

Amazon ECR

コンテナイメージを保存するためのレジストリです。
CodeBuild でビルドされたイメージを格納し、ECS から取得してコンテナを起動します。

ECS はここからイメージを pull してタスクを起動するため、
ECR はコンテナ実行の起点となる重要なコンポーネントです。

CodeDeploy

CodeDeploy は、アプリケーションのデプロイを自動化するサービスです。
EC2、オンプレミス環境、Lambda、ECS など複数の実行環境に対して、
安全かつ段階的にアプリケーションを展開することができます。

デプロイ方式としては、インプレースデプロイ(既存環境の更新)や、
Blue/Green デプロイ(新旧環境を切り替える方式)などを選択でき、
ダウンタイムを抑えながらリリースできるのが特徴です。

本ハンズオンでは、ECS サービスに対する Blue/Green デプロイを利用します。
CodeDeploy は新しいタスクセット(Green 環境)を作成し、
既存のタスクセット(Blue 環境)と並行して起動した後、
Application Load Balancer のターゲットグループを切り替えることでトラフィックを移行します。

ECS (Fargate)

コンテナを実行するためのサービスです。
本ハンズオンでは、ECR に登録されたコンテナイメージをもとにタスクを起動し、
Web アプリケーションを稼働させます。

Fargate を利用することで、EC2 のようなサーバ管理を行うことなく、
CPU やメモリを指定するだけでコンテナ実行環境を構築できます。

また、CodeDeploy と連携することで、
新しいタスクセットの作成や切り替えが自動化され、
安全なアプリケーション更新を実現できます。

Application Load Balancer (ALB)

HTTP/HTTPS リクエストを受け取り、ECS 上のコンテナに振り分けるロードバランサーです。

本ハンズオンでは、ALB はインターネットから直接アクセスできない構成とし、
VPC 内部からのみアクセス可能としています。

Blue/Green デプロイでは、
ALB が保持するターゲットグループ(Blue / Green)の切り替えによって、
トラフィックの移行を実現します。

事前準備

事前準備として、以下を準備しておきましょう。

  1. Angularアプリを格納したGitHubリポジトリの作成(本記事で利用するリポジトリにサンプルアプリケーションが入っています)
  2. HTTPS通信に使用する ACM 証明書の発行(ALB用)
  3. Node.Js 24 以降の実行環境
  4. AWS CLIのセットアップ
  5. CodeCommitの設定(参考: AWS CodeCommitにIAMユーザー認証でHTTPS接続する方法

CloudFormationでリソース配備

リポジトリのクローン

GitHubリポジトリをローカル環境にクローンし、CloudFormationテンプレートおよびスクリプトを確認します。

git clone https://github.com/TeTeTe-Jack/aws-handson-ecs-nginx-cicd.git
cd aws-handson-ecs-nginx-cicd

IAMユーザの権限設定

cfn/iam-policy.json に記載された内容でAWS CLIの実行ユーザの権限を付与してください。

パラメータ設定

cfn/paramters.json.template を複製し、cfn/paramters.json を作成してください。

cfn/paramters.json の設定値を修正してください。修正内容は以下です。
※特に修正が必要な箇所は★をつけています。

  • セクション:repos
パラメータ 設定例 修正内容
SystemName demo 任意のシステム名に変更してください。
各リソース名のプレフィックスとして利用されます。
Environment prod 必要に応じて devstg などに変更してください。
CodeCommitRepoName demo-nginx-html 作成する CodeCommit リポジトリ名です。
重複しない名前に変更してください。
CodeCommitDescription Angular + Nginx application source 必要に応じて説明文を変更してください。
EcrRepoName demo-nginx-html 作成する ECR リポジトリ名です。CodeCommitRepoName と合わせると分かりやすいです。
EcrKeepImageCount 3 保持するコンテナイメージ数です。
必要に応じて変更してください。
EnableInitialImageSeed true 初期イメージを ECR に登録する場合は true のまま利用してください。
NginxSourceImage public.ecr.aws/nginx/nginx:1.29-alpine 初期投入に使うベースイメージです。
特に理由がなければ変更不要です。
InitialImageTag initial 初期登録するイメージタグです。
変更不要です。
SeedBuildComputeType BUILD_GENERAL1_SMALL 初期シード用 CodeBuild のスペックです。
通常は変更不要です。
SeedBuildImage aws/codebuild/amazonlinux-x86_64-standard:5.0 初期シード用 CodeBuild イメージです。
通常は変更不要です。
SeedTimeoutSeconds 840 初期シード処理のタイムアウト秒数です。
通常は変更不要です。
  • セクション:service
パラメータ名 設定例 修正内容
SystemName demo repos.SystemName と同じ値を設定してください。
Environment prod repos.Environment と同じ値を設定してください。
VpcCidr 10.0.0.0/16 VPC の CIDR です。
必要に応じて変更してください。
PrivateSubnet1Cidr 10.0.10.0/24 プライベートサブネット 1 の CIDR です。
VPC 内で重複しない値にしてください。
PrivateSubnet2Cidr 10.0.11.0/24 プライベートサブネット 2 の CIDR です。
VPC 内で重複しない値にしてください。
ContainerPort 80 コンテナが待ち受けるポートです。
アプリケーションに合わせて変更してください。
DesiredCount 2 ECS タスク数です。ハンズオンでは 2 のまま利用してください。
TaskCpu 256 Fargate タスクの CPU 設定です。
通常は変更不要です。
TaskMemory 512 Fargate タスクのメモリ設定です。
通常は変更不要です。
HealthCheckPath /healthz ALB のヘルスチェックパスです。
アプリケーションに合わせて変更してください。
AcmCertificateArn ★arn:aws:acm:ap-northeast-1:ACCOUNT_ID:certificate/
REPLACE_WITH_YOUR_CERT_ARN
事前に作成した ACM 証明書の ARN に置き換えてください。
※PrivateHostedZoneNameのドメインと一致させておく
AlbSslPolicy ELBSecurityPolicy-TLS13-1-2-Res-2021-06 通常は変更不要です。
PrivateHostedZoneName ★internal.demo.local VPC 内で利用するプライベートホストゾーン名です。
必要に応じて変更してください。
※ACMの証明書と一致させておく
DnsRecordName app ALB に割り当てるレコード名です。
通常はそのままで問題ありません。
  • セクション:pipeline
パラメータ名 設定例 修正内容
SystemName demo repos.SystemName と同じ値を設定してください。
Environment prod repos.Environment と同じ値を設定してください。
CodeCommitRepoName demo-nginx-html repos.CodeCommitRepoName と同じ値を設定してください。
CodeCommitBranch master 利用するブランチ名です。必要に応じて main などに変更してください。
BuildComputeType BUILD_GENERAL1_SMALL CodeBuild のスペックです。
通常は変更不要です。
BuildImage aws/codebuild/amazonlinux-x86_64-standard:5.0 CodeBuild 実行イメージです。
通常は変更不要です。
EcrRepoName demo-nginx-html repos.EcrRepoName と同じ値を設定してください。
ContainerName app 通常は変更不要です。
ContainerPort 80 service.ContainerPort と同じ値を設定してください。
TaskCpu 256 service.TaskCpu と同じ値を設定してください。
TaskMemory 512 service.TaskMemory と同じ値を設定してください。
DeploymentConfigName CodeDeployDefault.ECSAllAtOnce デプロイ方式です。
ハンズオンではそのまま利用してください。
DeploymentReadyWaitMinutes 0 通常は変更不要です。
TerminationWaitMinutes 5 Blue 環境の停止待機時間です。
通常は変更不要です。
ArtifactBucketName 空欄のまま利用するとテンプレート側で自動生成されます。
既存バケットを使う場合のみ指定してください。
  • セクション:winserv
パラメータ名 設定例 修正内容
SystemName demo repos.SystemName と同じ値を設定してください。
Environment prod repos.Environment と同じ値を設定してください。
InstanceType t3.small 検証用 Windows Server のインスタンスタイプです。
通常はそのままで問題ありません。
VolumeSizeGiB 30 ルートボリュームサイズです。
通常は変更不要です。
KeyName ★REPLACE_KeyName 利用する EC2 キーペア名に置き換えてください。
CreateSsmEndpoints true SSM 接続用 VPC エンドポイントを作成する場合は true のまま利用してください。

リソースの配備

以下のコマンドでハンズオンに必要なリソースが配備されます。

npm run deploy

正しく配備ができると、CloudFormationの画面で以下4つのスタックが配備されています。

動作確認① パイプライン実行前

FleetManagerでWindowsサーバにログインします。

Fleet Managerのサービスメニューを開きます。

配備したWindowsサーバが表示されます。接続するノードを選択します。

「ノードアクション」>「接続」>「リモートデスクトップ接続」を順番に選択します。

指定されたキーペアでリモートデスクトップ接続をします。

リモートデスクトップ接続ができます。

パラメータ設定で指定したURLにアクセスしてください。
nginxのデフォルトの画面が表示されます。

※パイプライン起動前の各種リソースの設定です。

  • ALBのリスナー:***-tg-blueへの転送
  • ECSのタスク:入替前の2つのタスクが起動

パイプラインの実行

CodeCommitにソースファイルをプッシュします。以下のコマンドを実行してください。

npm run git-push

CodeCommitにソースがプッシュされ、ブランチ更新イベントをトリガーにCodePipelineが起動します。

パイプラインが起動すると、以下の処理が動きます。

  1. ソースの取得
  2. ソースのビルド・コンテナイメージの作成・コンテナイメージのプッシュ
  3. Blue Green デプロイ(ECS 新タスク作成・ターゲットグループ紐づけ・ターゲットグループ付け替え・ECS 旧タスクの停止)

パイプライン起動後しばらくすると、
ECS にて新規のタスクが起動します。(旧タスクはそのまま)

***-tg-greenにもターゲットが紐づいています。

しばらくすると、ALB のリスナーの転送先も Green のターゲットグループに変わります。

さらにしばらくすると、ECS の旧タスクが停止します。

動作確認② パイプライン実行後

再度、FleetManagerでWindowsサーバにログインし、URLにアクセスします。

新しい画面に変わっています。

ハンズオン終了後のリソース削除

以下のコマンドでリソースを削除できます。
時間課金のサービスもあるので、ハンズオン終了後は不要な課金が発生しないように必ず実施してください。

npm run delete:all

おわりに

本記事では、ECS Fargate を用いたコンテナ実行基盤と、
CodePipeline / CodeBuild / CodeDeploy を組み合わせた CI/CD パイプラインを構築しました。

単にアプリケーションをデプロイするだけでなく、
セキュアなネットワーク設計、可用性を考慮した構成、運用を見据えた自動化までを含めて構築することで、
実務に近いレベルのアーキテクチャを体験できたと思います。

今後は、テストフェーズや手動承認フェーズの追加や Canary デプロイ、Auto Scaling の導入などを組み合わせることで、
さらに実践的なシステムへ発展させることも可能です。

Infrastructure as Code(IaC)と CI/CD を組み合わせることで、
再現性の高い、安全でスケーラブルなシステムを構築できるようになります。
本記事がその第一歩となれば幸いです。

タイトルとURLをコピーしました