如何在绑定EC2只读IAM角色的EC2实例Docker容器中运行AWS CLI
解决Docker容器内AWS CLI无法使用EC2实例IAM角色的问题
问题分析
宿主机能正常使用绑定的IAM角色,是因为EC2实例可通过**实例元数据服务(IMDS)**自动获取临时凭证;而Docker容器默认网络隔离,无法直接访问IMDS,导致权限验证失败。以下是无需手动配置访问密钥的安全解决方案:
解决方案1:使用主机网络运行容器
直接让容器共享宿主机的网络命名空间,容器将获得与宿主机完全相同的网络访问权限,包括IMDS:
docker run --network host -it amazon/aws-cli ec2 describe-instances
此方法最简单,容器内的AWS CLI会自动通过IMDS获取宿主机绑定的IAM角色临时凭证,权限与宿主机完全一致。
解决方案2:Bridge网络下配置容器访问IMDS
若不想使用主机网络,可通过以下方式让容器访问宿主机的IMDS:
- 先查看宿主机Docker bridge的IP(通常为
172.17.0.1,执行ip addr show docker0确认) - 运行容器时指定IMDS端点,AWS CLI会自动处理IMDSv2的token获取逻辑:
docker run -it amazon/aws-cli \ --env AWS_EC2_METADATA_SERVICE_ENDPOINT=http://<宿主机bridge IP>:80 \ ec2 describe-instances
替换<宿主机bridge IP>为实际查询到的地址即可。
解决方案3:挂载宿主机的凭证缓存目录
EC2实例会缓存IAM角色的临时凭证到/var/lib/aws/credentials,可将此目录挂载到容器内,让容器直接复用缓存的凭证:
docker run -it -v /var/lib/aws/credentials:/var/lib/aws/credentials amazon/aws-cli ec2 describe-instances
注意:若容器以非root用户运行,需确保该用户对挂载目录有读取权限,可添加--user root参数临时以root身份运行容器。
验证方法
执行以下命令确认容器已正确获取IAM角色权限:
aws sts get-caller-identity
返回结果应显示绑定的IAM角色ARN,而非权限错误提示。
内容的提问来源于stack exchange,提问作者Swarnim Pratap Singh
相关产品推荐
相关产品推荐

