CodeDeploy によるブルー/グリーンデプロイ - Amazon Elastic Container Service

CodeDeploy によるブルー/グリーンデプロイ

Blue/Green デプロイタイプでは、CodeDeploy によって制御される Blue/Green デプロイモデルを使用します。このデプロイタイプでは、本番稼働用トラフィックを送信する前にサービスの新しいデプロイメントを検証することができます。詳細については、AWS CodeDeployユーザーガイドの「CodeDeploy とは」を参照してください。

Blue/Green デプロイ中にトラフィックを移行するには、次の 3 つの方法があります。

  • Canary - トラフィックを 2 回の増分で移行します。事前定義された複数の Canary オプションから選択し、最初の増分および間隔でトラフィックを更新済みタスクセットに移行する割合 (%) を分単位で指定できます。次に 2 回目の増分で残りのトラフィックを移行します。

  • 線形 - トラフィックを毎回、同じ増分、同じ間隔 (分) で移行します。事前定義された複数の線形オプションから選択し、増分ごとに移行するトラフィックの割合 (%) と増分間の間隔 (分) を指定できます。

  • 一括 - すべてのタスクを元のタスクセットから更新済みタスクセットに同時に移行します。

以下に示しているのは、サービスが Blue/Green デプロイタイプを使用するときに Amazon ECS が使用する CodeDeploy のコンポーネントです。

CodeDeploy アプリケーション

CodeDeploy リソースのコレクション これは 1 つ以上のデプロイグループで構成されます。

CodeDeploy デプロイグループ

デプロイ設定。これには以下の構成要素があります。

  • Amazon ECS クラスターとサービス

  • ロードバランサーのターゲットグループとリスナー情報

  • デプロイメントロールバック戦略

  • トラフィックルーティング設定

  • 元のリビジョンの終了設定

  • デプロイ設定

  • デプロイを停止するために設定できる CloudWatch アラームの設定

  • 通知用の SNS または CloudWatch Eventsの設定

詳細については、AWS CodeDeployユーザーガイドの「デプロイグループの操作」を参照してください。

CodeDeploy デプロイの設定

デプロイ中に本番トラフィックを置換タスクに CodeDeploy がルーティングする方法を指定します。次の事前定義された線形および Canary デプロイ設定を使用できます。また、カスタム定義の線形および Canary デプロイを作成することもできます。詳細については、ユーザーガイドAWS CodeDeployの「デプロイ設定の操作」を参照してください。

デプロイ設定

説明

CodeDeployDefault.ECSLinear10PercentEvery1Minutes

すべてのトラフィックを移行するまで、1 分ごとにトラフィックの 10% を移行します。

CodeDeployDefault.ECSLinear10PercentEvery3Minutes

すべてのトラフィックを移行するまで、3 分ごとにトラフィックの 10% を移行します。

CodeDeployDefault.ECSCanary10percent5Minutes

最初の増分でトラフィックの 10% を移行します。残りの 90% は 5 分後にデプロイします。

CodeDeployDefault.ECSCanary10percent15Minutes

最初の増分でトラフィックの 10% を移行します。残りの 90 パーセントは 15 分後にデプロイされます。

CodeDeployDefault.ECSAllAtOnce

すべてのトラフィックを同時に更新済み Amazon ECS コンテナに移行します。

リビジョン

リビジョンは、CodeDeploy アプリケーション仕様ファイル (AppSpec ファイル) です。AppSpec ファイルでは、タスク定義の完全な ARN と置換タスクセットのコンテナとポートを指定し、新しいデプロイが作成時にトラフィックがルーティングされるようにします。コンテナ名は、タスク定義内で参照されているコンテナ名のいずれかに設定する必要があります。ネットワーク設定またはプラットフォームのバージョンがサービス定義で更新された場合は、AppSpec ファイルでその詳細についても指定する必要があります。また、デプロイライフサイクルイベント中に実行する Lambda 関数も指定できます。Lambda 関数を使用することで、デプロイ中にテストを実行し、メトリクスを返すことができます。詳細については、AWS CodeDeployユーザーガイドで「AppSpec File リファレンス」を参照してください。

Blue/Green デプロイの考慮事項

