

# Amazon ECS 用の CodeDeploy ブルー/グリーンデプロイ
<a name="deployment-type-bluegreen"></a>

Amazon ECS ブルー/グリーンデプロイを使用することをお勧めします。詳細については、「[Amazon ECS ブルー/グリーンデプロイの作成](deploy-blue-green-service.md)」を参照してください。

*ブルー/グリーンデプロイ*タイプでは、CodeDeploy によって制御される ブルー/グリーンデプロイモデルを使用します。このデプロイタイプは、本番稼働用トラフィックを送信する前にサービスの新しいデプロイを検証するために使用します。詳細については、「*AWS CodeDeploy ユーザーガイド*」の「[What Is CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)」を参照してください。デプロイ前に Amazon ECS サービスの状態を検証します。

ブルー/グリーンデプロイ中にトラフィックを移行するには、次の 3 つの方法があります。
+ **Canary** - トラフィックは 2 つの増分で移行されます。事前定義された複数の Canary オプションから選択し、最初の増分および間隔でトラフィックを更新済みタスクセットに移行する割合 (%) を分単位で指定できます。次に 2 回目の増分で残りのトラフィックを移行します。
+ **Linear** - トラフィックは等しい増分で移行され、増分間の間隔 (分) も同じです。事前定義された複数の線形オプションから選択し、増分ごとに移行するトラフィックの割合 (%) と増分間の間隔 (分) を指定できます。
+ **一括** - すべてのトラフィックを元のタスクセットから更新済みタスクセットに同時に移行します。

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

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

**CodeDeploy デプロイグループ**  
デプロイ設定。これには以下の構成要素があります。  
+ Amazon ECS クラスターとサービス
+ ロードバランサーのターゲットグループとリスナー情報
+ デプロイメントロールバック戦略
+ トラフィックルーティング設定
+ 元のリビジョンの終了設定
+ デプロイ設定
+ デプロイメントを停止するために設定できる CloudWatch アラームの設定
+ 通知用の SNS または CloudWatch Eventsの設定
詳細については、*AWS CodeDeployユーザーガイド*の[「デプロイグループの操作」](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-groups.html)を参照してください。

**CodeDeploy デプロイ構成**  
デプロイメント中に本番トラフィックを置換タスクに CodeDeploy がルーティングする方法を指定します。次の事前定義された線形および Canary デプロイ設定を使用できます。また、カスタム定義の線形および Canary デプロイを作成することもできます。詳細については、*AWS CodeDeploy ユーザーガイド*の「[デプロイ構成の操作](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)」を参照してください。  
+ [**CodeDeployDefault.ECSAllAtOnce**]: すべてのトラフィックを同時に更新済みの Amazon ECS コンテナに移行します。
+ **CodeDeployDefault.ECSLinear10PercentEvery1Minutes**: すべてのトラフィックがシフトされるまで、1 分ごとにトラフィックの 10 パーセントをシフトします。
+ **CodeDeployDefault.ECSLinear10PercentEvery3Minutes**: すべてのトラフィックがシフトされるまで、3 分ごとにトラフィックの 10 パーセントをシフトします。
+ **[CodeDeployDefault.ECSCanary10Percent5Minutes]**: 最初の増分で 10 パーセントのトラフィックをシフトします。残りの 90 パーセントは 5 分後にデプロイされます。
+ **[CodeDeployDefault.ECSCanary10percent15Minutes]**: 最初の増分で 10 パーセントのトラフィックをシフトします。残りの 90 パーセントは 15 分後にデプロイされます。

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

## 考慮事項
<a name="deployment-type-bluegreen-considerations"></a>

ブルー/グリーンデプロイタイプを使用するときは、以下の点を考慮します。
+ Blue/Green デプロイタイプを使用して、Amazon ECS サービスが最初に作成されたとき、Amazon ECS タスクセットが作成されます。
+ Application Load Balancer または Network Load Balancer の使用にサービスを設定する必要があります。ロードバランサーの要件は以下のとおりです。
  + 本番稼働用リスナーをロードバランサーに追加する必要があります。これは本番トラフィックをルーティングするために使用されます。
  + オプションテストリスナーをロードバランサーに追加することができます。これはテストトラフィックをルーティングするために使用されます。テストリスナーを指定する場合、CodeDeploy はデプロイメント中にテストトラフィックを置換タスクセットにルーティングします。
  + 本番稼働用とテストリスナーの両方が同じロードバランサーに属している必要があります。
  + ロードバランサーに対してターゲットグループを定義する必要があります。ターゲットグループは本番稼働用リスナーを通じてトラフィックをサービスの元のタスクセットにルーティングします。
  + Network Load Balancer を使用する場合、`CodeDeployDefault.ECSAllAtOnce` デプロイメント構成のみがサポートされます。
+ サービスの自動スケーリングと ブルー/グリーンデプロイタイプを使用するように設定されたサービスでは、自動スケーリングはデプロイ中にブロックされませんが、状況によってはデプロイが失敗する場合があります。以下では、この動作について詳しく説明します。
  + サービスがスケーリング中の状態でデプロイが開始されると、グリーンタスクセットが作成され、CodeDeploy は Green タスクセットが定常状態になるまで最大 1 時間待機し、完了するまでトラフィックをシフトしません。
  + サービスが ブルー/グリーンデプロイのプロセス中で、スケーリングイベントが発生した場合、トラフィックは 5 分間シフトし続けます。サービスが 5 分以内に定常状態にならない場合、CodeDeploy はデプロイを停止し、失敗としてマークします。
+ Fargate または `CODE_DEPLOY` のデプロイコントローラータイプを使用するタスクは、`DAEMON` スケジューリング戦略をサポートしません。
+ 最初に CodeDeploy アプリケーションおよびデプロイグループを作成する際に、以下を指定する必要があります。
  + ロードバランサーに対して 2 つのターゲットグループを定義する必要があります。1 つのターゲットグループは、Amazon ECS サービスの作成時に、ロードバランサーに対して定義された最初のターゲットグループです。2 番目のターゲットグループの唯一の要件は、サービスが使用するものとは別のロードバランサーに関連付けることはできないということです。
