CodeDeploy を使用した Blue/Green デプロイ - Amazon ECS

CodeDeploy を使用した Blue/Green デプロイ

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

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

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

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

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

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

CodeDeploy アプリケーション

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

CodeDeploy デプロイグループ

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

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

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

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

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

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

  • デプロイ設定

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

  • 通知用 SNS または CloudWatch イベント の設定

詳細については、『AWS CodeDeploy User Guide』の「デプロイグループの使用」を参照してください。

CodeDeploy デプロイ設定

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

デプロイ設定

説明

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 User Guide で「AppSpec File リファレンス」を参照してください。

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

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

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

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

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

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

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

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

  • Blue/Green デプロイタイプを使用する場合、Amazon ECS サービスの Auto Scaling はサポートされません。回避策として、サービス用に作成された Application Auto Scaling スケーリングポリシーでスケーリングアクティビティを一時停止し、デプロイが完了したらプロセスを再開できます。詳細については、Application Auto Scaling ユーザーガイドの「Application Auto Scaling のスケーリングの中断と再開」を参照してください。

  • Blue/Green デプロイタイプを使用する場合、クラスターキャパシティープロバイダーはサポートされません。

  • 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 サービスを作成するには、「サービスの作成」を参照してください。

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 CodeDeploy API Reference』の「CreateDeploymentConfig」を参照してください。

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

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

デプロイ設定

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

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

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

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

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

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

Blue/Green デプロイタイプを使用したサービスの作成手順を示すチュートリアルが用意されています。詳細については、「チュートリアル: Blue/Green デプロイを使用するサービスの作成」を参照してください。

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

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

Amazon ECS Blue/Green デプロイは Amazon ECS および CodeDeploy API の組み合わせによって実現されています。IAM ユーザーは、AWS マネジメントコンソール、AWS CLI または SDK で Amazon ECS Blue/Green デプロイを使用する前に、これらのサービスに対する適切なアクセス権限が必要です。

サービスの作成や更新に使用する標準の 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 マネジメントコンソール で Amazon ECS Blue/Green デプロイを使用するためのアクセス許可が示されています。