AWS Codebuild deploy docker image to ECR — 透過 codebuild 將 build 好的 docker 推到 aws ECR
本範例簡單教學如何透過 aws codebuild 服務將 docker image 推送到 aws Amazon Elastic Container Registry (以下會簡稱為 ECR)
專案切記要記得有 Dockerfile, 且要記一下專案的 Dockerfile 位於何處
- 首先新建一個 aws ecr 服務
2. 我們這邊選擇 private , 並且設定可以識別的 repository name, 因為後續會在 codebuild 指定要推送到 ecr 的某個 repository name
3. 輸入完識別的 repository name 後, 接著新增 codebuild
4. 輸入 codebuild 名稱
5. 設定 codebuild 來源, 假設你是選擇 github 的話, 登入後選擇要搭配 codebuild 的 repository
ps: 初次尚未登入的話記得先點選 connect github
6. 可以在 source version 設定你 branch 名稱
7. 看要不要 github webhook 觸發的時候觸發 codebuild, 要得話打勾
8. 接著設定 codebuild 環境
a. 這邊使用的作業系統為 ubuntu
b. runtime 時間選擇 standard
c. image 選擇 aws/codebuild/standard:4.0
d. environment type 選擇 linux
e. 這邊因為要使用 docker 因此勾選 privileged
f. 這邊假如是初次使用 codebuild 的話記得創建新個 service role, 這邊要記錄一下 service role, 因為後續會在多設定一些 ecr policy 給這個 service role
9. 設定 codebuild 設定檔, 也就是告訴 codebuild 在每個階段要執行什麼 command, 假如不輸入的話預設為 buildspec.yml, 不過我是都會輸入就是了
10. 看有沒有要把 codebuild 產生出來的東西儲存在某些地方, 假如要的話可以設定 artifact
11. 點選 create build project, 新增 codebuild
設定好 codebuild 以及 ecr 後,要給 codebuild 的 service role 設定 ecr 的 policy
- 進入 iam 搜尋剛剛 codebuild 創建的 role
2. 選擇 service role 後點選 policy name , 我們要將 ecr policy 添加在此 policy
3. 點選 edit policy
4. 點選 add permission
5. 新增 aws ecr service
6. 新增以下 permission, 新增好後 codebuild 的 service role 也就擁有了基本的 ecr 權限
"ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload",
"ecr:GetAuthorizationToken",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
設定 codebuild environment
- 選取 environment
2. 設定以下四個環境變數
a. AWS_DEFAULT_REGION -> aws 區域
b. AWS_ACCOUNT_ID -> 帳號 id
c. IMAGE_REPO_NAME -> ecr repository name
d. IMAGE_TAG -> docker image tag
ps: 在配置 Dockerfile 的時候看要不要使用 Amazon ECR Public Gallery, 因為 docker hub 有限制
- 配著 codebuild buildspec.yml
version: 0.2phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image...
# 此處我 docker file 是位於 docker 資料夾底下, 這邊就看使用者怎麼自己去設定 - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG --file docker/Dockerfile . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
2. 都設定好之後就可以在 codebuild 介面去手動點選 build, 在執行成功後也會在 aws ecr 看到 image
假如有搭配 CodePipeline 的話, CodeBuild 需要給定 codestar connection policy 詳情可以點選此連結
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "codestar-connections:UseConnection",
"Resource": "insert connection ARN here"
}
]
}
參考資料:
- https://stackoverflow.com/questions/65806330/toomanyrequests-you-have-reached-your-pull-rate-limit-you-may-increase-the-lim
- https://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/sample-docker.html
- https://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/build-spec-ref.html
- https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html