我遇到了令人沮丧的边缘情况,现在必须引入自定义逻辑来解决或正确解决。
我正在 EC2 上的 Docker 容器内运行 Django 应用程序。我使用附加到实例的 IAM 角色来授予其对特定 S3 存储桶和一组操作的访问权限。这一切运行良好,我可以确认当 Python 直接在实例上运行时,Boto3 可以使用 IAM 角色进行身份验证并按预期访问存储桶。
但是,当 Python 在同一实例上的 Docker 容器内运行时, Boto3 无法使用相同的隐式身份验证策略。我已将 EC2 实例配置为使用 IMDSV2、所需的令牌身份验证并增加了允许的跳数(当前为 63,而我正在处理此问题,但理想情况下为 2-3)。特别奇怪的是,我能够访问 IMDSV2 端点,并使用 Curl 从容器内手动请求令牌,或使用 Requests 在 Python 内手动请求令牌,并将令牌传递到 Boto 并根据需要访问 S3 存储桶。
缺点手动获取令牌的缺点是我需要实现自己的缓存/会话刷新策略,或者承受不断请求新令牌的运行时负担。我也不完全清楚 Boto3 会话何时过期:是在 IMDVS2 令牌过期时还是在其他任意时间点过期?
因此,在我实施自己的缓存/重试策略之前,是否有一些明显的事情我'我缺少这应该使这一切能够工作?
我正在使用 Boto3 1.34.146、Docker 27 和 Docker Compose 2.29.1 并在 Ubuntu 22.04.3 上运行。很高兴提供任何其他背景或细节。
谢谢!
听起来已经做对了大部分事情来启用 Docker 容器中的 Boto3 IAM 角色假设。问题很可能出在容器与主机之间的共享凭据方式上。
以下是一些需要检查的事项,以解决此问题而不实现自己的缓存机制:
-
共享凭据的卷挂载:
确保已将 AWS 凭据文件挂载到容器中。这通常通过在
docker run
命令或docker-compose.yml
文件中使用-v
标志来完成。 关键在于挂载/var/run/shared/credentials
文件夹,该文件夹包含 IMDSv2 令牌。
yaml
version: "3.9"
services:
your-app:
image: your-image:latest
volumes:
- /var/run/shared/credentials:/var/run/shared/credentials:ro
-
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量:
从 AWS SDK 版本 1.16.23 开始,可以使用环境变量
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
,而不是挂载凭据文件。确保已在容器中设置了此环境变量,并且其值与从 IMDSv2 获取的令牌的相对 URI 匹配。此 URI 应类似于/latest/meta-data/iam/security-credentials/your-role-name
。
yaml
version: "3.9"
services:
your-app:
image: your-image:latest
environment:
- AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: /latest/meta-data/iam/security-credentials/your-role-name
-
IAM 角色信任关系: 仔细检查附加到 EC2 实例的 IAM 角色的信任关系。确保它明确信任
ec2.amazonaws.com
服务。可以在 IAM 控制台中找到此信息。 -
网络连接: 验证的容器是否可以访问 IMDSv2 端点 (169.254.169.254)。尝试从容器内部 ping 该地址。如果没有网络问题,请确保没有防火墙规则或网络配置阻止访问。
-
Boto3 会话过期: Boto3 本身不缓存凭据,它依赖于 AWS SDK for Python (botocore) 来处理凭据。默认情况下,botocore 会自动刷新凭据,并在接近过期时间时获取新凭据。不应该手动处理缓存或会话刷新。
如果在检查完所有这些后问题仍然存在:
- 提供详细的日志: 启用 Boto3 和 botocore 的详细日志记录,以获取更多关于身份验证失败原因的信息。
- 检查 Docker 版本: 确保使用的是最新版本的 Docker 和 Docker Compose,因为旧版本有时会出现凭据传递问题。
- 简化的环境: 尝试使用最小的 Dockerfile 和 docker-compose.yml 文件创建一个简单的测试用例,以消除应用程序中的其他因素。
通过系统地解决这些问题,应该能够确定问题的原因,并使 Boto3 在 Docker 容器中使用 IAM 角色进行身份验证,而无需自定义缓存逻辑。
标签:python,amazon-web-services,docker,amazon-ec2,boto3 From: 78795514