如何使用 CodeBuild 將 AssumeRole 的臨時憑證傳遞到 Docker 執行期?
我想要使用 AWS CodeBuild 將 AssumeRole 的臨時憑證傳遞到 Docker 執行期。
簡短說明
CodeBuild 會使用 CodeBuild 服務角色做為組建容器中的預設 AWS 憑證。在組建容器內執行的 Docker 執行期不會取得任何 AWS 憑證,必須明確設定。
將 AssumeRole 憑證匯出為環境變數。然後,將這些變數傳遞到 Docker 執行期,方法是使用**--build-arg ** 參數來建置碼頭建置。** **如需詳細資訊,請參閱 Docker Docs 網站上的 docker build。
解決方法
1. 為 Docker 執行期建立新角色。例如: Secretassumerole
2. 更新 Secretassumerole 的信任關係政策,並為擔任角色新增 CodeBuild 服務角色許可。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role" }, "Action": "sts:AssumeRole" } ] }
3. 使用新角色從 AWS Secrets Manager 取得私密的 AWSExampleSecret 值。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": [ "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/AWSExampleSecret-EHWYme" ] } ] }
**注意:**用您的帳戶 ID 取代 $account_id。您可以在 Docker 執行期期間授予任何作業許可。
4. 將 sts:assumeRole 許可新增至您的 CodeBuild 服務角色,以允許 AssumeRole 作業。例如:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole" } ] }
5. 使用組建規格將 AssumeRole 認證匯出至環境變數。然後,使用 docker build 命令將憑證傳遞到 Docker 執行期。例如:
version: 0.2 phases: install: runtime-versions: nodejs: 16 commands: - ASSUME_ROLE_ARN="arn:aws:iam::$account_id:role/Secretassumerole" - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name test) - export TEMP_ROLE - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken') pre_build: commands: - echo Build started on 'date' - echo Building the Docker image... - docker build . --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN
注意:您可以使用 --duration-seconds 來設定擔任角色的工作階段持續時間上限。由於這個程序涉及角色鏈結,--duration-seconds 選項可接受的最大值為 3,600 秒。如果您設定的值大於 3,600 秒,則作業會失敗。如需詳細資訊,請參閱角色術語和概念中的角色鏈結一節。
6. 在您的 Dockerfile 中,在建置映像時取得 AssumeRole 憑證。例如:
FROM amazonlinux:latest RUN yum -y install aws-cli ARG AWS_ACCESS_KEY_ID ARG AWS_SECRET_ACCESS_KEY ARG AWS_SESSION_TOKEN RUN echo $AWS_ACCESS_KEY_ID RUN echo $AWS_SECRET_ACCESS_KEY RUN echo $AWS_SESSION_TOKEN RUN aws sts get-caller-identity RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1
**注意:**您可以在 DOCKERFILE 中新增 RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret,以擷取組建中的密碼。警告: 這樣做可能會在組建日誌中公開您的機密。
輸出:
Step 8/11 : RUN echo $AWS_ACCESS_KEY_ID ---> Running in 1a1b1c1d1e1f AKIAIOSFODNN7EXAMPLE Removing intermediate container 2a3b4c5d6e7f ---> 32a8170f9697 Step 9/11 : RUN echo $AWS_SECRET_ACCESS_KEY ---> Running in 3a3b3c3d3e3f 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 Removing intermediate container 3a3b3c3d3e3f ---> 4a4b4c4d4e4f Step 10/11 : RUN echo $AWS_SESSION_TOKEN ---> Running in 5a5b5c5d5e5f FQoGZXIvYXdzEJP//////////wEaDPTjooaOAaU8NDj5oyKkAjVwT4uQHTZJdCtfOZxa6wTZVOy0Zkw+laN1RRVZhvhdPOWhU8VgK2d7ZgTlqaXn4NSrdWlnub6g5JobP4o509t3VLdMUR5ZJJcpnSlJAY5YM7vlPndroGcV+Y689ztVzQ1uVxdtpjQK1qh87fw6m0dHt7Q8Y8TferRNVvCM4kOroxPzovTbO6IkLDcBp8PhOVgtVtxEpON6nZrN990zzUmhXjT0vrtpDtAi339hhs7fzDOrnllQHSAmSerT0NhMOYVqBH1HJOq3FYnG+TUbHENpSq3kwTiPL2uoTw7/Ufrrgz4i3ENHm3rIWlbD8VuleDl5yhooKifmKDPjQAHs5HbVjD9lnxQFrCIuyvZdmsqzgoIjPt6z5H8lzugLHAAmbgiOwDoo+Oba7QU= Removing intermediate container 5a5b5c5d5e5f ---> 0cc838f3c865 Step 11/11 : RUN aws sts get-caller-identity ---> Running in 6a6b6c6d6e6f { "Account": "xxxxxxxxx", "UserId": "AIDACKCEVSQ6C2EXAMPLE:test", "Arn": "arn:aws:sts::$account_id:assumed-role/Secretassumerole/test" } Removing intermediate container 6d525393d667 ---> 2da2f38adc77 Step 12/12 : RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1 ---> Running in 7a7b7c7d7e7f { "Name": "tutorials/AWSExampleSecret", "VersionId": "1a23bb45-679c-1d2e-fg34-567891234hi5", "SecretString": "{\"username\":\"myserviceusername\",\"password\":\"yourPassword\"}", "VersionStages": [ "AWSCURRENT" ], "CreatedDate": 1558616482.926, "ARN": "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/M-EHWYme" } Removing intermediate container 8a8b8c8d8e8f ---> 9a9b9c9d9e9f Successfully built 9a9b9c9d9e9f
相關內容
- 已提問 7 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前