ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Amazon ECS】組み込みのBlue/Greenデプロイを簡単にためしてみる

この記事を共有する

目次

はじめに

こんにちは、サービスGの森です。
2025/07/17のアップデートでAmazon ECS(以下、ECS)組み込みのBlue/Greenデプロイが可能になりました。

CodeDeployのドキュメントでも「組み込みのBlue/Greenデプロイ」をお勧めしているくらいですので、今後はこちらのアップデートが活発化しそうです。

CodeDeploy_Document.png


そこで、今回は新しいECSの組み込みのBlue/Greenデプロイをサクッと試していきたいと思います。

やりたいこと

Application Load Balancer(以下、ALB)配下のECSサービスでシンプルなアプリケーションを起動させておき、Blue/Greenデプロイによる更新をしたい!

先に結論!

ALBを使用したECS組み込みのBlue/Greenデプロイでやってくれること

  • Green環境のサービスの起動 + ターゲットの登録
  • Blue環境のサービスの終了 + ターゲットの登録解除(サービス更新の場合)
  • リスナールールの重みづけを更新
  • デプロイ中のAWS Lambda(以下、Lambda)関数のフック
  • サーキットブレーカーによるロールバック
  • Amazon CloudWatchアラームによるロールバック

など...

事前準備

極力シンプルな構成で検証をおこないます。

リソース 数量 主要設定要件
Application Load Balancer 1 パブリックサブネットの複数AZ配置
プライマリターゲットグループ(Blue) 1 TargetType: IP
代替ターゲットグループ(Green) 1 TargetType: IP
プロダクションリスナー 1 ポート80
プロダクションリスナールール 1 Blue環境に100%転送
Green環境に0%転送
ECSクラスター 1 -
ECSサービス 1 タスク定義を指定
ECRイメージ(Blue環境用) 1 Blue環境用イメージ
ECRイメージ(Green環境用) 1 Green環境用イメージ
ECSタスク定義(Blue環境用) 1 Blue環境用イメージを指定
ECSタスク定義(Green環境用) 1 Green環境用イメージを指定
ELB管理ロール 1 ELBリソース管理権限
タスク実行ロール 1 ECR、CloudWatch Logs権限
タスクロール 1 タスク固有の権限


Blueターゲットグループにはアクティブなターゲットが1つ、Greenターゲットグループにはターゲット無しの状態です。 リスナールールでは100%のトラフィックをBlueターゲットグループに転送しています。 resourcemap_1.png


ターゲットグループ: ecs-test-tg-blueでは、Blue Environmentと表示されるシンプルなサービスをターゲットにしておきます。
こちらをターゲットグループ: ecs-test-tg-greenの、Green Environmentと表示されるサービスに更新していきます。

blue_apprication.png \

ELB管理ロールとして、ECS ServiceがALBの設定変更をできるIAMロールを用意する必要があります。

  • 許可ポリシー: AmazonECSInfrastructureRolePolicyForLoadBalancers ※AWSマネージドポリシー
  • 信頼ポリシー: ※下記参照
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Principal": {
                "Service": "ecs.amazonaws.com"
            },
            "Effect": "Allow",
            "Action": "sts:AssumeRole"
        }
    ]
}

Blue/Greenデプロイの実行

いよいよBlue/Greenデプロイです。マネジメントコンソールから実施していきます。


1. ECSコンソールから対象の[クラスター] - [サービス]をクリックします。

2. [サービスを更新]をクリックします。

3. デプロイ設定を入力します。

設定項目 設定値 説明
新しいデプロイの強制 有効 -
タスク定義ファミリー flask-test-app Green環境のタスク定義
タスク定義のリビジョン 6 Green環境のタスク定義のリビジョン
デプロイ戦略 ブルー/グリーン -
ベイク時間 5(分) Greenサービス作成後、Blueサービスを終了させるまでの待機時間
デプロイライフサイクルフック - オプション 未設定 デプロイ時のテスト等を実行するLambda関数を指定可能
Amazon ECS デプロイサーキットブレーカーを使用する 有効 デプロイの失敗を検知する
失敗時のロールバック 有効 サーキットブレーカーでデプロイの失敗を検知した場合、Blue環境にロールバックする
CloudWatch アラームを使用 無効 設定したCloudWatchアラームの状態がALARMの時にロールバック可能

deploy1.png deploy2.png


4. ロードバランシングを設定します。

設定項目 設定値 説明
ロードバランシングを使用 有効 -
VPC 既存のVPC -
ロール 事前準備で作成したIAMロール -
ロードバランサーの種類 Application Load Balancer -
コンテナ 既存のコンテナ -
ロードバランサー 既存のロードバランサー -
リスナー 既存のリスナー 更新対象のリスナー
本番リスナールール 優先度: default トラフィックをGreenターゲットに向けて移行するリスナールール
テストリスナー - オプション 未設定 トラフィックをGreenターゲットに向けてテストするリスナー
テストリスナールール - オプション、推奨 未設定 トラフィックをGreenターゲットに向けてテストするリスナールール
オプション 2 つの既存のターゲットグループを使用 新規作成も可能
ターゲットグループ ecs-test-tg-blue Blueターゲットグループ
代替ターゲットグループ ecs-test-tg-green Greenターゲットグループ

deploy3.png deploy4.png

5. [更新]をクリックします。


Blue/Greenデプロイの実行中の挙動

1. Green環境のタスクが起動し、一時的に2つのタスクが起動している状態になります。

deploy5.png

2. Green環境のタスクが起動後、すぐにリスナールールが書き換えられました。

  • Blue環境のターゲットグループへのトラフィック: 100%→0%
  • Green環境のターゲットグループへのトラフィック: 0%→100%

deploy6.png

3. ウェブブラウザではGreen Environmentと表示され、Greenターゲットにルーティングされていることが確認できます。

green_apprication.png

4. Green環境の起動からベイク時間の5分経過後、Blue環境のタスクが自動削除されました。

deploy7.png

5. ALBのリソースマップから、リスナールールとターゲットグループの関連付けが更新されたことが確認できます。

deploy8.png

気づいたこと①

AWS CodeDeploy(以下、CodeDeploy)のLinearデプロイやCanaryデプロイと違い、少しずつ新環境にトラフィックを移行する事はできません。一度にすべてのトラフィックを移行する仕様となっています。

Lambda関数をフックしたり、別のターゲットグループに切り戻すといった用途に適しているため、「十分にテストコードを用意できているが、もしもの時にはすぐにロールバックしたい」という要件に適しているように思います。

これらはCodeDeployからの移行を考える際にネックになりそうですが、今後のアップデートに期待です。

気づいたこと②

ベイク時間の上限が1日(1,440分)となっており、1日以上のBlue環境の存続が出来ません。

しかしサービスの更新(UpdateService)ではなく、サービスの作成(CreateService)によりBlue/Greenデプロイを実行した場合、Blue環境のサービスは自動削除されません。

1日以上のテストを実施した後、リスナールール更新とBlueサービスの削除を行うことでアプリの更新が可能です。

これらをスクリプト化しておくと、1日以上のテスト+複数サービスの同時アップデートが必要な場合にも、ある程度コントロールできそうです。かなり力技ですが。

気づいたこと③

コンソール上に「ブルー/グリーンデプロイでは、ロードバランシングおよび/または Service Connect を設定することをお勧めします」とありますが...

other1.png

実際は「お勧め」ではなく「必須」の設定です。同一画面上で矛盾した説明になってました。

other2.png

おわりに

この記事がどなたかのお役に立てれば幸いです。

この記事は私が書きました

森 翔吾

記事一覧

最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。

森 翔吾

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。