

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

# 建立 Amazon ECS Canary 部署
<a name="deploy-canary-service"></a>

透過使用 Amazon ECS Canary 部署，您可以將一小部分的流量轉移到新的服務修訂版 (「Canary」)。驗證部署，然後在指定的間隔之後一次轉移剩餘的流量。此方法可讓您在完全部署之前，以最低風險測試新功能。

## 先決條件
<a name="deploy-canary-service-prerequisites"></a>

在啟動 Canary 部署之前，請執行下列操作。

1. 設定相應的許可。
   + 如需有關 Elastic Load Balancing 許可的資訊，請參閱[負載平衡器的 Amazon ECS 基礎結構 IAM 角色](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)。
   + 如需有關 Lambda 許可的資訊，請參閱 [Amazon ECS 藍/綠部署中 Lambda 函式所需的許可](blue-green-permissions.md)。

1. Amazon ECS Canary 部署要求您的服務使用下列其中一項功能：設定適當的資源。
   + Application Load Balancer – 如需詳細資訊，請參閱[藍/綠、線性和金絲雀部署的 Application Load Balancer 資源](alb-resources-for-blue-green.md)。
   + Network Load Balancer – 如需詳細資訊，請參閱[Amazon ECS 藍/綠、線性和 Canary 部署的 Network Load Balancer 資源](nlb-resources-for-blue-green.md)。
   + Service Connect – 如需詳細資訊，請參閱[Amazon ECS 藍色/綠色、線性和 Canary 部署的 Service Connect 資源](service-connect-blue-green.md)。

## 程序
<a name="deploy-canary-service-procedure"></a>

您可以使用 主控台或 AWS CLI 來建立 Amazon ECS Canary 部署服務。

------
#### [ Console ]

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 決定您要從中啟動服務的資源。


<table>
<thead>
  <tr><th>啟動服務的資源</th><th>步驟</th><th></th></tr>
</thead>
<tbody>
  <tr><td>叢集</td><td> <ol><li> 在<b>叢集</b>頁面，選取您要在哪個叢集中建立服務。 <br />「叢集詳細資訊」頁面隨即顯示。 </li><li> 在 <b>Services (服務)</b> 標籤上，選擇 <b>Create (建立)</b>。 </li></ol> </td><td></td></tr>
  <tr><td>任務定義</td><td> <ol><li> 在<b>任務定義</b>頁面中選取任務定義。 </li><li> 從<b>部署</b>功能表中選擇<b>建立服務</b>。 </li></ol> </td><td></td></tr>
</tbody>
</table>


   **建立服務**頁面隨即顯示。

1. 在**服務詳細資訊**下，執行下列動作：

   1. 在**任務定義系列**欄位中選擇要使用的任務定義。然後，在**任務定義修訂版**欄位中輸入要使用的修訂版。

   1. 針對 **Service name** (服務名稱)，輸入服務的名稱。

1. 若要在現有叢集中執行服務，請在**現有叢集**欄位中選擇叢集。若要在新叢集中執行服務，請選擇**建立叢集** 

1. 選擇任務在叢集基礎結構中的分佈方式。在**運算組態**下選擇選項。


<table>
<thead>
  <tr><th>運算選項</th><th>步驟</th><th></th></tr>
</thead>
<tbody>
  <tr><td>容量提供者策略</td><td> <ol><li> 在 <b>Compute options</b> (運算選項) 下，選擇 <b>Capacity provider strategy</b> (容量提供者策略)。 </li><li> 選擇策略： <ul><li> 若要使用叢集的預設容量提供者策略，選擇<b>使用叢集預設</b>。 </li><li> 若您的叢集沒有預設容量提供者策略，或要使用自訂策略，選擇 <b>Use custom</b> (使用自訂)、<b>Add capacity provider strategy</b> (新增容量提供者策略)，然後透過指定 <b>Base</b> (基礎)、<b>Capacity provider</b> (容量提供者) 和 <b>Weight</b> (權重) 來定義您的自訂容量提供者策略。 </li></ul> </li></ol>  若要在策略中使用容量提供者，容量提供者必須與叢集相關聯。  </td><td></td></tr>
  <tr><td>啟動類型</td><td> <ol><li> 在<b>運算選項</b>區段中，選取<b>啟動類型</b>。 </li><li> 針對 <b>啟動類型</b>，選擇啟動類型。 </li><li> (選用) 當指定 Fargate 時，請在<b>平台版本</b>欄位中指定要使用的平台版本。如果未指定平台版本，將使用 <code>LATEST</code> 平台版本。 </li></ol> </td><td></td></tr>