+ Amazon ECS サービスに対して CodeDeploy デプロイを作成すると、CodeDeploy は*置換タスクセット* (または *Green タスクセット*) をデプロイで作成します。テストリスナーをロードバランサーに追加した場合、CodeDeploy はテストトラフィックを置換タスクセットにルーティングします。この時点で検証テストを実行できます。次に、CodeDeploy は本番稼働用トラフィックを元のタスクセットから置換タスクセットに再ルーティングします。このときデプロイグループへのトラフィックの再ルーティング設定に従います。

## 必要な IAM 許可
<a name="deployment-type-bluegreen-IAM"></a>

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

サービスの作成や更新に使用するデフォルトの IAM アクセス権限に加えて、Amazon ECS には次のアクセス権限が必要です。`AmazonECS_FullAccess` IAM ポリシーには、次の許可が追加されています。詳細については、「[AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess)」を参照してください。
+ `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`

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

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

# CodeDeploy ブルー/グリーンデプロイを Amazon ECS ブルー/グリーンデプロイに移行
<a name="migrate-codedeploy-to-ecs-bluegreen"></a>

CodeDeploy ブルー/グリーンデプロイと Amazon ECS ブルー/グリーンデプロイの機能は類似していますが、設定および管理方法が異なります。

## CodeDeploy ブルー/グリーンデプロイの概要
<a name="codedeploy-bluegreen-overview"></a>

CodeDeploy を使用して Amazon ECS サービスを作成すると、以下を実行できます。

1. 本番リスナーおよび (必要に応じて) テストリスナーを使用してロードバランサーを作成します。各リスナーは、すべてのトラフィックを単一のターゲットグループ (プライマリターゲットグループ) にルーティングする 1 つの (デフォルト) ルールで設定されます。

1. `deploymentController` タイプが `CODE_DEPLOY` に設定された状態で、リスナーおよびターゲットグループを使用するように設定された Amazon ECS サービスを作成します。サービスを作成すると、指定されたターゲットグループに登録された (ブルー) タスクセットが作成されます。

1. CodeDeploy のデプロイグループ (CodeDeploy アプリケーションの一部として) を作成し、デプロイ動作を制御する Amazon ECS クラスター、サービス名、ロードバランサーリスナー、2 つのターゲットグループ (本番のリスナールールで使用されるプライマリターゲットグループ、ならびに代替タスクに使用されるセカンダリターゲットグループ)、サービスロール (Amazon ECS および Elastic Load Balancing リソースを操作するアクセス許可を CodeDeploy に付与するため)、およびさまざまなパラメータの詳細を使って設定します。

CodeDeploy を使用すると、`CreateDeployment()` を使用してサービスの新しいバージョンがデプロイされ、CodeDeploy のアプリケーション名、デプロイグループ名、新しいリビジョンおよびオプションのライフサイクルフックの詳細を提供する AppSpec ファイルが指定されます。CodeDeploy デプロイでは代替 (緑) タスクセットが作成され、タスクがセカンダリターゲットグループに登録されます。正常になると、テスト (オプション) および本番で利用できます。どちらの場合も、グリーンタスクセットに関連付けられたセカンダリターゲットグループを指すようにリスナールールを変更することで、再ルーティングが実現します。ロールバックは、本番のリスナールールをプライマリターゲットグループに戻すことで実現します。

## Amazon ECS ブルー/グリーンデプロイの概要
<a name="ecs-bluegreen-overview"></a>

Amazon ECS ブルー/グリーンデプロイを使用すると、デプロイ設定が Amazon ECS サービス自体の一部になります。

1. 重みが 1 および 0 で構成される 2 つのターゲットグループを含むルールで、ロードバランサーの本番リスナーを事前設定する必要があります。

1. 次のリソースを指定するか、サービスリソースを更新する必要があります。
   + このリスナールールの ARN 
   + 2 つのターゲットグループ
   + Elastic Load Balancing API を呼び出すアクセス許可を Amazon ECS に付与する IAM ロール
   + Lambda 関数を実行する IAM ロール (オプション)
   + `deploymentController` タイプを `ECS` に設定し、`deploymentConfiguration.strategy` を `BLUE_GREEN` に設定します。タスクがプライマリターゲットグループに登録されている (ブルー) サービスデプロイが作成されます。

Amazon ECS ブルー/グリーンを使用すると、Amazon ECS `UpdateService()` を呼び出すことで新しいサービスリビジョンが作成され、新しいリビジョンの詳細が渡されます。サービスデプロイによって新しい (グリーン) サービスリビジョンタスクが作成され、セカンダリターゲットグループに登録されます。Amazon ECS はリスナールールの重みを切り替えることで、再ルーティングおよびロールバックオペレーションを処理します。

## 主要な実装上の相違点
<a name="implementation-differences"></a>

どちらのアプローチによってもタスクの初期セットが作成されますが、基盤となる実装は異なります。
+ CodeDeploy ではタスクセットが使用されますが、Amazon ECS ではサービスリビジョンが使用されます。Amazon ECS のタスクセットは、Amazon ECS サービスリビジョンおよびデプロイに置き換えられた古いコンストラクトです。後者はデプロイプロセス、サービスデプロイ、サービスリビジョン履歴をさらに詳細に可視化します。
+ CodeDeploy を使用すると、ライフサイクルフックは `CreateDeployment()` に提供される AppSpec ファイルの一部として指定されます。つまり、フックは 1 つのデプロイから次のデプロイに変更できます。Amazon ECS ブルー/グリーンを使用すると、フックはサービス設定の一部として指定され、更新には `UpdateService()` の呼び出しが必要になります。
+ CodeDeploy および Amazon ECS ブルー/グリーンは両方ともフック実装に Lambda を使用しますが、予想される入力および出力は異なります。

  CodeDeploy を使用すると、関数は `PutLifecycleEventHookExecutionStatus()` を呼び出してフックステータスを返す必要があり、フックステータスは `SUCCEEDED` または `FAILED` になります。Amazon ECS を使用すると、Lambda レスポンスが使用されてフックステータスが示されます。
