如何让 docker 容器使用 codebuild IAM 身份验证部署到 AWS?

How can I let docker container use codebuild IAM authentication to deploy to AWS?

我 运行ning CI/CD 在 codebuild 项目中,我已经为 codebulid 项目配置了一个角色以允许它部署资源,例如lambda 到 AWS 账户。

但是当我从 codebuild 项目的 docker 容器中 运行 部署命令时,我得到了这个错误:

AWS provider credentials not found. Learn how to set up AWS provider credentials in our docs here: <http://slss.io/aws-creds-setup>.

我搜索过有人说要使用 env var 或 aws 凭据配置文件。但是我的脚本 运行ning 来自带有 IAM 身份验证的代码构建项目。如何将它传递给 docker 容器?

我不会授予 Codebuild 修改资源的直接访问权限,您可以通过单独的角色轻松地将其分离出来以部署内容,并确保您已添加必要的权限来承担该角色。以下是 AWS 推荐的方法。

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
      - echo $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')
      - echo $AWS_ACCESS_KEY_ID
      - echo $AWS_SECRET_ACCESS_KEY
      - echo $AWS_SESSION_TOKEN
  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

里面Dockefile

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

How do I pass temporary credentials for AssumeRole into the Docker runtime with AWS CodeBuild?

如果您仍想使用 CodeBuild IAM 权限,那么您可以在 buildspec.yml 中为您的 Codebuild 项目解析对元数据服务的调用,这将为您提供您的凭据 Codebuild IAM Service Role,最终以与上述类似的方式传递给 docker build 命令。或者,如果您愿意,可以将其存储在凭据文件中并与 docker 环境共享,您可以在其中通过提供配置文件来 运行 命令。

version: 0.2
phases:
  install:
    commands:
      - TOKEN=$(curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI)
      - echo $TOKEN
      - export AWS_ACCESS_KEY_ID=$(echo "${TOKEN}" | jq -r '.Credentials.AccessKeyId')
      - export AWS_SECRET_ACCESS_KEY=$(echo "${TOKEN}" | jq -r '.Credentials.SecretAccessKey')
      - export AWS_SESSION_TOKEN=$(echo "${TOKEN}" | 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

这将为您提供凭据:

{
  "RoleArn": "AQICAHi8hGr15WsKx4aqJ3PRJImmR37T8bWHAVZQA8s9Lug",
  "AccessKeyId": "ASIA2WXKNDTKPASDADRT",
  "SecretAccessKey": "***",
  "Token": "IQoJb3JpZ2luX2VjENH//////////wEaCXVzLWVhc3QtMSJ",
  "Expiration": "2021-03-05T10:02:01Z"
}

第二个 samtoddler 答案的变体:

docker build --build-arg AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI --build-arg AWS_REGION=$AWS_REGION 

并在 docker 文件中:

ARG AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
ARG AWS_REGION

基本上 CodeBuild/Docker 足够聪明,可以自动执行 Sam 在安装部分的命令:)