

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 適用於 Amazon ECS 的 CodeDeploy 藍/綠部署
<a name="deployment-type-bluegreen"></a>

建議使用 Amazon ECS 藍/綠部署。如需詳細資訊，請參閱[建立 Amazon ECS 藍/綠部署](deploy-blue-green-service.md)。

*藍/綠*部署類型使用由 CodeDeploy 控制的藍/綠部署模式。使用此部署類型在傳送生產流量到服務之前，先驗證服務的新部署。如需詳細資訊，請參閱 *AWS CodeDeploy User Guide* 中的 [What Is CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)。在部署之前，驗證 Amazon ECS 服務的狀態

在藍/綠部署期間，有三種流量轉移方式：
+ **Canary**：流量以兩個增量轉移。您可以從預先定義的 canary 選項中選擇，這會指定流量轉移至您於第一次增量時更新之任務集的百分比，以及在剩餘流量於第二次增量前轉移的間隔 (以分鐘計)。
+ **線性**：流量以每個增量之間的相等分鐘數按同等增量轉移。您可從預先指定的線性選項中指定每次增量的流量轉移百分比例，以及在每個增量之間的分鐘數。
+ **一次全部**：所有流量從原始任務集一次全部轉移至更新後的任務集。

以下是當在服務使用藍/綠部署類型時，Amazon ECS 使用的 CodeDeploy 的元件：

**CodeDeploy 應用程式**  
CodeDeploy 資源的集合。這包含一或多個部署群組。

**CodeDeploy 部署群組**  
部署設定。這包含下列各項：  
+ Amazon ECS 叢集和服務
+ 負載平衡器目標群組和接聽程式資訊
+ 部署復原策略
+ 流量重新路由設定
+ 原始修訂版終止設定
+ Deployment configuration (部署組態)
+ 可以設定為停止部署的 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**：每分鐘轉移 10% 的流量，直到轉移所有流量為止。
+ **CodeDeployDefault.ECSLinear10PercentEvery3Minutes**：每 3 分鐘轉移 10% 的流量，直到轉移所有流量為止。
+ **CodeDeployDefault.ECSCanary10Percent5Minutes**：在第一次增量中轉移 10% 的流量。剩餘的 90% 會在五分鐘之後部署。
+ **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>

使用藍/綠部署類型時，請考慮下列各項：
+ 一開始建立使用藍/綠部署類型的 Amazon ECS 服務時，會建立 Amazon ECS 任務集。
+ 您必須設定服務，以使用 Application Load Balancer 或 Network Load Balancer。以下是負載平衡器需求：
  + 您必須將生產接聽器新增到負載平衡器 (用於路由傳送生產流量)。
  + 可以將選用的測試接聽器新增到負載平衡器，後者用於路由測試流量。如果您指定測試接聽程式，CodeDeploy 會在部署期間將您的測試流量路由到替代任務集。
  + 生產和測試接聽器必須屬於相同的負載平衡器。
  + 您必須為負載平衡器定義目標群組。目標群組會將流量透過生產接聽器路由到服務中的原始任務集。
  + 當使用 Network Load Balancer 時，僅支援 `CodeDeployDefault.ECSAllAtOnce` 部署組態。
+ 對於被設定為使用服務自動擴展和藍/綠部署類型的服務，自動擴展不會在部署期間被封鎖，但部署可能在某些情況下失敗。以下詳細說明此行為。
  + 若服務在擴展而部署開始，綠任務集被建立，CodeDeploy 將最長等待一個小時並且不會轉移任何流量，直至綠任務集達到穩定狀態。
  + 如果服務正在進行藍/綠部署而發生擴展事件，流量將持續轉移 5 分鐘。若服務未在 5 分鐘內達到穩定狀態，CodeDeploy 將停止部署並將其標記為失敗。
+ 使用 Fargate 或 `CODE_DEPLOY` 部署控制器類型的任務，不支援 `DAEMON` 排程策略。
+ 當您一開始建立 CodeDeploy 應用程式和部署群組時，必須指定下列項目：
  + 您必須為負載平衡器定義兩個目標群組。一個目標群組必須是建立 Amazon ECS 服務時為負載平衡器定義的初始目標群組。第二個目標群組的唯一要求是，它無法與服務所使用的負載平衡器以外的其他負載平衡器相關聯。
+ 當您為 Amazon ECS 服務建立 CodeDeploy 部署時，CodeDeploy 會在部署中建立*替代任務集* (或*綠任務集*)。如果您將測試接聽程式新增至負載平衡器，CodeDeploy 會將您的測試流量路由到替代任務集。此時您可以執行任何驗證測試。然後，CodeDeploy 會根據部署群組的流量重新路由設定，將生產流量從原始任務集重新路由到替代任務集。

## 所需的 IAM 許可
<a name="deployment-type-bluegreen-IAM"></a>

透過結合 Amazon ECS 與 CodeDeploy API 可實現藍/綠部署。使用者必須擁有這些服務的適當許可，才能在 或 AWS 管理主控台 或 AWS CLI SDKs 中使用 Amazon ECS 藍/綠部署。

除了建立和更新服務的標準 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:PassRole` 許可，才能使用任務的 IAM 角色。

CodeDeploy 需要許可來呼叫 Amazon ECS API、修改 Elastic Load Balancing、叫用 Lambda 函數和說明 CloudWatch 警示，以及代表您修改服務所需計數的許可。建立使用藍/綠部署類型的 Amazon ECS 服務之前，您必須建立一個 IAM 角色 (`ecsCodeDeployRole`)。如需詳細資訊，請參閱[Amazon ECS CodeDeploy IAM 角色](codedeploy_IAM_role.md)。