+ CodeDeploy は各フックを 1 回限りの呼び出しとして呼び出し、最終的な実行ステータスは通常 1 時間以内に返されます。Amazon ECS フックは、`IN_PROGRESS` インジケータを返すことができるという点でより柔軟です。このインジケータにより、フックが `SUCCEEDED` または `FAILED` になるまで繰り返し呼び出される必要があることが示されます。詳細については、「[Amazon ECS サービスデプロイのライフサイクルフック](deployment-lifecycle-hooks.md)」を参照してください。

## 移行アプローチ
<a name="migration-paths"></a>

CodeDeploy ブルー/グリーンデプロイから Amazon ECS ブルー/グリーンデプロイに移行するアプローチには主に 3 つあります。各アプローチには、複雑さ、リスク、ロールバック機能、潜在的なダウンタイムの点で特性が異なります。

### CodeDeploy に使用される Elastic Load Balancing リソースと同じものを再利用します
<a name="inplace-update"></a>

CodeDeploy デプロイコントローラーの代わりに、ブルー/グリーンデプロイ戦略で Amazon ECS デプロイコントローラーを使用するように、既存の Amazon ECS サービスを更新します。このアプローチを使用する場合は、次の点を考慮してください。
+ 既存の Amazon ECS サービスデプロイコントローラーおよびデプロイ戦略を更新するため、移行手順がよりシンプルになります。
+ 正しく設定および移行されている場合、ダウンタイムはありません。
+ ロールバックには、サービスリビジョンを元に戻す必要があります。
+ ブルー/グリーン設定が並行していないため、リスクが高くなります。

CodeDeploy に使用されるロードバランサーリスナーおよびターゲットグループと同じものを使用します。CloudFormation を使用している場合は、「[CloudFormation CodeDeploy ブルー/グリーンデプロイのテンプレートを Amazon ECS ブルー/グリーン CloudFormation テンプレートへの移行](migrate-codedeploy-to-ecs-bluegreen-cloudformation-template.md)」を参照してください。

1. 本番/テストのリスナーのデフォルトルールを変更して代替ターゲットグループを含め、プライマリターゲットグループの重みを 1 に設定し、代替ターゲットグループの重みを 0 に設定します。

   CodeDeploy の場合、サービスにアタッチされたロードバランサーのリスナーは、すべてのトラフィックを単一のターゲットグループにルーティングする、1 つの (デフォルト) ルールで設定されます。Amazon ECS ブルー/グリーンの場合、ロードバランサーリスナーは重みを持つ 2 つのターゲットグループが含まれるルールで事前設定する必要があります。プライマリターゲットグループは 1 に重み付けされ、代替ターゲットグループは 0 に重み付けされる必要があります。

1. `UpdateService` API を呼び出して `deploymentController` パラメータを `ECS` に設定し、`deploymentStrategy` パラメータを `BLUE_GREEN` に設定することで、既存の Amazon ECS サービスを更新します。ターゲットグループの ARN、代替ターゲットグループ、本番リスナー、オプションのテストリスナーを指定します。

1. サービスが期待どおりに動作することを確認します。

1. 現在は Amazon ECS ブルー/グリーンを使用しているため、この Amazon ECS サービスの CodeDeploy 設定を削除します。

### 既存のロードバランサーを含む新しいサービス
<a name="new-service-existing-lb"></a>

このアプローチでは、移行にブルー/グリーン戦略を使用します。

このアプローチを使用する場合は、次の点を考慮してください。
+ 中断は最小限に抑えられます。Elastic Load Balancing のポートスワップ中にのみ発生します。
+ ロールバックには、Elastic Load Balancing のポートスワップを元に戻す必要があります。
+ 並列設定があるため、リスクが低くなります。したがって、トラフィックが移行する前にテストできます。

1. 必要に応じてこの設定に簡単にロールバックできるように、CodeDeploy 設定のリスナー、ターゲットグループ、Amazon ECS サービスはそのままにします。

1. 既存のロードバランサーの下で、新しいターゲットグループおよび新しいリスナー (元のリスナーとは異なるポートを所有) を作成します。次に、既存の Amazon ECS サービスに一致する新しい Amazon ECS サービスを作成しますが、`ECS` をデプロイコントローラー、`BLUE_GREEN` をデプロイ戦略として使用し、新しいターゲットグループおよび新しいリスナールールの ARN を渡します。

1. サービスに HTTP トラフィックを手動で送信し、新しい設定を確認します。問題がなければ、元のリスナーと新しいリスナーのポートをスワップし、トラフィックを新しい設定にルーティングします。

1. 新しい設定を確認します。依然として期待どおりにすべてが動作する場合は、CodeDeploy 設定を削除します。

### 新しいロードバランサーを持った新しいサービス
<a name="new-service-new-lb"></a>

前のアプローチと同様に、このアプローチでは移行にブルー/グリーン戦略を使用します。主な違いは、CodeDeploy 設定から Amazon ECS ブルー/グリーンの設定への切り替えが、ロードバランサーの上にあるリバースプロキシレイヤーで行われることです。リバースプロキシレイヤーのサンプル実装は、Route 53 および CloudFront です。

このアプローチはこのリバースプロキシレイヤーを既に持っているお客様に適しており、サービスとのすべての通信がこのリバースプロキシレイヤーを通じて行われている場合にも適しています (例えば、ロードバランサーレベルで直接通信がない場合など)。

このアプローチを使用する場合は、次の点を考慮してください。
+ リバースプロキシレイヤーが必要です。
+ 既存の Amazon ECS サービスデプロイコントローラーおよびデプロイ戦略を更新する必要があるため、移行手順がより複雑になります。
+ 中断は最小限に抑えられます。Elastic Load Balancing のポートスワップ中にのみ発生します。
+ ロールバックには、プロキシ設定の変更を元に戻す必要があります。
+ 並列設定があるため、リスクが低くなります。したがって、トラフィックが移行する前にテストできます。

1. 既存の CodeDeploy 設定を変更しないでください (ロードバランサー、リスナー、ターゲットグループ、Amazon ECS サービス、CodeDeploy デプロイグループ)。

