检测 Elastic Beanstalk 环境?

Posted

技术标签:

【中文标题】检测 Elastic Beanstalk 环境?【英文标题】:Detecting Elastic Beanstalk Environment? 【发布时间】:2015-09-18 22:48:41 【问题描述】:

我正在尝试通过弹性 beanstalk 环境标记错误消息。有没有办法通过弹性豆茎内的 EC2 实例以编程方式确定我所处的环境?

我在 Rails 上使用 ruby​​,所以 ruby​​ 方式会很好,但我可以从任何语言移植。

【问题讨论】:

【参考方案1】:

我有一个 Rails 项目,这就是我们目前在内部做的事情,以确定我们的 ec2 实例属于哪个环境。

下面的代码进行了不止一项检查,文件检查确保您在 ec2 实例上运行此代码。第二组 url 调用正在获取 ec2 实例 ID 以及正在使用的 aws 区域。最后它使用前两条数据使用 aws-sdk 找到环境名称。这有点难看,但它可以完成工作。

require 'net/http'
require 'aws-sdk'

uuid = File.readlines('/sys/hypervisor/uuid', 'r')
if uuid
    str = uuid.first.slice(0,3)
    if str == 'ec2'
        metadata_endpoint = 'http://169.254.169.254/latest/meta-data/'
        dynamic_endpoint = 'http://169.254.169.254/latest/dynamic/'
        instance_id = Net::HTTP.get( URI.parse( metadata_endpoint + 'instance-id' ) )
        document = Net::HTTP.get( URI.parse( dynamic_endpoint + 'instance-identity/document') )
        parsed_document = JSON.parse(document)
        region = parsed_document['region']
        ec2 = AWS::EC2::Client.new(region: region)
        ec2.describe_instances(instance_ids:[instance_id]).reservation_set[0].instances_set[0].tag_set.each do |tag|
            if tag.key == 'elasticbeanstalk:environment-name'
                @env_name = tag.value
            end
        end
    end
end

【讨论】:

请注意,由于您没有将块传递给File.open,因此文件不会自动关闭。为什么不像 File.readlines('/sys/hypervisor/uuid').first 这样它会自动关闭,否则你需要在某个地方调用 uuid.close 以确保它不会被无限期保留。 感谢您的反馈。我做了改变,它似乎工作得很好。再次感谢。【参考方案2】:

无论您在做什么,都应该关注应用程序环境名称,而不是其周围的elastic beanstalk 环境名称。所以请使用elastic beanstalk environment variables,设置 APP_ENV 之类的东西,然后在您在应用程序中使用的任何语言中以编程方式读取它。

这与面向对象编程的原理类似,您可以将自己的东西封装起来,使其独立于其他代码。 EB 的内部结构可能会随着下一个版本而改变,弹性 beantalk 环境变量将仍然存在...

【讨论】:

不一定,beantalk 允许您定义以下层次结构: application> Environment 1, Environment 2 示例:my_blog > qa-environment-of-my-blog, prod-environment-of-my-blog I认为 OP 想知道实例是在 qa 中运行还是从实例内部运行 在我看来,这就像在高速公路上通过检查引擎上的 VIN 号码来检查您是否驾驶自己的汽车;)

以上是关于检测 Elastic Beanstalk 环境?的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 未能部署新的 docker 映像

如何使用 Terraform 为 Elastic Beanstalk 环境定义条件(每个环境)设置?

下载/检索现有的 Elastic Beanstalk 环境配置

Elastic Beanstalk - 删除环境失败

启动 Elastic Beanstalk 环境时出错

AWS Elastic Beanstalk - 针对不同环境的单独配置