【问题标题】:How to use boto3 inside an EC2 instance如何在 EC2 实例中使用 boto3
【发布时间】:2020-09-30 08:35:55
【问题描述】:

我有一个 python 应用程序在 ECS 管理的 EC2 实例上的 Docker 容器中运行(嗯,这就是我想要的......)。但是,要将 SSM 之类的服务与 boto3 一起使用,我需要知道实例正在运行的区域。我不需要任何凭据,因为我为授予服务访问权限的实例使用角色,因此默认 Session 即可。

我知道可以使用curl 获取区域以获取动态元数据,但是有没有更优雅的方法来在 EC2 实例中使用区域名称(凭据)实例化客户端?

我跑过boto3documentation发现

请注意,如果您已启动配置了 IAM 角色的 EC2 实例,则无需在 boto3 中设置显式配置即可使用这些凭证。如果 Boto3 在上面列出的任何其他位置都找不到凭证,它将自动使用 IAM 角色凭证。

那么为什么我需要传递SSM 客户端的区域名称?有解决办法吗?

【问题讨论】:

  • AWS 中的区域供服务客户端调用。

标签: python amazon-web-services amazon-ec2 boto3 ssm


【解决方案1】:

Region 是一个必需参数,让 SSM 客户端知道它应该与哪个区域进行交互。即使您在 AWS 云中,它也不会尝试假设。

如果您希望它在您的容器中假设,最简单的实现方式是使用 AWS environment variables

在您的container definition 指定环境属性中指定一个名为 AWS_DEFAULT_REGION 的变量和您当前区域的值。

通过这样做,您不必在容器内的 SDK 中指定区域。

This example 使用环境属性获取更多信息。

【讨论】:

  • 谢谢,我知道,但是在 Java SDK 中,区域是从元数据中获取的,为什么不使用 boto3 github.com/boto/boto3/issues/375
  • 我猜你能做的,就是你所做的(添加问题到 github)。这将是因为不同的 SDK 是由不同的开发人员编写的,所以功能会很不同。
【解决方案2】:

以下是使用实例配置文件凭据从 Parameter Store 检索参数的方法:

#!/usr/bin/env python3

from ec2_metadata import ec2_metadata
import boto3

session = boto3.Session(region_name=ec2_metadata.region)
ssm = session.client('ssm')
parameter = ssm.get_parameter(Name='/path/to/a/parameter', WithDecryption=True)
print(parameter['Parameter']['Value'])

client 部分替换为您选择的服务,您应该已经设置好了。

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 2019-02-25
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2019-10-19
    • 2018-07-19
    相关资源
    最近更新 更多