本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:使用 CodePipeline 進行 Amazon ECS 標準部署
本教學課程可協助您使用 Amazon ECS 搭配 CodePipeline 建立完整的end-to-end持續部署 (CD) 管道。
重要
在主控台中建立管道時,CodePipeline 將使用 S3 成品儲存貯體來製作成品。(這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中,請確定 S3 成品儲存貯體屬於 AWS 帳戶 安全且可靠的 。
注意
本教學課程適用於 CodePipeline 的 Amazon ECS 標準部署動作。如需在 CodePipeline 中使用 Amazon ECS 到 CodeDeploy 藍/綠部署動作的教學課程,請參閱 教學課程:使用 Amazon ECR 來源和 ECS-to-CodeDeploy 部署建立管道。 CodePipeline
注意
本教學課程適用於具有來源動作之 CodePipeline 的 Amazon ECS 標準部署動作。如需使用 Amazon ECSstandard部署動作搭配 CodePipeline 中的 ECRBuildAndPublish 建置動作來推送映像的教學課程,請參閱 教學課程:使用 CodePipeline 建置 Docker 映像並將其推送至 Amazon ECR。
必要條件
您必須先有幾個資源,才能使用此教學來建立 CD 管道。以下是在開始使用前需準備的事項:
注意
所有這些資源都應在相同 AWS 區域內建立。
-
來源控制儲存庫 (本教學課程使用 CodeCommit) 搭配您的 Dockerfile 和應用程式來源。如需詳細資訊,請參閱AWS CodeCommit 《 使用者指南》中的建立 CodeCommit 儲存庫。
-
Docker 映像儲存庫 (本教學課程使用 Amazon ECR),其中包含您從 Dockerfile 和應用程式來源建置的映像。如需詳細資訊,請參閱《Amazon Elastic Container Registry 使用者指南》中的建立儲存庫和推送映像。
-
Amazon ECS 任務定義,參考 映像儲存庫中託管的 Docker 映像。如需詳細資訊,請參閱《Amazon Elastic Container Service 開發人員指南》中的建立任務定義。
重要
CodePipeline 的 Amazon ECS 標準部署動作會根據 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 Elastic Container Service 開發人員指南》中的建立叢集和建立服務。
滿足這些先決條件之後,即可繼續教學並建立 CD 管道。
步驟 1:將組建規格檔案新增至來源儲存庫
本教學課程使用 CodeBuild 建置您的 Docker 映像,並將映像推送至 Amazon ECR。將buildspec.yml
檔案新增至您的原始程式碼儲存庫,以告知 CodeBuild 如何執行此操作。下面的範例組建規格執行下列動作:
-
預先建置階段:
-
登入 Amazon ECR。
-
將儲存庫 URI 設定為 ECR 映像,並新增具有來源 Git 遞交 ID 之前七個字元的映像標籤。
-
-
建置階段:
-
建置 Docker 影像,並將映像標記為
latest
且具有 Git 遞交 ID。
-
-
後置建置階段:
-
使用兩個標籤將映像推送至 ECR 儲存庫。
-
在具有 Amazon ECS 服務容器名稱和映像和標籤的建置根
imagedefinitions.json
中寫入名為 的檔案。您 CD 管道的部署階段使用此資訊來建立服務之任務定義的新修訂,接著將服務更新為使用新的任務定義。imagedefinitions.json
是 ECS 任務工作者所需的檔案。
-
貼上此範例文字以建立 buildspec.yml
檔案,並取代映像和任務定義的值。此文字使用範例帳戶 ID 111122223333。
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
檔案新增至來源儲存庫
-
開啟文字編輯器,然後將上面的建置規格複製並貼入新的檔案。
-
將
REPOSITORY_URI
值 (
) 取代為您的 Docker 映像的 Amazon ECR 儲存庫 URI (不含任何映像標籤)。將012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
取代為服務任務定義中參考您 Docker 影像的容器名稱。hello-world
-
遞交您的
buildspec.yml
檔案並將之推送至來源儲存庫。-
新增檔案。
git add .
-
遞交變更。
git commit -m "Adding build specification."
-
推送認可。
git push
-
步驟 2:建立持續部署管道
使用 CodePipeline 精靈來建立管道階段,並將來源儲存庫連線至 ECS 服務。
建立管道
前往 https://console.aws.amazon.com/codepipeline/
開啟 CodePipeline 主控台。 -
在 Welcome (歡迎使用) 頁面上,選擇 Create pipeline (建立管道)。
如果這是您第一次使用 CodePipeline,則會顯示簡介頁面,而不是歡迎。選擇 Get Started Now (立即開始)。
-
在步驟 1:選擇建立選項頁面的建立選項下,選擇建置自訂管道選項。選擇 Next (下一步)。
-
在步驟 2:選擇管道設定中,在管道名稱中輸入管道的名稱。在此教學中,管道名稱為 hello-world。
-
在管道類型中,將預設選擇保留在 V2。管道類型在特性和價格方面有所不同。如需詳細資訊,請參閱管道類型。選擇 Next (下一步)。
-
在步驟 3:新增來源階段頁面上,針對來源提供者,選擇 AWS CodeCommit。
-
針對儲存庫名稱,選擇要用作管道來源位置的 CodeCommit 儲存庫名稱。
-
針對 Branch name (分支名稱),選擇要使用的分支,然後選擇 Next (下一步)。
-
-
在步驟 4:新增建置階段頁面上,針對建置提供者,選擇 AWS CodeBuild,然後選擇建立專案。
-
針對 Project name (專案名稱),選擇您組建專案的唯一名稱。在此教學中,專案名稱為 hello-world。
-
針對 Environment image (環境映像),選擇 Managed image (受管映像)。
-
針對 Operating system (作業系統),請選擇 Amazon Linux 2。
-
針對 Runtime(s) (執行時間),選擇 Standard (標準)。
-
針對映像,選擇
aws/codebuild/amazonlinux2-x86_64-standard:3.0
。 -
針對 Image version (映像版本) 和 Environment type (環境類型),請使用預設值。
-
選取 Enable this flag if you want to build Docker images or want your builds to get elevated privileges (若想建置 Docker 影像或讓您的建置提升權限,請啟用此標記)。
-
取消選取 CloudWatch logs (CloudWatch 日誌)。您可能需要展開進階。
-
選擇 Continue to CodePipeline (繼續 CodePipeline)。
-
選擇 Next (下一步)。
注意
精靈會為您的建置專案建立 CodeBuild 服務角色,稱為 codebuild-
build-project-name
-service-role。請記下此角色名稱,稍後再新增 Amazon ECR 許可。
-
-
在步驟 5:新增部署階段頁面上,針對部署提供者,選擇 Amazon ECS。
-
針對叢集名稱,選擇服務執行所在的 Amazon ECS 叢集。在此教學中,叢集是 default。
-
針對 Service name (服務名稱),選擇要更新的服務,然後選擇 Next (下一步)。在此教學中,服務名稱為 hello-world。
-
-
在 Step 6: Review (步驟 6:檢閱) 頁面上,檢閱您的管道組態,然後選擇 Create pipeline (建立管道) 來建立管道。
注意
現在已建立管道,將會嘗試執行不同的管道階段。不過,精靈建立的預設 CodeBuild 角色沒有執行
buildspec.yml
檔案中包含的所有命令的許可,因此建置階段會失敗。下節會新增建置階段的許可。
步驟 3:將 Amazon ECR 許可新增至 CodeBuild 角色
CodePipeline 精靈為 CodeBuild 組建專案建立 IAM 角色,稱為 codebuild-build-project-name
-service-role。在本教學課程中,名稱為 codebuild-hello-world-service-role。由於 buildspec.yml
檔案會呼叫 Amazon ECR API 操作,因此該角色必須具有允許 進行這些 Amazon ECR 呼叫的許可政策。下列程序可協助您將適當的許可連接至角色。
將 Amazon ECR 許可新增至 CodeBuild 角色
開啟位於 https://console.aws.amazon.com/iam/
的 IAM 主控台。 -
在左側導覽窗格中,選擇 Roles (角色)。
-
在搜尋方塊中,輸入 Codebuild-,然後選擇 CodePipeline 精靈建立的角色。在此教學中,角色名稱為 codebuild-hello-world-service-role。
-
在 Summary (摘要) 頁面上,選擇 Attach policies (連接政策)。
-
選取 AmazonEC2ContainerRegistryPowerUser 政策左側的方塊,然後選擇 Attach policy (連接政策)。
步驟 4:測試管道
您的管道應具備執行end-to-end原生 AWS 持續部署所需的一切。現在,將程式碼變更推送至來源儲存庫,以測試其功能。
測試管道
-
對設定的來源儲存庫進行程式碼變更、遞交並推送變更。
前往 https://console.aws.amazon.com/codepipeline/
開啟 CodePipeline 主控台。 -
從清單中選擇管道。
-
觀看管道階段的管道進度。您的管道應該完成,而且您的 Amazon ECS 服務會執行從程式碼變更建立的 Docker 映像。