【问题标题】:Pass AWS CodeBuild IAM Role inside Docker container [unable to locate credentials]在 Docker 容器中传递 AWS CodeBuild IAM 角色 [无法找到凭证]
【发布时间】:2021-08-19 16:28:20
【问题描述】:

在 CodeBuild 项目上配置的角色在运行时环境中运行良好,但当我们从容器内运行命令时不起作用,它显示“无法找到凭据”。
让我知道我们如何在容器内开箱即用地使用角色。

【问题讨论】:

  • 您可以将凭据作为环境变量传递,然后在运行时使用它们
  • 我不想将它作为环境变量传递。理想情况下,容器运行时必须附加该角色,类似于它在 ECS 中作为任务角色的工作方式。

标签: amazon-web-services amazon-iam aws-codepipeline aws-codebuild


【解决方案1】:

您可以利用凭证源“EcsContainer”无缝承担角色,而无需在 buildspec.yml 中导出新凭证。

credential_source - 用于获取初始假设角色调用的凭据的凭据提供程序。此参数不能与 source_profile 一起提供。有效值为:

  • 从环境变量中提取源凭据的环境。
  • Ec2InstanceMetadata 使用 EC2 实例角色作为源凭证。
  • EcsContainer 使用 ECS 容器凭证作为源凭证。

发件人:https://docs.aws.amazon.com/cli/latest/topic/config-vars.html

步骤:

步骤 0:创建一个新角色“arn:aws:iam::0000000000:role/RoleToBeAssumed”并附加所需的策略以提供您在构建期间运行的命令所需的权限。

第 1 步:将 sts:assumeRole 权限添加到您的 CodeBuild 服务角色。这是一个示例策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "sts:*",
            "Resource": "arn:aws:iam::0000000000:role/RoleToBeAssumed"
        }
    ]
}

第 2 步:配置您的构建容器以使用凭据元数据作为代入角色的来源。这是一个构建规范示例:

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 8
    commands:
      - aws sts get-caller-identity
      - mkdir ~/.aws/ && touch ~/.aws/config
      - echo "[profile buildprofile]" > ~/.aws/config
      - echo "role_arn = arn:aws:iam::0000000000:role/RoleToBeAssumed" >> ~/.aws/config
      - echo "credential_source = EcsContainer" >> ~/.aws/config
      - aws sts get-caller-identity --profile buildprofile

【讨论】:

  • 谢谢?,非常干净,乐于助人
  • 另外,我必须配置 RoleToBeAssumed 的假设策略文档以允许 CodeBuild 角色承担它。
【解决方案2】:

如果您需要在构建环境中运行 Docker 容器并且容器需要 AWS 凭证,则您必须将凭证从构建环境传递到容器。

docker run -e AWS_DEFAULT_REGION -e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI your-image-tag aws s3 ls

https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions

【讨论】:

  • 像魅力一样工作!
【解决方案3】:

另一种方法是手动承担角色并导出身份验证令牌。确保您有 ASSUME_ROLE_ARN 作为环境变量 -

commands:
  - TEMP_ROLE=`aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name temp`
  - 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')
  - docker push $ECR_IMAGE_URL:$IMAGE_TAG

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2020-12-01
    • 2019-12-29
    • 2016-11-01
    相关资源
    最近更新 更多