【问题标题】:Adding an environment variable to an ec2 instance with boto使用 boto 向 ec2 实例添加环境变量
【发布时间】:2015-01-08 09:36:05
【问题描述】:

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

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

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

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

不寻找讲义,但任何指向有关此文档的链接将不胜感激。我目前正在使用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?

【问题讨论】:

    标签: python amazon-web-services amazon-ec2 environment-variables boto


    【解决方案1】:

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

    用户数据

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

    http://169.254.169.254/latest/user-data/
    

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

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

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

    标签

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

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

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

    其他选项

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

    【讨论】:

    • 非常感谢约翰!我不知道用户数据选项,但这似乎是这里最好的方法。会有一些黑客攻击,但我认为那里有足够的东西供我使用。非常感谢!
    • 与 user_data 脚本中的环境变量设置有关,这种方法总是有效吗?当我使用它来设置 PYTHONPATH 变量时,如本期stackoverflow.com/questions/62845062/… 中所述,python 特定情况仍然失败。我邀请您看一看,因为我仍在努力追查该问题的根源。
    • @seeiespi 请创建一个新问题,而不是通过对旧问题的评论来提问。
    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多