

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

# 教學課程：使用 Amazon ECR 來源和 ECS-to-CodeDeploy 部署建立管道
<a name="tutorials-ecs-ecr-codedeploy"></a>

在本教學課程中，您會在 中設定管道 AWS CodePipeline ，使用支援 Docker 映像的藍/綠部署來部署容器應用程式。在藍/綠部署中，您可以同時啟動新舊版本的應用程式，並在重新路由流量之前測試新版本。您也可以監控部署程序，並在發生問題時快速轉返。

**重要**  
在建立管道的過程中，CodePipeline 將使用客戶提供的 S3 成品儲存貯體來製作成品。（這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中，請確定 S3 成品儲存貯體由 所擁有 AWS 帳戶 ，安全且可靠。

**注意**  
本教學課程適用於 CodePipeline 的 Amazon ECS 到 CodeDeploy 藍/綠部署動作。如需在 CodePipeline 中使用 Amazon ECS 標準部署動作的教學課程，請參閱 [教學課程：使用 CodePipeline 進行 Amazon ECS 標準部署](ecs-cd-pipeline.md)。

已完成的管道會偵測儲存在 Amazon ECR 等映像儲存庫中的映像變更，並使用 CodeDeploy 將流量路由和部署到 Amazon ECS 叢集和負載平衡器。CodeDeploy 使用接聽程式將流量重新路由到 AppSpec 檔案中指定之已更新容器的連接埠。如需如何在藍/綠部署中使用負載平衡器、生產接聽程式、目標群組和 Amazon ECS 應用程式的詳細資訊，請參閱[教學課程：部署 Amazon ECS 服務](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-ecs-deployment.html)。

管道也會設定為使用來源位置，例如 CodeCommit，其中存放您的 Amazon ECS 任務定義。在本教學課程中，您會設定每個 AWS 資源，然後使用包含每個資源動作的階段來建立管道。

每當原始碼變更或將新的基礎映像上傳至 Amazon ECR 時，您的持續交付管道會自動建置和部署容器映像。

此流程使用以下成品：
+ 指定 Amazon ECR 映像儲存庫容器名稱和儲存庫 URI 的 Docker 映像檔案。
+ 列出 Docker 映像名稱、容器名稱、Amazon ECS 服務名稱和負載平衡器組態的 Amazon ECS 任務定義。
+ CodeDeploy AppSpec 檔案，指定 Amazon ECS 任務定義檔案的名稱、更新應用程式容器的名稱，以及 CodeDeploy 重新路由生產流量的容器連接埠。它也可以指定選用的網路組態和 Lambda 函數，您可以在部署生命週期事件勾點中執行它們。