1. Amazon ECS ブルー/グリーンデプロイ用に設定された新しいロードバランサー、ターゲットグループ、リスナーを作成します。

   適切なリソースを設定します。
   + Application Load Balancer – 詳細については、「[ブルー/グリーンデプロイ、リニアデプロイおよびカナリアデプロイ用の Application Load Balancer リソース](alb-resources-for-blue-green.md)」を参照してください。
   + Network Load Balancer – 詳細については、「[Amazon ECS ブルー/グリーン、リニアおよびカナリアデプロイの Network Load Balancer リソース](nlb-resources-for-blue-green.md)」を参照してください。

1. `ECS` および `BLUE_GREEN` をそれぞれデプロイコントローラーおよびデプロイ戦略とし、新しいロードバランサーリソースを指す新しいサービスを作成します。

1. 新しいロードバランサーを通じてテストすることで、新しいセットアップを確認します。

1. リバースプロキシ設定を更新し、トラフィックを新しいロードバランサーにルーティングします。

1. 新しいサービスリビジョンに従って、期待どおりにすべてが動作し続けた場合、CodeDeploy 設定を削除します。

## 次のステップ
<a name="post-migration-considerations"></a>

Amazon ECS ブルー/グリーンデプロイに移行した後
+ CodeDeploy `UpdateService` API の代わりに、Amazon ECS `CreateDeployment` API を使用するように、デプロイスクリプトと CI/CD パイプラインを更新します。
+ CodeDeploy デプロイの代わりに、Amazon ECS サービスのデプロイを追跡するように、モニタリングおよびアラートを更新します。
+ 期待どおりに機能することを確認するため、新しいデプロイプロセスの自動テストを実装することを検討してください。

# CodeDeploy ブルー/グリーンから Amazon ECS ブルー/グリーンサービスデプロイへの移行
<a name="migrate-code-deploy-to-ecs-blue-green"></a>

 Amazon ECS ブルー/グリーンデプロイを使用すると、本番環境に実装する前にサービスを変更してテストできます。

Amazon ECS ブルー/グリーンデプロイ用に新しいライフサイクルフックを作成する必要があります。

## 前提条件
<a name="migrate-code-deploy-to-ecs-blue-green-prerequisites"></a>

ブルー/グリーンデプロイを開始する前に、次の操作を実行します。

1. Amazon ECS CodeDeploy IAM ロールを次のアクセス許可に置き換えてください。
   + Elastic Load Balancing のアクセス許可の詳細については、「[ロードバランサー用の Amazon ECS インフラストラクチャの IAM ロール](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)」を参照してください。
   + Lambda のアクセス許可の詳細については、「[Amazon ECS ブルー/グリーンデプロイの Lambda 関数に必要となるアクセス許可](blue-green-permissions.md)」を参照してください。

1. CodeDeploy オートメーションをオフにします。詳細については、「*CodeDeploy ユーザーガイド*」の「[Working with deployment groups in CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-groups.html)」を参照してください。

1. CodeDeploy ブルー/グリーンデプロイに次の情報があることを確認してください。この情報は Amazon ECS ブルー/グリーンデプロイに再利用できます。
   + 本番ターゲットグループ
   + 本番リスナー
   + 本番ルール
   + テストターゲットグループ

     これはグリーンサービスリビジョンのターゲットグループです。

1. Application Load Balancer ターゲットグループがリスナールールに適切に関連付けられていることを確認してください。
   + テストリスナーを使用していない場合、両方のターゲットグループ (本番およびテスト) を本番のリスナールールに関連付ける必要があります。
   + テストリスナーを使用している場合、1 つのターゲットグループを本番のリスナールールにリンクし、もう 1 つのターゲットグループをテストのリスナールールにリンクする必要があります。

   この要件が満たされない場合、サービスのデプロイは失敗し、次のエラーが表示されます。`Service deployment rolled back because of invalid networking configuration. Both targetGroup and alternateTargetGroup must be associated with the productionListenerRule or testListenerRule.`

1. サービスに継続中のサービスデプロイがないことを確認します。詳細については、「[Amazon ECS サービスデプロイを使用してサービス履歴を表示する](service-deployment.md)」を参照してください。

1. Amazon ECS ブルー/グリーンデプロイでは、サービスが次のいずれかの機能を使用する必要があります。適切なリソースを設定してください。
   + Application Load Balancer – 詳細については、「[ブルー/グリーンデプロイ、リニアデプロイおよびカナリアデプロイ用の Application Load Balancer リソース](alb-resources-for-blue-green.md)」を参照してください。
   + Network Load Balancer – 詳細については、「[Amazon ECS ブルー/グリーン、リニアおよびカナリアデプロイの Network Load Balancer リソース](nlb-resources-for-blue-green.md)」を参照してください。
   + Service Connect – 詳細については、「[Amazon ECS ブルー/グリーンデプロイ、リニアデプロイおよびカナリアデプロイ用の Service Connect リソース](service-connect-blue-green.md)」を参照してください。

1. Amazon ECS ブルー/グリーンデプロイのステージのライフサイクルステージに Lambda 関数を実行するかどうかを決定します。
   + スケールアップ前
   + スケールアップ後
   + テストトラフィックの移行
   + テストトラフィックの移行後
   + 本番トラフィックの移行
   + 本番トラフィックの移行後

   ライフサイクルステージごとに Lambda 関数を作成します。詳細については、「*AWS Lambda デベロッパーガイド*」の「[コンソールで Lambda 関数の作成](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)」を参照してください。

サービスのデプロイコントローラーの更新の詳細については、「[Amazon ECS サービスのパラメータの更新](update-service-parameters.md)」を参照してください。

## 手順
<a name="migrate-code-deploy-to-ecs-procedure"></a>

1. コンソールを[https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)で開きます。

1. **[クラスター]** ページで、クラスターを選択します。

   クラスター詳細のページが表示されます。

1. **[サービス]** タブでサービスを選択します。

   [サービスの詳細] ページが表示されます。

1. バナーで **[デプロイコントローラータイプの更新]** を選択します。

   **[デプロイコントローラータイプの移行]** ページが表示されます。

