如何让 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 在安装部分的命令:)
我 运行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 在安装部分的命令:)