You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker容器中通过AssumeRole执行AWS操作(无需硬编码密钥)

问题描述

用户提供的Dockerfile内容如下:

FROM python:3.9
RUN mkdir /app
COPY aws_spot_connect_test.py /app/aws_spot_connect.py
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["sleep","1800"] 

用户希望在容器中通过IAM角色执行AWS操作,避免硬编码ACCESS_KEY和SECRET_ACCESS_KEY,通过以下命令启动容器进入交互式bash:

docker run -it --entrypoint /bin/bash adi20022023:v2 

用户已创建信任关系指向自身的IAM角色,并设置环境变量:

export ROLE_ARN=xxxxx

但执行aws sts get-caller-identity或尝试AssumeRole时,报错Unable to locate credentials,需解决如何在不输入密钥的情况下执行AWS操作。


解决方案

场景1:本地开发环境运行容器

若在本地机器运行容器,可通过以下方式让容器获取本地AWS凭证:

  • 挂载本地AWS配置目录到容器:
    docker run -it --entrypoint /bin/bash -v ~/.aws:/root/.aws adi20022023:v2
    
    容器内的AWS CLI/SDK会自动读取挂载的凭证文件,之后执行角色切换命令即可:
    aws sts assume-role --role-arn $ROLE_ARN --role-session-name local-session
    
  • 传递本地AWS环境变量给容器:
    docker run -it --entrypoint /bin/bash \
      -e AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) \
      -e AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) \
      -e AWS_SESSION_TOKEN=$(aws configure get aws_session_token) \
      adi20022023:v2
    
    此方式适用于本地使用临时凭证(如SSO、MFA)的场景,同样可执行角色切换操作。

场景2:AWS计算服务上运行容器(EC2/ECS/EKS)

若容器运行在AWS内部服务,推荐使用实例角色或任务角色实现无密钥访问:

  • EC2实例:给运行容器的EC2实例附加具备sts:AssumeRole权限的IAM角色,容器启动后会自动获取实例角色的临时凭证,直接执行角色切换命令即可。
  • ECS/EKS:配置ECS任务角色或EKS服务账户角色,赋予其Assume目标角色的权限,容器内的AWS工具会自动加载任务角色凭证,无需额外配置。

场景3:Python脚本自动处理角色切换

在Python脚本中直接通过AWS SDK实现角色切换,无需手动执行CLI命令,示例代码:

import boto3

def get_assumed_role_credentials(role_arn, session_name):
    sts_client = boto3.client('sts')
    response = sts_client.assume_role(
        RoleArn=role_arn,
        RoleSessionName=session_name
    )
    return response['Credentials']

# 替换为你的角色ARN和会话名称
role_arn = "arn:aws:iam::123456789012:role/your-target-role"
session_name = "script-session"

# 获取角色凭证
credentials = get_assumed_role_credentials(role_arn, session_name)

# 使用凭证初始化AWS客户端
s3_client = boto3.client(
    's3',
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken']
)

# 执行AWS操作
print(s3_client.list_buckets())

关键注意事项

  • 确保用于获取角色的身份(本地用户、实例角色、任务角色)已被授予sts:AssumeRole权限。
  • 目标角色的信任关系需允许当前身份进行角色切换(比如信任本地用户ARN、实例角色ARN或任务角色ARN)。

内容的提问来源于stack exchange,提问作者Adi Israel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:25:30