本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程: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
檔案新增至來源儲存庫
-
開啟文字編輯器,然後將上面的建置規格複製並貼入新的檔案。
-
將
REPOSITORY_URI
值 (
) 取代為您的碼頭映像檔的 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 服務。
建立管道
請在以下位置開啟 CodePipeline 主控台。
https://console.aws.amazon.com/codepipeline/ -
在 Welcome (歡迎使用) 頁面上,選擇 Create pipeline (建立管道)。
如果這是您第一次使用 CodePipeline,則會顯示介紹頁面,而不是「歡迎」。選擇 Get Started Now (立即開始)。
-
在 [步驟 1:名稱] 頁面上,為管線名稱輸入管線的名稱。在此教學中,管道名稱為 hello-world。
-
在管線類型中,針對本教學課程的目的選擇 V1。您也可以選擇 V2;但是請注意,管道類型在特性和價格上有所不同。如需詳細資訊,請參閱 管線類型。選擇下一步。
-
在「步驟 2:新增來源階段」頁面上,針對來源提供者,選擇 AWS CodeCommit。
-
對於存放庫名稱,請選擇要用作管線來源位置的 CodeCommit存放庫名稱。
-
針對 Branch name (分支名稱),選擇要使用的分支,然後選擇 Next (下一步)。
-
-
在 [步驟 3:新增建置階段] 頁面上,針對 [建置提供者] 選擇 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 記錄。您可能需要展開「進階」。
-
選擇「繼續」 CodePipeline。
-
選擇下一步。
注意
該嚮導為您的構建項目創建一個 CodeBuild 服務角色,稱為代碼生成
build-project-name
- 服務角色。請記下此角色名稱,以便稍後在其中新增 Amazon ECR 許可時。
-
-
在「步驟 4:新增部署階段」頁面上,針對部署供應商,選擇 Amazon ECS。
-
對於叢集名稱,請選擇執行服務的 Amazon ECS 叢集。在此教學中,叢集是 default。
-
針對 Service name (服務名稱),選擇要更新的服務,然後選擇 Next (下一步)。在此教學中,服務名稱為 hello-world。
-
-
在 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
前往 https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 -
在左側導覽窗格中,選擇 Roles (角色)。
-
在搜尋方塊中,輸入 codebuild-,然後選擇 CodePipeline 精靈所建立的角色。在本教學課程中,角色名稱是 codebuild-hello-world-service-role。
-
在 Summary (摘要) 頁面上,選擇 Attach policies (連接政策)。
-
選取 AmazonEC2 ContainerRegistryPowerUser 政策左側的核取方塊,然後選擇附加政策。
步驟 4:測試管道
您的管道應該擁有執行 end-to-end 原生 AWS 持續部署的一切。現在,將程式碼變更推送至來源儲存庫,以測試其功能。
測試管道
-
對設定的來源儲存庫進行程式碼變更、遞交並推送變更。
請在以下位置開啟 CodePipeline 主控台。
https://console.aws.amazon.com/codepipeline/ -
從清單中選擇管道。
-
觀看管道階段的管道進度。您的管道應該已完成,而 Amazon ECS 服務會執行透過程式碼變更建立的 Docker 映像檔。