Blue/Green デプロイタイプを使用するときは、以下の点を考慮します。

  • Blue/Green デプロイタイプを使用して、Amzon ECS サービスが最初に作成されたとき、Amazon ECS タスクセットが作成されます。

  • Application Load Balancer または Network Load Balancer を使用するようにサービスを設定する必要があります。Classic Load Balancer はサポートされていません。ロードバランサーの要件は以下のとおりです。

    • 本番稼働用リスナーをロードバランサーに追加する必要があります。これは本番トラフィックをルーティングするために使用されます。

    • オプションテストリスナーをロードバランサーに追加することができます。これはテストトラフィックをルーティングするために使用されます。テストリスナーを指定する場合、CodeDeploy はデプロイ中にテストトラフィックを置換タスクセットにルーティングします。

    • 本番稼働用とテストリスナーの両方が同じロードバランサーに属している必要があります。

    • ロードバランサーに対してターゲットグループを定義する必要があります。ターゲットグループは本番稼働用リスナーを通じてトラフィックをサービスの元のタスクセットにルーティングします。

    • Network Load Balancer を使用する場合、CodeDeployDefault.ECSAllAtOnce デプロイ構成のみがサポートされます。

  • サービス Auto Scaling と blue/green デプロイタイプを使用するように設定されたサービスでは、Auto Scaling はデプロイ中にブロックされませんが、状況によってはデプロイが失敗する場合があります。以下では、この動作について詳しく説明します。

    • サービスがスケーリング中の状態でデプロイが開始されると、Green タスクセットが作成され、CodeDeploy は Green タスクセットが定常状態になるまで最大 1 時間待機し、完了するまでトラフィックをシフトしません。

    • サービスが Blue/Green デプロイのプロセス中で、スケーリングイベントが発生した場合、トラフィックは 5 分間シフトし続けます。サービスが 5 分以内に定常状態にならない場合、CodeDeploy はデプロイを停止し、失敗としてマークします。

  • Fargate 起動タイプ、または CODE_DEPLOY デプロイコントローラータイプを使用するタスクは、DAEMON スケジューリング戦略をサポートしません。

  • 最初に CodeDeploy アプリケーションおよびデプロイグループを作成する際に、以下を指定する必要があります。

    • ロードバランサーに対して 2 つのターゲットグループを定義する必要があります。1 つのターゲットグループは、Amazon ECS サービスの作成時に、ロードバランサーに対して定義された最初のターゲットグループです。2 番目のターゲットグループの唯一の要件は、サービスが使用するものとは別のロードバランサーに関連付けることはできないということです。

  • Amazon ECS サービスに対して CodeDeploy デプロイを作成すると、CodeDeploy は置換タスクセット (または Green タスクセット) をデプロイで作成します。テストリスナーをロードバランサーに追加した場合、CodeDeploy はテストトラフィックを置換タスクセットにルーティングします。この時点で検証テストを実行できます。次に、CodeDeploy は本番稼働用トラフィックを元のタスクセットから置換タスクセットに再ルーティングします。このときデプロイグループへのトラフィックの再ルーティング設定に従います。

Amazon ECS コンソールのエクスペリエンス

Amazon ECS コンソールのサービス作成とサービス更新のワークフローでは Blue/Green デプロイがサポートされています。

Blue/Green デプロイタイプを使用する Amazon ECS サービスを作成するには、「Amazon ECS サービスの作成」を参照してください。

Blue/Green デプロイタイプを使用している既存の Amazon ECS サービスを更新するには、「サービスの更新」を参照してください。

Blue/Green デプロイタイプを使用した Amazon ECS サービスを Amazon ECS コンソールを使用して作成するとき、Amazon ECS タスクセットと次の CodeDeploy リソースは次のデフォルト設定で自動的に作成されます。

リソース

デフォルト設定

アプリケーション名

AppECS-<cluster[:47]>-<service[:47]>

デプロイグループ名

DgpECS-<cluster[:47]>-<service[:47]>

Deployment group load balancer info (デプロイグループのロードバランサー情報)

ロードバランサー本番稼働用リスナー、オプションテストリスナー、指定されたターゲットグループは、デプロイグループ設定に追加されます。

トラフィックルーティング設定

トラフィックの再ルーティング - デフォルトでは [Reroute traffic immediately (すぐにトラフィックを再ルーティング)] に設定されます。これは CodeDeploy コンソールで、または TrafficRoutingConfig を更新することで変更できます。詳細については、「AWS CodeDeployAPI リファレンス」の「CreateDeploymentConfig」を参照してください。

