如何在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配置目录到容器:
容器内的AWS CLI/SDK会自动读取挂载的凭证文件,之后执行角色切换命令即可:docker run -it --entrypoint /bin/bash -v ~/.aws:/root/.aws adi20022023:v2aws sts assume-role --role-arn $ROLE_ARN --role-session-name local-session - 传递本地AWS环境变量给容器:
此方式适用于本地使用临时凭证(如SSO、MFA)的场景,同样可执行角色切换操作。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
场景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
相关产品推荐
相关产品推荐