1. **[新規]** を展開し、次のパラメータを指定します。

   1. **[デプロイコントローラータイプ]** では **[ECS]** を選択します。

   1. **[デプロイ戦略]** では、**[ブルー/グリーン]** を選択します。

   1. **[ベイク時間]** には、ブルーおよびグリーンのサービスリビジョンの両方が実行される時間を入力します。

   1. ライフサイクルステージに Lambda 関数を実行するには、**[デプロイライフサイクルフック]** で一意の Lambda 関数ごとに次の操作を行います。

      1. **[Add]** (追加) を選択します。

         実行する一意の関数ごとにこの操作を繰り返します。

      1. **[Lambda 関数]** には、関数名を入力します。

      1. **[ロール]** には、ブルー/グリーンのアクセス許可を持つ前提条件で作成したロールを選択します。

         詳細については、「[Amazon ECS ブルー/グリーンデプロイの Lambda 関数に必要となるアクセス許可](blue-green-permissions.md)」を参照してください。

      1. **[ライフサイクルステージ]** には、Lambda 関数が実行されるステージを選択します。

      1.  (オプション) **[フックの詳細]** には、フックに関する情報を提供するキーおよび値のペアを入力します。

1. **[ロードバランシング]** を展開し、次の内容を設定します。

   1. **[ロール]** には、ブルー/グリーンのアクセス許可を持つ前提条件で作成したロールを選択します。

      詳細については、「[Amazon ECS ブルー/グリーンデプロイの Lambda 関数に必要となるアクセス許可](blue-green-permissions.md)」を参照してください。

   1. **[リスナー]** には、CodeDeploy ブルー/グリーンデプロイから本番リスナーを選択します。

   1. **[本番ルール]** には、CodeDeploy ブルー/グリーンデプロイから本番ルールを選択します。

   1. **[テストルール]** には、CodeDeploy ブルー/グリーンデプロイからテストルールを選択します。

   1. **[ターゲットグループ]** には、CodeDeploy ブルー/グリーンデプロイから本番ターゲットグループを選択します。

   1. **[代替ターゲットグループ]** には、CodeDeploy ブルー/グリーンデプロイからテストターゲットグループを選択します。

1. **[更新]** を選択します。

## 次のステップ
<a name="migrate-code-deploy-to-ecs-blue-green-next-steps"></a>
+ サービスを更新してデプロイを開始します。詳細については、「[Amazon ECS サービスを更新する](update-service-console-v2.md)」を参照してください。
+ デプロイプロセスをモニタリングし、ブルー/グリーンのパターンに従っていることを確認します。
  + グリーンサービスリビジョンが作成され、スケールアップされる
  + テストトラフィックがグリーンリビジョンにルーティングされている (設定されている場合)
  + 本番トラフィックがグリーンリビジョンに移行されている
  + ベイク時間が過ぎたら、ブルーリビジョンが終了する

# CloudFormation CodeDeploy ブルー/グリーンデプロイのテンプレートを Amazon ECS ブルー/グリーン CloudFormation テンプレートへの移行
<a name="migrate-codedeploy-to-ecs-bluegreen-cloudformation-template"></a>

Amazon ECS サービスの CodeDeploy ブルー/グリーンデプロイを使用する CloudFormation テンプレートを、ネイティブの Amazon ECS ブルー/グリーンデプロイ戦略を使用するテンプレートに移行します。移行は、「CodeDeploy に使用した Elastic Load Balancing リソースと同じものを再利用する」アプローチに従います。詳細については、「[CodeDeploy ブルー/グリーンデプロイを Amazon ECS ブルー/グリーンデプロイに移行](migrate-codedeploy-to-ecs-bluegreen.md)」を参照してください。

## ソーステンプレート
<a name="source-template"></a>

このテンプレートは `AWS::CodeDeployBlueGreen` 変換および `AWS::CodeDeploy::BlueGreen` フックを使用し、Amazon ECS サービスにブルー/グリーンデプロイを実装します。

### ソース
<a name="code-deploy-source"></a>

