簡體   English   中英

如何讓 docker 容器使用 codebuild IAM 身份驗證部署到 AWS?

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

我在 codebuild 項目中運行 CI/CD,並且我已經為 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 憑據配置文件。 但是我的腳本是從帶有 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

如何使用 AWS CodeBuild 將 AssumeRole 的臨時憑證傳遞到 Docker 運行時?

或者

如果您仍想使用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 在安裝部分中的命令:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM