首页 > 编程问答 >在 EC2 上的 Docker 内使用 Boto3 时,无法使用隐式 IAM/基于角色的身份验证

在 EC2 上的 Docker 内使用 Boto3 时,无法使用隐式 IAM/基于角色的身份验证

时间:2024-07-26 06:00:04浏览次数:8  
标签:python amazon-web-services docker amazon-ec2 boto3

我遇到了令人沮丧的边缘情况,现在必须引入自定义逻辑来解决或正确解决。

我正在 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 角色假设。问题很可能出在容器与主机之间的共享凭据方式上。

以下是一些需要检查的事项,以解决此问题而不实现自己的缓存机制:

  1. 共享凭据的卷挂载: 确保已将 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

  1. 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

  1. IAM 角色信任关系: 仔细检查附加到 EC2 实例的 IAM 角色的信任关系。确保它明确信任 ec2.amazonaws.com 服务。可以在 IAM 控制台中找到此信息。

  2. 网络连接: 验证的容器是否可以访问 IMDSv2 端点 (169.254.169.254)。尝试从容器内部 ping 该地址。如果没有网络问题,请确保没有防火墙规则或网络配置阻止访问。

  3. 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

相关文章

  • Azure Open AI - Python 和 Java API 之间 gpt4o 的结果截然不同
    我使用Java和PythonAPI对AzureOpenAI进行相同的调用,但收到截然不同的结果:相同的系统提示相同的用户提示适用于Java和Python的azureai包的相同(最新)版本尽管输入的用户和系统提示完全相同,但响应却非常不同-python提示是“正确的”并......
  • leetcode 输出错误? (Python)
    我的VSCode/本地终端给出了[1,4,1,5,1,6]的正确输出,但不知何故leetcode给了我完全不同的输出。我在这里错过了什么吗?这怎么可能?顺便说一下,这是wigglesort2将我的本地代码复制粘贴到leetcode中给出了不同的输出数组很难在没有看到你的代码的情况下......
  • 当 python 窗口的一部分不在屏幕上时,如何让它自己被记录?
    在Windows10中,大多数应用程序窗口都可以使用OBS等程序进行记录。当窗口被拖动以致其部分内容在显示屏上不可见时,通常OBS仍会接收窗口的内容,即使它在屏幕上不可见。但是,在编写python应用程序时,这似乎不以相同的方式工作。我尝试了几种不同的类似GUI的模块......
  • 使用 aws cdk 设置用户池客户端属性以具有读/写访问权限 - Python
    我试图根据属性给予一些自定义属性特定的读/写访问权限。我收到此错误。资源处理程序返回消息:“无效写入创建客户端时指定的属性(服务:CognitoIdentityProvider,状态代码:400,请求ID:<request_id>)”(RequestToken:<request_token>,HandlerErrorCode:InvalidRequest)任何人都可以为......
  • 试图找出此页面的逻辑:存储了大约 ++ 100 个结果 - 并使用 Python 和 BS4 进行了解析
    试图找出此页面背后的逻辑:我们已将一些结果存储在以下数据库中:https://www.raiffeisen.ch/rch/de/ueber-uns/raiffeisen-gruppe/Organization/raiffeisenbanken/deutsche-schweiz.html#accordionitem_18104049731620873397从a到z大约:120个结果或更多:......
  • 如何在 Numpy Python 中将 4 维数组的下三角形复制到上三角形?
    目标是将下三角形复制到上三角形。根据OP中提出的建议,起草了以下代码。importnumpyasnplw_up_pair=np.tril_indices(4,-1)arr=np.zeros((4,4,1,1))arr[1,:1,:,0]=1arr[2,:2,0,0]=2arr[3,:3,0,0]=3arr=arr+arr.T-np.diag(np.diag(arr))但是,它......
  • 如何在 Python 中对多行使用单个 INSERT INTO 语句?
    我目前正在开发一个DiscordPython机器人,我在其中循环遍历ForumTags列表,并为每个对象生成INSERTINTOSQL语句以将数据插入MySQL数据库。但是,我想要通过将所有这些单独的INSERTINTO语句组合到单个查询中来优化我的代码,如下所示:INSERTINTO......
  • 双 for 循环的 Pythonic 方式
    我有以下代码:importnumpyasnpepsilon=np.array([[0.,0.00172667,0.00071437,0.00091779,0.00154501],[0.00128983,0.,0.00028139,0.00215905,0.00094862],[0.00035811,0.00018714,0.,0.00029365,0.00036993......
  • 无法使用 boto3 将图像上传到 S3
    我正在使用fastapi将图像上传到我的s3存储桶。首先,我尝试使用预先签名的url方法从邮递员上传图像,它工作正常。但是当我尝试使用upload_fileobj直接从服务器上传图像(大小〜7kb)时,它花费了大量时间并出现连接超时错误。花了这么多时间后,我不明白为什么请帮助我。我的代......
  • 在 matplotlib 中绘制一个字符串函数 // 将 str 解释为 python 代码?
    我正在创建一个RPN计算器,尝试绘制用户给出的函数。例如,如果用户输入"xsin3*plot"我希望它绘制sin(x)*3其代码如下。注意:问题在ifprompt=="plot"userInputX=""#userInputXisalwaysreplacedbefore......