これは CodeDeploy ブルー/グリーンデプロイを使用する完全な CloudFormation テンプレートです。詳細については、「*AWS CloudFormation ユーザーガイド*」の「[ブルー/グリーンデプロイテンプレートの例](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green-template-example.html#blue-green-template-example.json)」を参照してください。

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "Vpc": {
      "Type": "AWS::EC2::VPC::Id"
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet::Id"
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet::Id"
    }
  },
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  "Hooks": {
    "CodeDeployBlueGreenHook": {
      "Type": "AWS::CodeDeploy::BlueGreen",
      "Properties": {
        "TrafficRoutingConfig": {
          "Type": "TimeBasedCanary",
          "TimeBasedCanary": {
            "StepPercentage": 15,
            "BakeTimeMins": 5
          }
        },
        "Applications": [
          {
            "Target": {
              "Type": "AWS::ECS::Service",
              "LogicalID": "ECSDemoService"
            },
            "ECSAttributes": {
              "TaskDefinitions": [
                "BlueTaskDefinition",
                "GreenTaskDefinition"
              ],
              "TaskSets": [
                "BlueTaskSet",
                "GreenTaskSet"
              ],
              "TrafficRouting": {
                "ProdTrafficRoute": {
                  "Type": "AWS::ElasticLoadBalancingV2::Listener",
                  "LogicalID": "ALBListenerProdTraffic"
                },
                "TargetGroups": [
                  "ALBTargetGroupBlue",
                  "ALBTargetGroupGreen"
                ]
              }
            }
          }
        ]
      }
    }
  },
  "Resources": {
    "ExampleSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Security group for ec2 access",
        "VpcId": {"Ref": "Vpc"},
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 8080,
            "ToPort": 8080,
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "ALBTargetGroupBlue": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 5,
        "HealthCheckPath": "/",
        "HealthCheckPort": "80",
        "HealthCheckProtocol": "HTTP",
        "HealthCheckTimeoutSeconds": 2,
        "HealthyThresholdCount": 2,
        "Matcher": {
          "HttpCode": "200"
        },
        "Port": 80,
        "Protocol": "HTTP",
        "Tags": [
          {
            "Key": "Group",
            "Value": "Example"
          }
        ],
        "TargetType": "ip",
        "UnhealthyThresholdCount": 4,
        "VpcId": {"Ref": "Vpc"}
      }
    },
    "ALBTargetGroupGreen": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 5,
        "HealthCheckPath": "/",
        "HealthCheckPort": "80",
        "HealthCheckProtocol": "HTTP",
        "HealthCheckTimeoutSeconds": 2,
        "HealthyThresholdCount": 2,
        "Matcher": {
          "HttpCode": "200"
        },
        "Port": 80,
        "Protocol": "HTTP",
        "Tags": [
          {
            "Key": "Group",
            "Value": "Example"
          }
        ],
        "TargetType": "ip",
        "UnhealthyThresholdCount": 4,
        "VpcId": {"Ref": "Vpc"}
      }
    },
    "ExampleALB": {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Scheme": "internet-facing",
        "SecurityGroups": [
          {"Ref": "ExampleSecurityGroup"}
        ],
        "Subnets": [
          {"Ref": "Subnet1"},
          {"Ref": "Subnet2"}
        ],
        "Tags": [
          {
            "Key": "Group",
            "Value": "Example"
          }
        ],
        "Type": "application",
        "IpAddressType": "ipv4"
      }
    },
    "ALBListenerProdTraffic": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "DefaultActions": [
          {
            "Type": "forward",
            "ForwardConfig": {
              "TargetGroups": [
                {
                  "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
                  "Weight": 1
                }
              ]
            }
          }
        ],
        "LoadBalancerArn": {"Ref": "ExampleALB"},
        "Port": 80,
        "Protocol": "HTTP"
      }
    },
    "ALBListenerProdRule": {
      "Type": "AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties": {
        "Actions": [
          {
            "Type": "forward",
            "ForwardConfig": {
              "TargetGroups": [
                {
                  "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
                  "Weight": 1
                }
              ]
            }
          }
        ],
        "Conditions": [
          {
            "Field": "http-header",
            "HttpHeaderConfig": {
              "HttpHeaderName": "User-Agent",
              "Values": [
                "Mozilla"
              ]
            }
          }
        ],
        "ListenerArn": {"Ref": "ALBListenerProdTraffic"},
        "Priority": 1
      }
    },
    "ECSTaskExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Sid": "",
              "Effect": "Allow",
              "Principal": {
                "Service": "ecs-tasks.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
        ]
      }
    },
    "BlueTaskDefinition": {
      "Type": "AWS::ECS::TaskDefinition",
      "Properties": {
        "ExecutionRoleArn": {"Fn::GetAtt": ["ECSTaskExecutionRole", "Arn"]},
        "ContainerDefinitions": [
          {
            "Name": "DemoApp",
            "Image": "nginxdemos/hello:latest",
            "Essential": true,
            "PortMappings": [
              {
                "HostPort": 80,
                "Protocol": "tcp",
                "ContainerPort": 80
              }
            ]
          }
        ],
        "RequiresCompatibilities": [
          "FARGATE"
        ],
        "NetworkMode": "awsvpc",
        "Cpu": "256",
        "Memory": "512",
        "Family": "ecs-demo"
      }
    },
    "ECSDemoCluster": {
      "Type": "AWS::ECS::Cluster",
      "Properties": {}
    },
    "ECSDemoService": {
      "Type": "AWS::ECS::Service",
      "Properties": {
        "Cluster": {"Ref": "ECSDemoCluster"},
        "DesiredCount": 1,
        "DeploymentController": {
          "Type": "EXTERNAL"
        }
      }
    },
    "BlueTaskSet": {
      "Type": "AWS::ECS::TaskSet",
      "Properties": {
        "Cluster": {"Ref": "ECSDemoCluster"},
        "LaunchType": "FARGATE",
        "NetworkConfiguration": {
          "AwsVpcConfiguration": {
            "AssignPublicIp": "ENABLED",
            "SecurityGroups": [
              {"Ref": "ExampleSecurityGroup"}
            ],
            "Subnets": [
              {"Ref": "Subnet1"},
              {"Ref": "Subnet2"}
            ]
          }
        },
        "PlatformVersion": "1.4.0",
        "Scale": {
          "Unit": "PERCENT",
          "Value": 100
        },
        "Service": {"Ref": "ECSDemoService"},
        "TaskDefinition": {"Ref": "BlueTaskDefinition"},
        "LoadBalancers": [
          {
            "ContainerName": "DemoApp",
            "ContainerPort": 80,
            "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"}
          }
        ]
      }
    },
    "PrimaryTaskSet": {
      "Type": "AWS::ECS::PrimaryTaskSet",
      "Properties": {
        "Cluster": {"Ref": "ECSDemoCluster"},
        "Service": {"Ref": "ECSDemoService"},
        "TaskSetId": {"Fn::GetAtt": ["BlueTaskSet", "Id"]}
      }
    }
  }
}
```

## 移行手順
<a name="migration-steps"></a>

### CodeDeploy 固有のリソースを削除する
<a name="remove-codedeploy-resources"></a>

次のプロパティが不要になりました。
+ `AWS::CodeDeployBlueGreen` 変換
+ `CodeDeployBlueGreenHook` フック
+ `GreenTaskDefinition` および `GreenTaskSet` リソース (Amazon ECS によって管理される)
+ `PrimaryTaskSet` リソース (Amazon ECS によって内部でタスクセットが管理される)

### ロードバランサーリスナーを再設定する
<a name="reconfigure-load-balancer"></a>

`ALBListenerProdTraffic` リソースを変更して、2 つのターゲットグループを持つ転送アクションを使用します。

```
{
  "DefaultActions": [
    {
      "Type": "forward",
      "ForwardConfig": {
        "TargetGroups": [
          {
            "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
            "Weight": 1
          },
          {
            "TargetGroupArn": {"Ref": "ALBTargetGroupGreen"},
            "Weight": 0
          }
        ]
      }
    }
  ]
}
```

### デプロイプロパティを更新します
<a name="update-ecs-service"></a>

次の内容を更新して追加します。
+ `DeploymentController` プロパティを `EXTERNAL` から `ECS` に更新します。
+ `Strategy` プロパティを追加して、BLUE\$1GREEN に設定します。
+ `BakeTimeInMinutes` プロパティを追加します。

  ```
  {
    "DeploymentConfiguration": {
      "MaximumPercent": 200,
      "MinimumHealthyPercent": 100,
      "DeploymentCircuitBreaker": {
        "Enable": true,
        "Rollback": true
      },
      "BakeTimeInMinutes": 5,
      "Strategy": "BLUE_GREEN"
    }
  }
  ```
+ ロードバランサー設定をサービスに追加します。

  ```
  {
    "LoadBalancers": [
      {
        "ContainerName": "DemoApp",
        "ContainerPort": 80,
        "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
        "AdvancedConfiguration": {
          "AlternateTargetGroupArn": {"Ref": "ALBTargetGroupGreen"},
          "ProductionListenerRule": {"Ref": "ALBListenerProdRule"},
          "RoleArn": {"Fn::GetAtt": ["ECSInfrastructureRoleForLoadBalancers", "Arn"]}
        }
      }
    ]
  }
  ```
+ サービスにタスク定義リファレンスを追加します。

  ```
  {
    "TaskDefinition": {"Ref": "BlueTaskDefinition"}
  }
  ```

### AmazonECSInfrastructureRolePolicyForLoadBalancers ロールを作成します
<a name="create-ecs-service-role"></a>

Amazon ECS にロードバランサーリソースの管理を可能にする新しい IAM ロールを追加します。詳細については、[ロードバランサー用の Amazon ECS インフラストラクチャの IAM ロール](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)を参照してください。

## レコメンデーションのテスト
<a name="testing-recommendations"></a>

1. 移行したテンプレートを非本番環境にデプロイします。

1. サービスが初期設定で正しくデプロイされることを確認してください。

1. タスク定義を更新してブルー/グリーンデプロイプロセスを観察することで、デプロイをテストします。

1. ブルーおよびグリーンのデプロイの間でトラフィックが正しく移行されることを確認してください。

1. デプロイの失敗を強制し、ロールバック機能をテストします。

## 移行後のテンプレート
<a name="migrated-template"></a>

### 最終テンプレート
<a name="ecs-bluegreen-template"></a>

これは、Amazon ECS ブルー/グリーンデプロイを使用する完全な CloudFormation テンプレートです。

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "Vpc": {
      "Type": "AWS::EC2::VPC::Id"
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet::Id"
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet::Id"
    }
  },
  "Resources": {
    "ExampleSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Security group for ec2 access",
        "VpcId": {"Ref": "Vpc"},
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 8080,
            "ToPort": 8080,
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "ALBTargetGroupBlue": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 5,
        "HealthCheckPath": "/",
        "HealthCheckPort": "80",
        "HealthCheckProtocol": "HTTP",
        "HealthCheckTimeoutSeconds": 2,
        "HealthyThresholdCount": 2,
        "Matcher": {
          "HttpCode": "200"
        },
        "Port": 80,
        "Protocol": "HTTP",
        "Tags": [
          {
            "Key": "Group",
            "Value": "Example"
          }
        ],
        "TargetType": "ip",
        "UnhealthyThresholdCount": 4,
        "VpcId": {"Ref": "Vpc"}
      }
    },
    "ALBTargetGroupGreen": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 5,
        "HealthCheckPath": "/",
        "HealthCheckPort": "80",
        "HealthCheckProtocol": "HTTP",
        "HealthCheckTimeoutSeconds": 2,
        "HealthyThresholdCount": 2,
        "Matcher": {
          "HttpCode": "200"
        },
        "Port": 80,
        "Protocol": "HTTP",
        "Tags": [
          {
            "Key": "Group",
            "Value": "Example"
          }
        ],
        "TargetType": "ip",
        "UnhealthyThresholdCount": 4,
        "VpcId": {"Ref": "Vpc"}
      }
    },
    "ExampleALB": {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Scheme": "internet-facing",
        "SecurityGroups": [
          {"Ref": "ExampleSecurityGroup"}
        ],
        "Subnets": [
          {"Ref": "Subnet1"},
          {"Ref": "Subnet2"}
        ],
        "Tags": [
          {
            "Key": "Group",
            "Value": "Example"
          }
        ],
        "Type": "application",
        "IpAddressType": "ipv4"
      }
    },
    "ALBListenerProdTraffic": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "DefaultActions": [
          {
            "Type": "forward",
            "ForwardConfig": {
              "TargetGroups": [
                {
                  "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
                  "Weight": 1
                },
                {
                  "TargetGroupArn": {"Ref": "ALBTargetGroupGreen"},
                  "Weight": 0
                }
              ]
            }
          }
        ],
        "LoadBalancerArn": {"Ref": "ExampleALB"},
        "Port": 80,
        "Protocol": "HTTP"
      }
    },
    "ALBListenerProdRule": {
      "Type": "AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties": {
        "Actions": [
          {
            "Type": "forward",
            "ForwardConfig": {
              "TargetGroups": [
                {
                  "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
                  "Weight": 1
                },
                {
                  "TargetGroupArn": {"Ref": "ALBTargetGroupGreen"},
                  "Weight": 0
                }
              ]
            }
          }
        ],
        "Conditions": [
          {
            "Field": "http-header",
            "HttpHeaderConfig": {
              "HttpHeaderName": "User-Agent",
              "Values": [
                "Mozilla"
              ]
            }
          }
        ],
        "ListenerArn": {"Ref": "ALBListenerProdTraffic"},
        "Priority": 1
      }
    },
    "ECSTaskExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Sid": "",
              "Effect": "Allow",
              "Principal": {
                "Service": "ecs-tasks.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
        ]
      }
    },
    "ECSInfrastructureRoleForLoadBalancers": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Sid": "AllowAccessToECSForInfrastructureManagement",
              "Effect": "Allow",
              "Principal": {
                "Service": "ecs.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/AmazonECSInfrastructureRolePolicyForLoadBalancers"
        ]
      }
    },
    "BlueTaskDefinition": {
      "Type": "AWS::ECS::TaskDefinition",
      "Properties": {
        "ExecutionRoleArn": {"Fn::GetAtt": ["ECSTaskExecutionRole", "Arn"]},
        "ContainerDefinitions": [
          {
            "Name": "DemoApp",
            "Image": "nginxdemos/hello:latest",
            "Essential": true,
            "PortMappings": [
              {
                "HostPort": 80,
                "Protocol": "tcp",
                "ContainerPort": 80
              }
            ]
          }
        ],
        "RequiresCompatibilities": [
          "FARGATE"
        ],
        "NetworkMode": "awsvpc",
        "Cpu": "256",
        "Memory": "512",
        "Family": "ecs-demo"
      }
    },
    "ECSDemoCluster": {
      "Type": "AWS::ECS::Cluster",
      "Properties": {}
    },
    "ECSDemoService": {
      "Type": "AWS::ECS::Service",
      "Properties": {
        "Cluster": {"Ref": "ECSDemoCluster"},
        "DesiredCount": 1,
        "DeploymentController": {
          "Type": "ECS"
        },
        "DeploymentConfiguration": {
          "MaximumPercent": 200,
          "MinimumHealthyPercent": 100,
          "DeploymentCircuitBreaker": {
            "Enable": true,
            "Rollback": true
          },
          "BakeTimeInMinutes": 5,
          "Strategy": "BLUE_GREEN"
        },
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "AssignPublicIp": "ENABLED",
            "SecurityGroups": [
              {"Ref": "ExampleSecurityGroup"}
            ],
            "Subnets": [
              {"Ref": "Subnet1"},
              {"Ref": "Subnet2"}
            ]
          }
        },
        "LaunchType": "FARGATE",
        "PlatformVersion": "1.4.0",
        "TaskDefinition": {"Ref": "BlueTaskDefinition"},
        "LoadBalancers": [
          {
            "ContainerName": "DemoApp",
            "ContainerPort": 80,
            "TargetGroupArn": {"Ref": "ALBTargetGroupBlue"},
            "AdvancedConfiguration": {
              "AlternateTargetGroupArn": {"Ref": "ALBTargetGroupGreen"},
              "ProductionListenerRule": {"Ref": "ALBListenerProdRule"},
              "RoleArn": {"Fn::GetAtt": ["ECSInfrastructureRoleForLoadBalancers", "Arn"]}
            }
          }
        ]
      }
    }
  }
}
```

