教學課程:Amazon ECS 標準部署 CodePipeline - AWS CodePipeline

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

教學課程:Amazon ECS 標準部署 CodePipeline

本教學課程可協助您使用 Amazon ECS 建立完整、 end-to-end 持續的部署 (CD) 管道。 CodePipeline

注意

本教學課程適用於的 Amazon ECS 標準部署動作 CodePipeline。如需在中使用 Amazon ECS 進行 CodeDeploy 藍/綠部署動作的教學課程 CodePipeline,請參閱。教學課程:使用 Amazon ECR 來源和 ECS 到部署建立管道 CodeDeploy

必要條件

您必須先有幾個資源,才能使用此教學來建立 CD 管道。以下是在開始使用前需準備的事項:

注意

所有這些資源都應該在相同的 AWS 區域內建立。

  • 一個源代碼控制存儲庫(本教程使用 CodeCommit)與您的 Dockerfile 和應用程序源。如需詳細資訊,請參閱《AWS CodeCommit 使用指南》中的〈建立 CodeCommit存放庫

  • Docker 映像儲存庫 (本教學使用 Amazon ECR),其中包含您從 Docker 檔案和應用程式來源建立的映像檔。如需詳細資訊,請參Amazon 彈性容器登錄使用者指南中的建立儲存庫推送映像

  • Amazon ECS 任務定義,參考您映像儲存庫中託管的 Docker 映像檔。如需詳細資訊,請參Amazon 彈性容器服務開發人員指南中的建立任務定義

    重要

    用於的 Amazon ECS 標準部署動作 CodePipeline 會根據 Amazon ECS 服務使用的修訂版,建立自己的任務定義修訂版本。如果您在不更新 Amazon ECS 服務的情況下為任務定義建立新的修訂版本,則部署動作將忽略這些修訂。

    以下是本教學課程使用的範例工作定義。您使用的name和值family將用於建置規格檔案的下一個步驟。

    { "ipcMode": null, "executionRoleArn": "role_ARN", "containerDefinitions": [ { "dnsSearchDomains": null, "environmentFiles": null, "logConfiguration": { "logDriver": "awslogs", "secretOptions": null, "options": { "awslogs-group": "/ecs/hello-world", "awslogs-region": "us-west-2", "awslogs-stream-prefix": "ecs" } }, "entryPoint": null, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "command": null, "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": 128, "volumesFrom": [], "stopTimeout": null, "image": "image_name", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "hello-world" } ], "placementConstraints": [], "memory": "2048", "taskRoleArn": null, "compatibilities": [ "EC2", "FARGATE" ], "taskDefinitionArn": "ARN", "family": "hello-world", "requiresAttributes": [], "pidMode": null, "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "1024", "revision": 1, "status": "ACTIVE", "inferenceAccelerators": null, "proxyConfiguration": null, "volumes": [] }
  • 執行使用您先前提到的任務定義之服務的 Amazon ECS 叢集。如需詳細資訊,請參閱 Amazon 彈性容器服務開發人員指南中的建立叢集和建立服務

滿足這些先決條件之後,即可繼續教學並建立 CD 管道。

步驟 1:將組建規格檔案新增至來源儲存庫

本教學課程用 CodeBuild 來建立您的 Docker 映像檔,並將映像推送至 Amazon ECR。添加一個buildspec.yml文件到你的源代碼存儲庫告訴 CodeBuild如何做到這一點。下面的範例組建規格執行下列動作:

  • 預先建置階段:

    • 登錄 Amazon ECR。

    • 將儲存庫 URI 設定為 ECR 映像,並新增具有來源 Git 遞交 ID 之前七個字元的映像標籤。

  • 建置階段:

    • 建置 Docker 影像,並將映像標記為 latest 且具有 Git 遞交 ID。

  • 後置建置階段:

    • 使用兩個標籤將映像推送至 ECR 儲存庫。

    • 撰寫在組建根目錄imagedefinitions.json中呼叫的檔案,其中包含 Amazon ECS 服務的容器名稱以及映像檔和標籤。您 CD 管道的部署階段使用此資訊來建立服務之任務定義的新修訂,接著將服務更新為使用新的任務定義。imagedefinitions.json 是 ECS 任務工作者所需的檔案。

貼上此範例文字以建立buildspec.yml檔案,並取代影像和工作定義的值。此文字使用的是帳戶識別碼範例

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $REPOSITORY_URI:latest . - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPOSITORY_URI:latest - docker push $REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json

建置規格是針對中提供的範例任務定義所撰寫的必要條件,Amazon ECS 服務用於本教學課程。REPOSITORY_URI 值對應至 image 儲存庫 (不含任何映像標籤),而接近檔案結尾的 hello-world 值對應至服務任務定義中的容器名稱。

buildspec.yml 檔案新增至來源儲存庫
  1. 開啟文字編輯器,然後將上面的建置規格複製並貼入新的檔案。

  2. REPOSITORY_URI值 (012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world) 取代為您的碼頭映像檔的 Amazon ECR 儲存庫 URI (不含任何影像標籤)。將 hello-world 取代為服務任務定義中參考您 Docker 影像的容器名稱。

  3. 遞交您的 buildspec.yml 檔案並將之推送至來源儲存庫。

    1. 新增檔案。

      git add .
    2. 遞交變更。

      git commit -m "Adding build specification."
    3. 推送認可。

      git push

步驟 2:建立持續部署管道

使用 CodePipeline 精靈建立管線階段,並將來源儲存庫連線至 ECS 服務。

建立管道
  1. 請在以下位置開啟 CodePipeline 主控台。 https://console.aws.amazon.com/codepipeline/

  2. Welcome (歡迎使用) 頁面上,選擇 Create pipeline (建立管道)。

    如果這是您第一次使用 CodePipeline,則會顯示介紹頁面,而不是「歡迎」。選擇 Get Started Now (立即開始)。

  3. 在 [步驟 1:名稱] 頁面上,為管線名稱輸入管線的名稱。在此教學中,管道名稱為 hello-world

  4. 管線類型中,針對本教學課程的目的選擇 V1。您也可以選擇 V2;但是請注意,管道類型在特性和價格上有所不同。如需詳細資訊,請參閱 管線類型。選擇下一步

  5. 在「步驟 2:新增來源階段」頁面上,針對來源提供者,選擇 AWS CodeCommit

    1. 對於存放庫名稱,請選擇要用作管線來源位置的 CodeCommit存放庫名稱。

    2. 針對 Branch name (分支名稱),選擇要使用的分支,然後選擇 Next (下一步)

  6. 在 [步驟 3:新增建置階段] 頁面上,針對 [建置提供者] 選擇 AWS CodeBuild,然後選擇 [建立專案]。

    1. 針對 Project name (專案名稱),選擇您組建專案的唯一名稱。在此教學中,專案名稱為 hello-world

    2. 針對 Environment image (環境映像),選擇 Managed image (受管映像)

    3. 針對 Operating system (作業系統),請選擇 Amazon Linux 2

    4. 針對 Runtime(s) (執行時間),選擇 Standard (標準)

    5. 對於「影像」,請選擇aws/codebuild/amazonlinux2-x86_64-standard:3.0

    6. 針對 Image version (映像版本)Environment type (環境類型),請使用預設值。

    7. 選取 Enable this flag if you want to build Docker images or want your builds to get elevated privileges (若想建置 Docker 影像或讓您的建置提升權限,請啟用此標記)

    8. 取消選取CloudWatch 記錄。您可能需要展開「進階」。

    9. 選擇「繼續」 CodePipeline。

    10. 選擇下一步

      注意

      該嚮導為您的構建項目創建一個 CodeBuild 服務角色,稱為代碼生成 build-project-name- 服務角色。請記下此角色名稱,以便稍後在其中新增 Amazon ECR 許可時。

  7. 在「步驟 4:新增部署階段」頁面上,針對部署供應商,選擇 Amazon ECS

    1. 對於叢集名稱,請選擇執行服務的 Amazon ECS 叢集。在此教學中,叢集是 default

    2. 針對 Service name (服務名稱),選擇要更新的服務,然後選擇 Next (下一步)。在此教學中,服務名稱為 hello-world

  8. Step 5: Review (步驟 5:檢閱) 頁面上,檢閱您的管道組態,然後選擇 Create pipeline (建立管道) 來建立管道。

    注意

    現在已建立管道,將會嘗試執行不同的管道階段。但是,精靈建立的預設 CodeBuild 角色沒有執行buildspec.yml檔案中包含的所有命令的權限,因此建置階段會失敗。下節會新增建置階段的許可。

步驟 3:將 Amazon ECR 許可添加到角色 CodeBuild

該 CodePipeline 嚮導為 CodeBuild 構建項目創建了一個 IAM 角色,稱為代碼生成 build-project-name- 服務角色。在本教程中,名稱是 codebuild-hello-world-service-role。由於buildspec.yml檔案會呼叫 Amazon ECR API 操作,因此該角色必須具有允許進行這些 Amazon ECR 呼叫的許可政策。下列程序可協助您將適當的許可連接至角色。

若要將 Amazon ECR 許可新增至角色 CodeBuild
  1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

  2. 在左側導覽窗格中,選擇 Roles (角色)。

  3. 在搜尋方塊中,輸入 codebuild-,然後選擇 CodePipeline 精靈所建立的角色。在本教學課程中,角色名稱是 codebuild-hello-world-service-role

  4. Summary (摘要) 頁面上,選擇 Attach policies (連接政策)

  5. 選取 AmazonEC2 ContainerRegistryPowerUser 政策左側的核取方塊,然後選擇附加政策。

步驟 4:測試管道

您的管道應該擁有執行 end-to-end 原生 AWS 持續部署的一切。現在,將程式碼變更推送至來源儲存庫,以測試其功能。

測試管道
  1. 對設定的來源儲存庫進行程式碼變更、遞交並推送變更。

  2. 請在以下位置開啟 CodePipeline 主控台。 https://console.aws.amazon.com/codepipeline/

  3. 從清單中選擇管道。

  4. 觀看管道階段的管道進度。您的管道應該已完成,而 Amazon ECS 服務會執行透過程式碼變更建立的 Docker 映像檔。