使用 boto 将环境变量添加到 ec2 实例

Adding an environment variable to an ec2 instance with boto

非常简单的问题,但我找不到任何人解决它,也找不到任何人提到这个问题。基本上,当我启动它时,我希望通过将环境变量与盒子相关联来向远程 ec2 盒子添加少量信息。

我看到有人提到了 tags 的概念,但我正在寻找可以从实例中天真地检查和访问的东西,但不清楚是否 tags提供该功能。

理想情况下,在实例实例化后,任何外部方也无法访问添加这些环境变量的接口。

我意识到我可以通过设置一个安全的数据库来达到类似的效果,但是对于仅仅尝试向实例添加几个元数据来说这似乎过于复杂了。

不是在寻找讲义,但如果 link 有任何与此相关的文档,我们将不胜感激。我目前正在使用 boto(下面的代码),所以适合 boto 框架的东西是理想的,但如果我必须下降到亚马逊的 REST api 它不会世界末日。

def create_instances(connection, type, number, **kwargs):
    kwargs.update({
        'min_count': number,
        'max_count': number
    })
    return connection.run_instances(**kwargs).instances  # maybe if kwargs had an environment variable?

有多种方法可以将信息传递到 Amazon EC2 实例,但并非所有方法都一定能满足您的要求,因为它在启动后无法访问。

用户数据

启动 Amazon EC2 实例时,可以指定用户数据。可以通过访问 URL:

从实例中访问用户数据的内容
http://169.254.169.254/latest/user-data/

您在实例上的代码可以查询此 URL(被管理程序拦截,并且只能从实例本身查看)以访问信息。

用户数据的另一个用途是它可以execute as a script。该脚本可以设置您的代码随后可以访问的环境变量。

但是,可以通过 EC2 管理控制台或通过 DescribeInstanceAttribute 调用查看用户数据,因此这可能不符合您的安全要求。

标签

另一种选择是使用标签。这些是与 EC2 实例(或 AWS 中的其他对象)关联的名称-值对。可以通过调用 'DescribeTags' 来检索标签,但 boto 有一些访问它们的快捷方式。

标签是将信息与实例相关联的好方法,标签也可用于识别特定实例(例如按环境、项目、所有者...)。

但是,标签中存储的值可以在 EC2 管理控制台中查看,也可以通过 API 调用查看。

其他选项

  • 数据库中检索值(但是你会遇到如何对数据库进行身份验证的问题)
  • AMI 上存储数据(但这并不便于在每个实例的基础上修改值)
  • 将数据存储在 Amazon S3 中并使用分配给实例的 IAM 角色来提供从 S3 检索数据的凭证
  • 从代码存储库中检索数据(但同样存在安全问题)