</tbody>
</table>


1. 在**部署組態**下，執行下列動作：

   1. 在**服務類型**欄位中選擇**複本**。

   1. 針對 **Desired tasks** (所需任務)，輸入要在服務中啟動並維護的任務數。

   1. 若要讓 Amazon ECS 監控可用區域間的任務分佈，並在出現不平衡時重新分佈，請在**可用區域服務重新平衡**下，選取**可用區域服務重新平衡**。

   1. 在**運作狀態檢查寬限期**欄位中，輸入時間 (以秒為單位)，這是服務排程器在任務首次啟動後忽略運作狀態不良的 Elastic Load Balancing、VPC Lattice 與容器運作狀態檢查的時間。如果您未指定運作狀態檢查寬限期間值，則會使用預設值 0。

1. 在**部署組態**下，設定 Canary 部署設定：

   1. 針對**部署策略**，選擇 **Canary**。

   1. 對於 **Canary 百分比**，輸入要在第一個階段轉移到綠色服務修訂的流量百分比 （例如，初始 Canary 流量為 10%)。

   1. 針對 **Canary 製作時間**，輸入在將剩餘的流量轉移到綠色服務修訂版之前等待的時間，以分鐘為單位。

   1. 針對**製作時間**，輸入藍色和綠色服務修訂在終止藍色修訂之前，在最終流量轉移後同時執行的分鐘數。

   1. （選用） 設定生命週期掛鉤以在部署的特定階段執行。在**部署生命週期掛鉤**下，選擇**新增**。

      對於 Lambda 掛鉤：
      + 針對**目標類型**，選擇 **Lambda**。
      + 在 **Lambda 函式**欄位中，輸入函式名稱或 ARN。
      + 在**角色**欄位中，選取具有調用 Lambda 函式許可的 IAM 角色。
      + 在**生命週期階段**欄位中，選取 Lambda 函式應執行的階段。

      對於暫停掛鉤：
      + 針對**目標類型**，選擇**暫停**。
      + 針對**生命週期階段**，選取部署應該暫停的階段。
      + （選用） 針對**逾時**，設定逾時持續時間和動作。

1. 若要設定 Amazon ECS 如何偵測並處理部署失敗，請展開 **Deployment failure detection** (部署失敗偵測)，然後選擇您的選項。

   1. 若要在任務無法啟動時停止部署，請選取 **Use the Amazon ECS deployment circuit breaker** (使用 Amazon ECS 部署斷路器)。

      在部署斷路器將部署設定為失敗狀態時，若要讓軟體自動將部署復原至上次完成的部署狀態，請選取**失敗時復原**。

   1. 若要根據應用程式指標停止部署，請選取**使用 CloudWatch 警示**。然後，從**CloudWatch 警示名稱**欄位中選擇警示。要建立新的警示，請前往 CloudWatch 主控台。

      在 CloudWatch 警示將部署設定為失敗狀態時，若要讓軟體自動將部署復原至上次完成的部署狀態，請選取**失敗時復原**。