# CodeDeploy ブルー/グリーンから Amazon ECS ローリング更新サービスのデプロイへの移行
<a name="migrate-code-deploy-to-ecs-rolling"></a>

 サービスデプロイを CodeDeploy ブルー/グリーンデプロイから Amazon ECS ローリング更新デプロイに移行できます。CodeDeploy の依存関係から統合デプロイの使用に移行します。

Amazon ECS サービススケジューラは、現在実行中のタスクを新しいタスクに置き換えます。ローリング更新中にサービスに対して Amazon ECS が追加または削除するタスク数は、サービスデプロイ設定により制御されます。

## 前提条件
<a name="migrate-code-deploy-to-ecs-rolling-prerequisites"></a>

ブルー/グリーンデプロイを開始する前に、次の操作を実行します。

1. Amazon ECS CodeDeploy IAM ロールが不要になりました。

1. CodeDeploy オートメーションをオフにします。詳細については、「*CodeDeploy ユーザーガイド*」の「[Working with deployment groups in CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-groups.html)」を参照してください。

1. サービスに継続中のサービスデプロイがないことを確認します。詳細については、「[Amazon ECS サービスデプロイを使用してサービス履歴を表示する](service-deployment.md)」を参照してください。

サービスのデプロイコントローラーの更新の詳細については、「[Amazon ECS サービスのパラメータの更新](update-service-parameters.md)」を参照してください。