元のリビジョンの終了設定

元のリビジョン終了設定が、Blue タスクセットを終了する前に、トラフィックが再ルーティングされた後 1 時間待機するように設定されます。

デプロイ設定

デプロイ設定は、デフォルトで CodeDeployDefault.ECSAllAtOnce に設定されます。この場合、すべてのトラフィックは Blue タスクセットから Green タスクセットに同時にルーティングされます。デプロイ設定は、サービスの作成後に AWS CodeDeploy コンソールを使用して変更できます。

Automatic rollback configuration (自動ロールバックの設定)

デプロイメントが失敗すると、自動ロールバック設定がロールバックするように指定されます。

Blue/Green デプロイタイプを使用する Amazon ECS サービスの詳細を表示するには、Amazon ECS コンソールで [Deployments (デプロイ)] タブを使用します。

CodeDeploy デプロイグループの詳細を CodeDeploy コンソールで表示するには、AWS CodeDeployユーザーガイドCodeDeploy を使用したデプロイグループの詳細の表示を参照してください。

CodeDeploy コンソールで CodeDeploy デプロイグループの設定を変更するには、AWS CodeDeployユーザーガイドの「CodeDeploy を使用したデプロイグループの設定の変更」を参照してください。

Blue/Green デプロイを実行するためのサポートが AWS CloudFormation に追加されています。詳細については、[AWS CloudFormationユーザーガイド]の[AWS CloudFormationを使用した CodeDeploy による Perform Amazon ECS Blue/Green デプロイの実行]を参照してください。

IAM アクセス権限が必要な Blue/Green デプロイ

Amazon ECS Blue/Green デプロイは、Amazon ECS と CodeDeploy API の組み合わせによって実現されています。IAM ユーザーは、Amazon ECS Blue/Green デプロイを使用するには、まず、これらのサービスに対する適切なアクセス権限が必要です。AWS Management ConsoleまたはAWS CLIまたは SDK を使用します。

サービスの作成や更新に使用するデフォルトの IAM アクセス権限に加えて、Amazon ECS には次のアクセス権限が必要です。IAM の AmazonECS_FullAccess ポリシーには、次のアクセス権限が追加されています。詳細については、「AmazonECS_FullAccess」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateApplication", "codedeploy:CreateDeployment", "codedeploy:CreateDeploymentGroup", "codedeploy:GetApplication", "codedeploy:GetDeployment", "codedeploy:GetDeploymentGroup", "codedeploy:ListApplications", "codedeploy:ListDeploymentGroups", "codedeploy:ListDeployments", "codedeploy:StopDeployment", "codedeploy:GetDeploymentTarget", "codedeploy:ListDeploymentTargets", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision", "codedeploy:BatchGetApplicationRevisions", "codedeploy:BatchGetDeploymentGroups", "codedeploy:BatchGetDeployments", "codedeploy:BatchGetApplications", "codedeploy:ListApplicationRevisions", "codedeploy:ListDeploymentConfigs", "codedeploy:ContinueDeployment", "sns:ListTopics", "cloudwatch:DescribeAlarms", "lambda:ListFunctions" ], "Resource": [ "*" ] } ] }
注記

タスクおよびサービスを実行するために必要なデフォルトの Amazon ECS アクセス権限を付与するだけでなく、IAM ユーザーにはタスクの IAM ロールを使用する iam:PassRole アクセス権限も必要です。

CodeDeploy には、Amazon ECS API の呼び出し、Elastic Load Balancing の変更、Lambda 関数の起動、CloudWatch アラームの記述のアクセス権限が必要です。また、ユーザーの代わりにサービスの必要数を変更するためのアクセス許可も必要です。Blue/Green デプロイタイプを使用する Amazon ECS サービスを作成する前に、IAM ロール (ecsCodeDeployRole) を作成する必要があります。詳細については、「Amazon ECS CodeDeploy IAM ロール」を参照してください。

サービス作成の例」および「サービスの更新の例」の IAM ポリシー例に、IAM ユーザーが、AWS Management Console で、Amazon ECS Blue/Green デプロイを使用するためのアクセス許可が示されています。