1. (選用) 若要使用 Service Connect 與服務互連，請展開 **Service Connect** 區段，然後指定下列項目：

   1.  選取**開啟 Service Connect**。

   1. 在 **Service Connect configuration** (Service Connect 組態) 下，指定用戶端模式。
      + 如果服務執行的網路用戶端應用程式只需要連線至命名空間中的其他服務，請選擇**僅用戶端**。
      + 如果服務執行的是網路或 Web 服務應用程式，且需要為此服務提供端點，並連線至命名空間中的其他服務，請選擇 **Client and server** (用戶端和伺服器)。

   1. 若要使用非預設叢集命名空間的命名空間，請在 **Namespace** (命名空間) 欄位中選擇服務命名空間。這可以是在您的 中在相同 AWS 區域 中分別建立的命名空間， AWS 帳戶 或是使用 AWS Resource Access Manager () 與您的帳戶共用的相同區域中的命名空間AWS RAM。如需共用 AWS Cloud Map 命名空間的詳細資訊，請參閱《 *AWS Cloud Map 開發人員指南*》中的[跨帳戶 AWS Cloud Map 命名空間共用](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)。

   1. （選用） 設定 Canary 部署的測試流量標頭規則。在**測試流量路由**下，指定下列項目：

      1. 選取**啟用測試流量標頭規則**，以在測試期間將特定請求路由至綠色服務修訂版。

      1. 在**標頭比對規則**欄位中，設定路由測試流量的條件：
         + **標頭名稱**：輸入要比對的 HTTP 標頭名稱 (例如 `X-Test-Version` 或 `User-Agent`)。
         + **比對類型**：選擇比對條件：
           + **完全相符**：標頭值與指定值完全相符的路由請求
           + **標頭存在**：包含指定標頭的路由請求，無論其值為何
           + **模式比對**：標頭值與指定模式相符的路由請求
         + **標頭值** (如果使用「完全相符」或「模式相符」)：輸入要比對的值或模式。

         您可以新增多個標頭比對規則來建立複雜的路由邏輯。符合任何已設定規則的請求將路由至綠色服務修訂版進行測試。

      1. 選擇**新增標頭規則**以設定其他標頭比對條件。
**注意**  
測試流量標頭規則讓您可以在完成完整部署之前，使用受控流量驗證新功能。這允許您使用特定請求 (例如來自內部測試工具或 Beta 版使用者的請求) 測試綠色服務修訂版，同時維持流向藍色服務修訂版的正常流量流程。

   1. (選用) 指定日誌組態。選取**使用日誌收集**。預設選項會將容器日誌傳送至 CloudWatch 日誌。其他日誌驅動程式選項是使用 AWS FireLens 設定。如需詳細資訊，請參閱[將 Amazon ECS 日誌傳送至 AWS 服務或 AWS Partner](using_firelens.md)。

      下方更詳細地描述了每個容器日誌目的地。
      + **Amazon CloudWatch** – 將任務設定為將容器日誌傳送至 CloudWatch Logs。系統會提供預設日誌驅動程式選項，用來代表您建立 CloudWatch 日誌群組。若要指定不同的日誌群組名稱，請變更驅動程式選項值。
      + **Amazon Data Firehose** – 將任務設定為將容器日誌傳送至 Firehose。系統會提供預設日誌驅動程式選項，用來將日誌傳送至 Firehose 傳送串流。若要指定不同的交付串流名稱，請變更驅動程式選項值。
      + **Amazon Kinesis Data Streams** – 將任務設定為將容器日誌傳送至 Amazon Kinesis Data Streams。系統會提供預設日誌驅動程式選項，用來將日誌傳送至 Kinesis Data Streams 串流。若要指定不同的串流名稱，請變更驅動程式選項值。
      + **Amazon OpenSearch Service** – 將任務設定為將容器日誌傳送至 OpenSearch Service 網域。務必提供日誌驅動程式選項。
      + **Amazon S3**：將任務設定為將容器日誌傳送至 Amazon S3 儲存貯體。預設的日誌驅動程式選項是預設設定，但您必須指定有效的 Amazon S3 儲存貯體名稱。

1. （選用） 設定 **Canary 部署的負載平衡**。