**注意**  
當您將變更遞交至 Amazon ECR 映像儲存庫時，管道來源動作會為該遞交建立 `imageDetail.json` 檔案。如需 `imageDetail.json` 詳細資訊，請參閱 [Amazon ECS 藍/綠部署動作的 imageDetail.json 檔案](file-reference.md#file-reference-ecs-bluegreen)。

當您建立或編輯管道，以及更新或指定部署階段的來源成品時，請確保指向的來源成品具有您想要使用的最新名稱和版本。在您設定管道之後，若您變更映像或任務定義檔案，則您可能需要在儲存庫中更新來源成品，然後在管道中編輯部署階段。

**Topics**
+ [先決條件](#tutorials-ecs-ecr-codedeploy-prereq)
+ [步驟 1：建立映像並推送至 Amazon ECR 儲存庫](#tutorials-ecs-ecr-codedeploy-imagerepository)
+ [步驟 2：建立任務定義和 AppSpec 來源檔案，並推送至 CodeCommit 儲存庫](#tutorials-ecs-ecr-codedeploy-taskdefinition)
+ [步驟 3：建立 Application Load Balancer 和目標群組](#tutorials-ecs-ecr-codedeploy-loadbal)
+ [步驟 4：建立 Amazon ECS 叢集和服務](#tutorials-ecs-ecr-codedeploy-cluster)
+ [步驟 5：建立 CodeDeploy 應用程式和部署群組 (ECS 運算平台）](#tutorials-ecs-ecr-codedeploy-deployment)
+ [步驟 6：建立管道](#tutorials-ecs-ecr-codedeploy-pipeline)
+ [步驟 7：變更您的管道並驗證部署](#tutorials-ecs-ecr-codedeploy-update)

## 先決條件
<a name="tutorials-ecs-ecr-codedeploy-prereq"></a>

您必須已建立以下資源：
+ CodeCommit 儲存庫。您可以使用您在 中建立的 AWS CodeCommit 儲存庫[教學課程：建立簡單的管道 (CodeCommit 儲存庫）](tutorials-simple-codecommit.md)。
+ 啟動 Amazon EC2 Linux 執行個體並安裝 Docker 以建立映像，如本教學課程所示。如果您已擁有想要使用的映像，則可略過此先先決條件。

## 步驟 1：建立映像並推送至 Amazon ECR 儲存庫
<a name="tutorials-ecs-ecr-codedeploy-imagerepository"></a>

在本節中，您會使用 Docker 來建立映像，然後使用 AWS CLI 來建立 Amazon ECR 儲存庫，並將映像推送至儲存庫。

**注意**  
如果您已擁有想要使用的映像，則可略過此先步驟。

**建立映像**

1. 登入您已在其中安裝 Docker 安裝的 Linux 執行個體。

   拉下 `nginx` 的映像。此命令提供`nginx:latest`映像：

   ```
   docker pull nginx
   ```

1. 執行 **docker images**。您應該會在清單中看到映像。

   ```
   docker images
   ```

**建立 Amazon ECR 儲存庫並推送映像**

1. 建立 Amazon ECR 儲存庫，以便存放 映像。記下輸出中的 `repositoryUri`。

   ```
   aws ecr create-repository --repository-name nginx
   ```

   輸出：

   ```
   {
       "repository": {
           "registryId": "aws_account_id",
           "repositoryName": "nginx",
           "repositoryArn": "arn:aws:ecr:us-east-1:aws_account_id:repository/nginx",
           "createdAt": 1505337806.0,
           "repositoryUri": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/nginx"
       }
   }
   ```

1. 為映像標記上一步中的 `repositoryUri` 值。

   ```
   docker tag nginx:latest aws_account_id.dkr.ecr.us-east-1.amazonaws.com/nginx:latest
   ```

1. 執行 **aws ecr get-login-password**命令，如 `us-west-2`區域和 111122223333 帳戶 ID 的範例所示。

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com/nginx
   ```

1. 使用先前步驟`repositoryUri`中的 ，將映像推送至 Amazon ECR。

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/nginx:latest
   ```

## 步驟 2：建立任務定義和 AppSpec 來源檔案，並推送至 CodeCommit 儲存庫
<a name="tutorials-ecs-ecr-codedeploy-taskdefinition"></a>

在本節中，您會建立任務定義 JSON 檔案，並將其註冊至 Amazon ECS。然後，為 CodeDeploy 建立 AppSpec 檔案，並使用 Git 用戶端將檔案推送至 CodeCommit 儲存庫。

**針對您的映像建立任務定義**

1. 使用下列內容建立名為 `taskdef.json` 的檔案。對於 `image`，輸入您的映像名稱，例如 nginx。當您的管道執行時，此值即會更新。
**注意**  
請確定任務定義中指定的執行角色包含 `AmazonECSTaskExecutionRolePolicy`。如需詳細資訊，請參閱《[Amazon ECS 開發人員指南》中的 Amazon ECS 任務執行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。 **

   ```
   {
       "executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
       "containerDefinitions": [
           {
               "name": "sample-website",
               "image": "nginx",
               "essential": true,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "protocol": "tcp",
                       "containerPort": 80
                   }
               ]
           }
       ],
       "requiresCompatibilities": [
           "FARGATE"
       ],
       "networkMode": "awsvpc",
       "cpu": "256",
       "memory": "512",
       "family": "ecs-demo"
   }
   ```

1. 註冊具有 `taskdef.json` 檔案的任務定義。

   ```
   aws ecs register-task-definition --cli-input-json file://taskdef.json
   ```

1. 在註冊任務定義之後，請編輯您的檔案以移除映像名稱，並在映像欄位中包含 `<IMAGE1_NAME>` 預留位置文字。

   ```
   {
       "executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
       "containerDefinitions": [
           {
               "name": "sample-website",
               "image": "<IMAGE1_NAME>",
               "essential": true,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "protocol": "tcp",
                       "containerPort": 80
                   }
               ]
           }
       ],
       "requiresCompatibilities": [
           "FARGATE"
       ],
       "networkMode": "awsvpc",
       "cpu": "256",
       "memory": "512",
       "family": "ecs-demo"
   }
   ```

**建立 AppSpec 檔案**
+ AppSpec 檔案用於 CodeDeploy 部署。此檔案會使用下列格式，其中包含選用欄位：

  ```
  version: 0.0
  Resources:
    - TargetService:
        Type: AWS::ECS::Service
        Properties:
          TaskDefinition: "task-definition-ARN"
          LoadBalancerInfo:
            ContainerName: "container-name"
            ContainerPort: container-port-number
  # Optional properties
          PlatformVersion: "LATEST"
          NetworkConfiguration:
              AwsvpcConfiguration:
                Subnets: ["subnet-name-1", "subnet-name-2"]
                SecurityGroups: ["security-group"]
                AssignPublicIp: "ENABLED"
  Hooks:
  - BeforeInstall: "BeforeInstallHookFunctionName"
  - AfterInstall: "AfterInstallHookFunctionName"
  - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName"
  - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName"
  - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"
  ```

  如需 AppSpec 檔案的詳細資訊，包括範例，請參閱 [CodeDeploy AppSpec 檔案參考](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html)。

  使用下列內容建立名為 `appspec.yaml` 的檔案。對於 `TaskDefinition`，不要變更 `<TASK_DEFINITION>` 預留位置文字。當您的管道執行時，此值即會更新。

  ```
  version: 0.0
  Resources:
    - TargetService:
        Type: AWS::ECS::Service
        Properties:
          TaskDefinition: <TASK_DEFINITION>
          LoadBalancerInfo:
            ContainerName: "sample-website"
            ContainerPort: 80
  ```

**將檔案推送至 CodeCommit 儲存庫**

1. 將檔案推送或上傳至 CodeCommit 儲存庫。這些檔案是由**建立管道**精靈為 CodePipeline 中的部署動作建立的來源成品。在本機目錄中，您的檔案應該如下所示：

   ```
   /tmp
     |my-demo-repo
       |-- appspec.yaml
       |-- taskdef.json
   ```

1. 選擇您要用來上傳檔案的方法：

   1. 若要在您的本機電腦上從複製的儲存庫中使用 Git 命令列：

      1. 將目錄變更為您的本機儲存庫：

         ```
         (For Linux, macOS, or Unix) cd /tmp/my-demo-repo
         (For Windows) cd c:\temp\my-demo-repo
         ```

      1. 請執行下列命令來同時將所有檔案放入階段：

         ```
         git add -A
         ```

      1. 請執行下列命令來確認檔案並附加確認訊息：

         ```
         git commit -m "Added task definition files"
         ```

      1. 執行下列命令，將檔案從本機儲存庫推送至 CodeCommit 儲存庫：

         ```
         git push
         ```

   1. 若要使用 CodeCommit 主控台上傳您的檔案：

      1. 開啟 CodeCommit 主控台，然後從儲存庫清單中選擇您的**儲存庫**。

      1. 選擇 **Add file (新增檔案)**，然後選擇 **Upload file (上傳檔案)**。

      1. 選擇 **Choose file (選擇檔案)**，然後瀏覽您的檔案。輸入您的使用者名稱和電子郵件地址來確定變更。選擇 **Commit changes (遞交變更)**。

      1. 對於您要上傳的每個檔案重複此步驟。

## 步驟 3：建立 Application Load Balancer 和目標群組
<a name="tutorials-ecs-ecr-codedeploy-loadbal"></a>

在本節中，您會建立 Amazon EC2 Application Load Balancer。您稍後在建立 Amazon ECS 服務時，使用透過負載平衡器建立的子網路名稱和目標群組值。您可以建立應用程式負載平衡器或網路負載平衡器。負載平衡器必須使用 VPC 搭配不同可用區域中的兩個子網路。在這些步驟中，您確認預設 VPC、建立一個負載平衡器，然後為您的負載平衡器建立兩個目標群組。如需詳細資訊，請參閱「[網路負載平衡器的目標群組](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html)」。

**驗證您的預設 VPC 和公有子網路**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)：// 開啟 Amazon VPC 主控台。

1. 驗證要使用的預設 VPC。在導覽窗格中，選擇 **Your VPCs** (您的 VPC)。請注意，哪個 VPC 在 **Default VPC (預設 VPC)** 欄中顯示 **Yes (是)**。這是預設 VPC。它包含供您選取的預設子網路。

1. 選擇 **Subnets (子網路)**。選擇兩個在 **Default subnet (預設子網路)** 欄中顯示 **Yes (是)** 的子網路。
**注意**  
記下您的子網路 ID。本教學的稍後部分將需要這些資訊。

1. 選擇子網路，然後選擇 **Description (描述)** 標籤。驗證您想要使用的子網路是否位於不同的可用區域中。

1. 選擇子網路，然後選擇 **Route Table (路由表)** 標籤。若要驗證您想要使用的每個子網路是否為公有子網路，請確認閘道資料列包含在路由表中。

**建立 Amazon EC2 Application Load Balancer**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)：// 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Load Balancers (負載平衡器)**。

1. 選擇 **Create Load Balancer (建立負載平衡器)**。

1. 選擇 **Application Load Balancer (應用程式負載平衡器)**，然後選擇 **Create (建立)**。

1. 在 **Name (名稱)** 中，輸入負載平衡器的名稱。

1. 在 **Scheme (結構描述)** 中，選擇 **internet-facing (面向網際網路)**。

1. 在 **IP address type (IP 地址)** 中，選擇 **ipv4**。

1. 為您的負載平衡器設定兩個接聽程式連接埠：

   1. 在 **Load Balancer Protocol (負載平衡器通訊協定)** 下，選擇 **HTTP**。在 **Load Balancer Port (負載平衡器連接埠)** 下，輸入 **80**。

   1. 選擇 **Add listener (新增接聽程式)**。

   1. 在第二個接聽程式的 **Load Balancer Protocol (負載平衡器通訊協定)** 下，選擇 **HTTP**。在 **Load Balancer Port (負載平衡器連接埠)** 下，輸入 **8080**。

1. 在 **Availability Zones (可用區域)** 下，於 **VPC** 中，選擇預設 VPC。接著，選擇您想要使用的兩個預設子網路。

1. 選擇 **Next: Configure Security Settings (下一步：設定安全設定)**。

1. 選擇 **Next: Configure Security Groups (下一步：設定安全群組)**。

1. 選擇 **Select an existing security group (選取現有的安全群組)**，並記下安全群組 ID。

1. 選擇 **Next: Configure Routing (下一步：設定路由)**。

1. 在 **Target group (目標群組)** 中，選擇 **New target group (新增目標群組)**，然後設定您的第一個目標群組：

   1. 在 **Name (名稱)** 中，輸入目標群組名稱 (例如，**target-group-1**)。

   1. 在 **Target type (目標類型)** 中，選擇 **IP**。

   1. 在 **Protocol (通訊協定)** 中，選擇 **HTTP**。在 **Port (連接埠)** 中，輸入 **80**。

   1. 選擇 **Next: Register Targets (下一步：註冊目標)**。

1. 選擇 **Next: Review (下一步：檢視)**，然後選擇 **Create (建立)**。

**為您的負載平衡器建立第二個目標群組**

1. 佈建負載平衡器之後，請開啟 Amazon EC2 主控台。在導覽窗格中，選擇 **Target Groups (目標群組)**。

1. 選擇 **Create target group (建立目標群組)**。

1. 在 **Name (名稱)** 中，輸入目標群組名稱 (例如，**target-group-2**)。

1. 在 **Target type (目標類型)** 中，選擇 **IP**。

1. 在 **Protocol (通訊協定)** 中，選擇 **HTTP**。在 **Port (連接埠)** 中，輸入 **8080**。

1. 在 **VPC** 中，選擇預設 VPC。

1. 選擇**建立**。
**注意**  
您必須具有兩個針對負載平衡器建立的目標群組，才能執行部署。您只需要記下第一個目標群組的 ARN。在下一個步驟中，此 ARN 會用於 `create-service` JSON 檔案中。

**更新您的負載平衡器以包含您的第二個目標群組**

1. 開啟 Amazon EC2 主控台。在導覽窗格中，選擇 **Load Balancers (負載平衡器)**。

1. 選擇您的負載平衡器，然後選擇 **Listeners (接聽程式)** 標籤。選擇使用連接埠 8080 的接聽程式，然後選擇 **Edit (編輯)**。

1. 選擇 **Forward to (轉寄至)** 旁邊的鉛筆圖示。選擇您的第二個目標群組，然後選擇核取記號。選擇 **Update (更新)** 來儲存更新。

## 步驟 4：建立 Amazon ECS 叢集和服務
<a name="tutorials-ecs-ecr-codedeploy-cluster"></a>

在本節中，您會建立 Amazon ECS 叢集和服務，其中 CodeDeploy 會在部署期間路由流量 （至 Amazon ECS 叢集，而非 EC2 執行個體）。若要建立 Amazon ECS 服務，您必須使用透過負載平衡器建立的子網路名稱、安全群組和目標群組值來建立服務。

**注意**  
當您使用這些步驟建立 Amazon ECS 叢集時，您可以使用**僅限聯網**叢集範本，以佈建 AWS Fargate 容器。 AWS Fargate 是一種技術，可為您管理容器執行個體基礎設施。您不需要為 Amazon ECS 叢集選擇或手動建立 Amazon EC2 執行個體。

**建立 Amazon ECS 叢集**

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

1. 在導覽窗格中，選擇**叢集**。

1. 選擇 **Create Cluster** (建立叢集)。

1. 選擇**僅限聯網**且使用 AWS Fargate 的叢集範本，然後選擇**下一步**。

1. 在 **Configure cluster (設定叢集)** 頁面上輸入叢集名稱。您可以為您的資源新增選用的標籤。選擇**建立**。

**建立 Amazon ECS 服務**

使用 AWS CLI 在 Amazon ECS 中建立您的服務。

1. 建立 JSON 檔案，並將其命名為 `create-service.json`。將下列內容貼入 JSON 檔案中。

   對於 `taskDefinition` 欄位，當您在 Amazon ECS 中註冊任務定義時，您會為其提供一個系列。這類似用於多個任務定義版本的名稱，以修訂版號碼指定。在此範例中，請將「`ecs-demo:1`」用於您檔案中的系列和修訂版號碼。在 [步驟 3：建立 Application Load Balancer 和目標群組](#tutorials-ecs-ecr-codedeploy-loadbal) 中使用您建立的子網路名稱、安全群組和目標群組值，以及您的負載平衡器。
**注意**  
您需要在這個檔案包含您的目標群組 ARN。開啟 Amazon EC2 主控台，然後從導覽窗格的 **LOAD BALANCING** 下，選擇**目標群組**。選擇您的第一個目標群組。從 **Description (描述)** 標籤複製您的 ARN。

   ```
   {
       "taskDefinition": "family:revision-number",
       "cluster": "my-cluster",
       "loadBalancers": [
           {
               "targetGroupArn": "target-group-arn",
               "containerName": "sample-website",
               "containerPort": 80
           }
       ],
       "desiredCount": 1,
       "launchType": "FARGATE",
       "schedulingStrategy": "REPLICA",
       "deploymentController": {
           "type": "CODE_DEPLOY"
       },
       "networkConfiguration": {
           "awsvpcConfiguration": {
               "subnets": [
                   "subnet-1",
                   "subnet-2"
               ],
               "securityGroups": [
                   "security-group"
               ],
               "assignPublicIp": "ENABLED"
           }
       }
   }
   ```

1. 執行 **create-service** 命令，指定 JSON 檔案：
**重要**  
請確認在檔案名稱之前包含 `file://`。這是此命令必要項目。

   此範例會建立名為 `my-service` 的服務。
**注意**  
此範例命令會建立名為 my-service 的服務。如果您已經有使用此名稱的服務，此命令會傳回錯誤。

   ```
   aws ecs create-service --service-name my-service --cli-input-json file://create-service.json
   ```

   輸出會傳回您服務的描述欄位。

1. 執行 **describe-services** 命令，以驗證是否已建立您的服務。

   ```
   aws ecs describe-services --cluster cluster-name --services service-name
   ```

## 步驟 5：建立 CodeDeploy 應用程式和部署群組 (ECS 運算平台）
<a name="tutorials-ecs-ecr-codedeploy-deployment"></a>

當您為 Amazon ECS 運算平台建立 CodeDeploy 應用程式和部署群組時，應用程式會在部署期間用來參考正確的部署群組、目標群組、接聽程式和流量重新路由行為。

**建立 CodeDeploy 應用程式**

1. 開啟 CodeDeploy 主控台，然後選擇**建立應用程式**。

1. 在 **Application name (應用程式名稱)** 中，輸入您想要使用的名稱。

1. 在 **Compute Platform (運算平台)** 中，選擇 **Amazon ECS**。

1. 選擇**建立應用程式**。

**建立 CodeDeploy 部署群組**

1. 在您應用程式頁面的 **Deployment groups (部署群組)** 標籤上，選擇 **Create deployment group (建立部署群組)**。

1. 在 **Deployment group name (部署群組名稱)** 中，輸入描述部署群組的名稱。

1. 在**服務角色**中，選擇授予 CodeDeploy 存取 Amazon ECS 的服務角色。若要建立新的服務角色，請遵循下列步驟：

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

   1. 從主控台儀表板，選擇 **Roles (角色)**。

   1. 選擇建**立角色**。

   1. 在**選取信任實體類型**下，選取 **AWS 服務**。在 **Choose a use case (選擇使用案例)** 下，選取 **CodeDeploy**。在 **Select your use case (選取您的使用案例)** 下，選取 **CodeDeploy - ECS**。選擇**下一步：許可**。`AWSCodeDeployRoleForECS` 受管政策已連接至角色。

   1. 選擇 **Next: Tags (下一步：標籤)**，然後選擇 **Next: Review (下一步：檢閱)**。

   1. 輸入角色的名稱 (例如 **CodeDeployECSRole**)，然後選擇 **Create role (建立角色)**。

1. 在**環境組態**中，選擇您的 Amazon ECS 叢集名稱和服務名稱。

1. 從**負載平衡器**中，選擇為 Amazon ECS 服務提供流量的負載平衡器名稱。

1. 從 **Production listener port (生產接聽程式連接埠)** 中，為接聽程式選擇連接埠和通訊協定，而此接聽程式會對 Amazon ECS 服務提供生產流量。從 **Test listener port (測試接聽程式連接埠)**，為測試接聽程式選擇連接埠和通訊協定。

1. 從 **Target group 1 name (目標群組 1 名稱)** 和 **Target group 2 name (目標群組 2 名稱)** 中，選擇在部署期間用來路由流量的目標群組。確定這些是您為負載平衡器建立的目標群組。

1. 選擇**立即重新路由流量**，以判斷成功部署後將流量重新路由到更新後的 Amazon ECS 任務的時間長度。

1. 選擇 **Create deployment group (建立部署群組)**。

## 步驟 6：建立管道
<a name="tutorials-ecs-ecr-codedeploy-pipeline"></a>

在本節中，您可以採取下列動作建立管道：
+ CodeCommit 動作，其中來源成品是任務定義和 AppSpec 檔案。
+ 具有 Amazon ECR 來源動作的來源階段，其中來源成品是映像檔案。
+ 具有 Amazon ECS 部署動作的部署階段，其中部署使用 CodeDeploy 應用程式和部署群組執行。

**使用精靈建立兩階段管道**

1. 登入 AWS 管理主控台 並開啟 CodePipeline 主控台，網址為 https：//[http://console.aws.amazon.com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

1. 在 **Welcome (歡迎)** 頁面、**Getting started (入門)** 頁面、或者 **Pipelines (管道)** 頁面上，選擇 **Create pipeline (建立管道)**。

1. 在**步驟 1：選擇建立選項**頁面的**建立選項**下，選擇**建置自訂管道**選項。選擇**下一步**。

1. 在**步驟 2：選擇管道設定**中，在**管道名稱**中輸入 **MyImagePipeline**。

1. CodePipeline 提供 V1 和 V2 類型的管道，其特性和價格有所不同。V2 類型是您可以在 主控台中選擇的唯一類型。如需詳細資訊，請參閱[管道類型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。如需 CodePipeline 定價的資訊，請參閱 [定價](https://aws.amazon.com/codepipeline/pricing/)。

1. 在**服務角色**中，選擇**新服務角色**，以允許 CodePipeline 在 IAM 中建立服務角色。

1. 將 **Advanced settings (進階設定)** 下的設定保留為預設值，然後選擇 **Next (下一步)**。

1. 在**步驟 3：新增來源階段**的**來源提供者**中，選擇 **AWS CodeCommit**。在**儲存庫名稱**中，選擇您在 中建立的 CodeCommit 儲存庫名稱[步驟 1：建立 CodeCommit 儲存庫](tutorials-simple-codecommit.md#codecommit-create-repository)。在 **Branch name (分支名稱)** 中，選擇包含最新程式碼更新的分支名稱。

   選擇**下一步**。

1. 在**步驟 4：新增建置階段**中，選擇**略過建置階段**，然後再次選擇**略過**以接受警告訊息。選擇**下一步**。

1. 在**步驟 5：新增測試階段**中，選擇**略過測試階段**，然後再次選擇**略過**以接受警告訊息。

   選擇**下一步**。

1. 在**步驟 6：新增部署階段**：

   1. 在 **Deploy provider (部署提供者)** 中，選擇 **Amazon ECS (Blue/Green) (Amazon ECS (藍/綠))**。在 **Application name (應用程式名稱)** 中，輸入應用程式名稱或從清單中選擇應用程式名稱，例如，`codedeployapp`。在 **Deployment group (部署群組)** 中，輸入部署群組名稱或從清單中選擇部署群組名稱，例如，`codedeploydeplgroup`。

       
**注意**  
名稱「Deploy」(部署)，是預設指定給在 **Step 4: Deploy (步驟 4：部署)** 步驟中建立的階段名稱，如同「Source」(來源) 是管道的第一階段所指定的名稱。

   1. 在 **Amazon ECS task definition (Amazon ECS 任務定義)** 下，選擇 **SourceArtifact**。在欄位中，輸入 **taskdef.json**。

   1. 在 **AWS CodeDeploy AppSpec 檔案**下，選擇 **SourceArtifact**。在欄位中，輸入 **appspec.yaml**。
**注意**  
此時，不要在 **Dynamically update task definition image (動態更新任務定義映像)** 下填寫任何資訊。

   1. 選擇**下一步**。

1. 在**步驟 7：檢閱**中，檢閱資訊，然後選擇**建立管道**。

**將 Amazon ECR 來源動作新增至管道**

檢視您的管道，並將 Amazon ECR 來源動作新增至您的管道。

1. 選擇您的管道。在左上角，選擇 **Edit (編輯)**。

1. 在來源階段中，選擇 **Edit stage (編輯階段)**。

1. 選擇 CodeCommit 來源動作旁的 **\$1 新增動作**，以新增平行動作。

1. 在 **Action name (動作名稱)** 中，輸入名稱 (例如，**Image**)。

1. 在**Action provider (動作提供者)**中，選擇 **Amazon ECR**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ECR-source-action.png)

1. 在**儲存庫名稱**中，選擇 Amazon ECR 儲存庫的名稱。

1. 在 **Image tag (映像標籤)** 中，指定映像名稱和版本，如果與最新不同的話。

1. 在 **Output artifacts (輸出成品)** 中，選擇輸出成品預設值 (例如 `MyImage`)，其中包含您要下一個階段使用的映像名稱和儲存庫 URI 資訊。

1. 在動作畫面上選擇 **Save (儲存)**。在階段畫面上選擇 **Done (完成)**。在管道上選擇 **Save (儲存)**。訊息顯示要為 Amazon ECR 來源動作建立的 Amazon CloudWatch Events 規則。

**將您的來源成品連線至部署動作**

1. 在部署階段選擇**編輯**，然後選擇 圖示來編輯 **Amazon ECS （藍/綠）** 動作。

1. 捲動到窗格底部。在 **Input artifacts (輸入成品)** 中，選擇 **Add (新增)**。從新的 Amazon ECR 儲存庫新增來源成品 （例如 `MyImage`)。

1. 在 **Task Definition (任務定義)** 中，選擇 **SourceArtifact**，然後確認已輸入 **taskdef.json**。

1. 在 **AWS CodeDeploy AppSpec 檔案中**，選擇 **SourceArtifact**，然後**appspec.yaml**輸入驗證。

1. 在 **Dynamically update task definition image (動態更新任務定義映像)** 的 **Input Artifact with Image URI (輸入成品與映像 URI)** 中，選擇 **MyImage**，然後輸入 `taskdef.json` 檔案中使用的預留位置文字：** IMAGE1\$1NAME**。選擇**儲存**。

1. 在 AWS CodePipeline 窗格中，選擇**儲存管道變更**，然後選擇**儲存變更**。檢視已更新的管道。

   建立此範例管道後，主控台項目的動作組態會顯示在管道結構中，如下所示：

   ```
   "configuration": {
     "AppSpecTemplateArtifact": "SourceArtifact",
     "AppSpecTemplatePath": "appspec.yaml",
     "TaskDefinitionTemplateArtifact": "SourceArtifact",
     "TaskDefinitionTemplatePath": "taskdef.json",
     "ApplicationName": "codedeployapp",
     "DeploymentGroupName": "codedeploydeplgroup",
     "Image1ArtifactName": "MyImage",
     "Image1ContainerName": "IMAGE1_NAME"
   },
   ```

1. 若要提交您的變更並啟動管道建置，請選擇 **​Release change (發行變更)**，然後選擇 **​Release (發行)**。

1. 選擇部署動作以在 CodeDeploy 中檢視，並查看流量轉移的進度。
**注意**  
您可以查看顯示選用等待時間的部署步驟。根據預設，CodeDeploy 會在成功部署後等待一小時，再終止原始任務集。您可以利用這段時間復原或終止任務，但在任務集終止時，您的部署任務會以別的方式完成。

## 步驟 7：變更您的管道並驗證部署
<a name="tutorials-ecs-ecr-codedeploy-update"></a>

對您的映像進行變更，然後將變更推送到您的 Amazon ECR 儲存庫。這會觸發您的管道執行。驗證是否已部署您的映像來源。