## 手順
<a name="migrate-code-deploy-to-ecs-rolling-procedure"></a>

1. コンソールを[https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)で開きます。

1. **[クラスター]** ページで、クラスターを選択します。

   クラスター詳細のページが表示されます。

1. **[サービス]** タブでサービスを選択します。

   [サービスの詳細] ページが表示されます。

1. バナーで **[移行]** を選択します。

   **[デプロイ設定の更新]** ページが表示されます。

1. **[デプロイオプション]** を展開し、次のパラメータを指定します。

   1. **[デプロイコントローラータイプ]** では **[ECS]** を選択します。

   1. **[デプロイ戦略]** には、**[ローリング更新]** を選択します。

   1. **[Min running tasks]** (実行中のタスクの最小化) の場合、デプロイ時に `RUNNING` の状態に保つ必要のあるサービス内のタスクの下限数をタスクの必要数のパーセント値 (最も近い整数に切り上げ) で入力します。詳細については、[[Deployment configuration]](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_definition_parameters.html#sd-deploymentconfiguration) (デプロイ設定) を参照してください。

   1. **[Max running tasks]** (実行中のタスクの最大化)) には、デプロイ時に `RUNNING` または `PENDING` 状態にできるサービスのタスクの上限数を必要数のタスクのパーセント値 (最も近い整数に切り下げ) で入力します。

1. **[ロードバランシング]** を展開し、次の内容で設定します。

   1. **[ロール]** には、ブルー/グリーンのアクセス許可を持つ前提条件で作成したロールを選択します。

      詳細については、「[Amazon ECS ブルー/グリーンデプロイの Lambda 関数に必要となるアクセス許可](blue-green-permissions.md)」を参照してください。

   1. **[リスナー]** には、CodeDeploy ブルー/グリーンデプロイから本番リスナーを選択します。

   1. **[ターゲットグループ]** には、CodeDeploy ブルー/グリーンデプロイから本番ターゲットグループを選択します。

1. **[更新]** を選択します。

## 次のステップ
<a name="migrate-code-deploy-to-ecs-rolling-next-steps"></a>

変更を有効にするには、サービスを更新する必要があります。詳細については、「[Amazon ECS サービスを更新する](update-service-console-v2.md)」を参照してください。