<table>
<thead>
  <tr><th>Elastic Load Balancing 類型</th><th>步驟</th><th></th></tr>
</thead>
<tbody>
  <tr><td>Application Load Balancer</td><td> <ol><li> 在<b>負載平衡器類型</b>欄位中選擇 <b>Application Load Balancer</b>。 </li><li> 選擇 <b>Create a new load balancer</b> (建立新的負載平衡器) 以建立新的 Application Load Balancer，或者 <b>Use an existing load balancer</b> (使用現有負載平衡器) 以選擇現有的 Application Load Balancer。 </li><li> 在<b>容器</b>欄位中選擇託管服務的容器。 </li><li> 針對 <b>Load balancer name</b> (負載平衡器名稱)，輸入不重複的名稱。 </li><li> 針對 <b>Listener</b> (接聽程式)，為 Application Load Balancer 輸入連接埠和協定，以偵聽連接請求。根據預設，負載平衡器將被設定為使用連接埠 80 和 HTTP。 <ul><li> 在<b>生產規則</b>欄位中，輸入規則的<b>評估順序</b>與<b>路徑模式</b>。 <br />此規則適用於生產 (藍色) 服務修訂版流量。 </li><li> 在<b>測試規則</b>欄位中，輸入規則的<b>評估順序</b>與<b>路徑模式</b>。 <br />此規則適用於測試 (綠色) 服務修訂版流量。 </li></ul> </li><li> 在<b>目標群組</b>欄位中設定下列項目： <ul><li> 針對 <b>Target group name</b> (目標群組名稱)，為目標群組輸入名稱和協定，Application Load Balancer 會將請求路由至該群組。 </li><li> 在<b>通訊協定</b>欄位中，選擇 Application Load Balancer 向其路由請求之目標群組的通訊協定。根據預設，目標群組會將請求路由至您的任務定義中定義的第一個容器。 </li><li> 針對<b>取消註冊延遲</b>，輸入負載平衡器將目標狀態變更為 的秒數<code>UNUSED</code>。預設為 300 秒。 </li><li> 針對 <b>Health check path</b> (運作狀態檢查路徑)，輸入容器中的現有路徑，Application Load Balancer 會在該容器中定期傳送請求，以驗證 Application Load Balancer 和容器之間的連接狀態。預設使用根目錄 (<code>/</code>)。 </li><li> 針對<b>替代群組名稱</b>，輸入測試服務修訂版目標群組的群組名稱。 </li></ul> </li></ol> </td><td></td></tr>
  <tr><td>Network Load Balancer</td><td> <ol><li> 針對 <b>Load balancer type</b> (負載平衡器類型)，選取 <b>Network Load Balancer</b>。 </li><li> 針對 <b>Load Balancer</b> (負載平衡器)，選擇現有的 Network Load Balancer。 </li><li> 針對 <b>Choose container to load balance</b> (選擇進行負載平衡的容器)，選擇託管服務的容器。 </li><li> 在<b>生產接聽程式</b>欄位中，選擇<b>生產接聽程式連接埠</b>與<b>生產接聽程式通訊協定</b>。 <br />這是生產服務修訂流量的接聽程式。 </li><li> 在<b>測試接聽程式</b>欄位中，選擇<b>測試接聽程式連接埠</b>與<b>測試接聽程式通訊協定</b>。 <br />這是測試服務修訂流量的接聽程式。 </li><li> 在<b>目標群組</b>欄位中設定下列項目： <ul><li> 針對 <b>Target group name</b> (目標群組名稱)，為目標群組輸入名稱和協定，Network Load Balancer 會將請求路由至該群組。 </li><li> 在<b>通訊協定</b>欄位中，選擇 Network Load Balancer 向其路由請求之目標群組的通訊協定。根據預設，目標群組會將請求路由至您的任務定義中定義的第一個容器。 </li><li> 針對<b>取消註冊延遲</b>，輸入負載平衡器將目標狀態變更為 的秒數<code>UNUSED</code>。預設為 300 秒。 </li><li> 針對 <b>Health check path</b> (運作狀態檢查路徑)，輸入容器中的現有路徑，Application Load Balancer 會在該容器中定期傳送請求，以驗證 Application Load Balancer 和容器之間的連接狀態。預設使用根目錄 (<code>/</code>)。 </li><li> 在<b>替代群組名稱</b>欄位中，輸入測試 (綠色) 服務修訂版的目標群組名稱。 </li></ul> </li></ol> </td><td></td></tr>
