如何使用 CodeBuild 将 AssumeRole 的临时凭证传递到 Docker 运行时中?

上次更新日期:2021 年 7 月 20 日

我想使用 AWS CodeBuild 将 AssumeRole 的临时凭证传递到 Docker 运行时。

简短描述

CodeBuild 在构建容器和 Docker 运行时中将 CodeBuild 服务角色作为默认 AWS 凭证使用。

AssumeRole 凭证导出为环境变量。然后,使用 docker build--build-arg 参数将这些变量传递到 Docker 运行时。有关详细信息,请参阅 Docker 文档网站上的 dock build

解决方法

1.    为 Docker 运行时创建新角色。例如:Secretassumerole

2.    然后使用该新角色从 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"
            ]
        }
    ]
}

重要提示:$account_id 替换为您的账户 ID。您可以授予 Docker 运行期间的任何操作权限。

3.    将 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"
        }
    ]
}

4.    使用构建规范将 AssumeRole 凭证导出到某个环境变量中。然后使用 docker build 命令将凭证传递到 Docker 运行时。例如:

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 8
    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 来设置 assume role 的最大会话持续时间。--duration-seconds 选项可接受 1 小时到 12 小时之间的值。如果设置的值大于 12 小时,则操作将失败。

5.    在构建镜像时,从您的 Dockerfile 中获取 AssumeRole 凭证。例如:

FROM amazonlinux:latest
RUN yum -y install aws-cli 
ARG AWS_DEFAULT_REGION 
ARG AWS_ACCESS_KEY_ID 
ARG AWS_SECRET_ACCESS_KEY 
ARG AWS_SESSION_TOKEN 
RUN echo $AWS_DEFAULT_REGION 
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

注意:您可以从 buildspec 和打印临时凭证的 Dockerfile 中删除 echo 语句。

输出:

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
KJq+JNqmnNq1JirNUBkxc+kRVavgZwhpFFIJjxD6
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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?