如何解决如何让 docker 容器使用 codebuild IAM 身份验证部署到 AWS?
我在 codebuild 项目中运行 CI/CD,并且我为 codebulid 项目配置了一个角色以允许它部署资源,例如lambda 到 AWS 账户。
但是当我在 codebuild 项目中从 docker 容器运行 deploy 命令时,出现此错误:
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 凭据配置文件。但是我的脚本是从带有 IAM 身份验证的 codebuild 项目中运行的。如何将其传递给 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 在安装部分的命令:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。