</tbody>
</table>


1. (選用) 為協助識別您的服務和任務，請展開 **Tags** (標籤) 區段，然後設定標籤。

   若要讓 Amazon ECS 使用叢集名稱和任務定義標籤，自動標記所有新啟動的任務，請選取 **Turn on Amazon ECS managed tags** (開啟 Amazon ECS 受管標籤)，然後針對 **Propagate tags from** (傳播標籤來源)，選取 **Task definitions** (任務定義)。

   若要讓 Amazon ECS 使用叢集名稱和服務標籤，自動標記所有新啟動的任務，請選取 **Turn on Amazon ECS managed tags** (開啟 Amazon ECS 受管標籤)，然後針對 **Propagate tags from** (傳播標籤來源)，選取 **Service** (服務)。

   新增或移除標籤。
   + [新增標籤] 選擇**新增標籤**，然後執行下列操作︰
     + 在**索引鍵**中，輸入索引鍵名稱。
     + 在**值**中，進入索引鍵值。
   + [移除標籤] 在標籤旁邊，選擇**移除標籤**。

1. 選擇**建立**。

------
#### [ AWS CLI ]

1. 建立名為 `canary-service-definition.json` 且具有下列內容的檔案。

   將 {{user-input}} 取代為實際值。

   ```
   {
     "serviceName": "myCanaryService",
     "cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/sample-fargate-cluster",
     "taskDefinition": "sample-fargate:1",
     "desiredCount": 5,
     "launchType": "FARGATE",
     "networkConfiguration": {
       "awsvpcConfiguration": {
         "subnets": [
           "subnet-09ce6e74c116a2299",
           "subnet-00bb3bd7a73526788",
           "subnet-0048a611aaec65477"
         ],
         "securityGroups": [
           "sg-09d45005497daa123"
         ],
         "assignPublicIp": "ENABLED"
       }
     },
     "deploymentController": {
       "type": "ECS"
     },
     "deploymentConfiguration": {
       "strategy": "CANARY",
       "maximumPercent": 200,
       "minimumHealthyPercent": 100,
       "canaryConfiguration" : {
           "canaryPercent" : 5.0,
           "canaryBakeTime" : 10
       },
       "bakeTimeInMinutes": 10,
       "alarms": {
         "alarmNames": [
           "myAlarm"
         ],
         "rollback": true,
         "enable": true
       }
     },
     "loadBalancers": [
       {
         "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-target-group/54402ff563af1197",
         "containerName": "fargate-app",
         "containerPort": 80,
         "advancedConfiguration": {
           "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-target-group/cad10a56f5843199",
           "productionListenerRule": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-canary-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911",
           "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS"
         }
       }
     ]
   }
   ```

1. 執行 `create-service`。

   ```
   aws ecs create-service --cli-input-json file://canary-service-definition.json
   ```

------

## 後續步驟
<a name="deploy-canary-service-next-steps"></a>

設定 Canary 部署之後，請完成下列步驟：
+ 更新服務以開始部署。如需詳細資訊，請參閱[更新 Amazon ECS 服務](update-service-console-v2.md)。
+ 監控部署程序，以確保其遵循 Canary 模式：
  + 綠色服務修訂版已建立並向上擴展
  + 一小部分的流量 (Canary) 會轉移到綠色修訂版
  + 系統會等待指定的 Canary 間隔
  + 剩餘的流量會一次全部轉移到綠色修訂版
  + 封裝時間過期後，藍色修訂版會終止