0

我需要一个 Ruby 函数,它可以 100% 地告诉我这台机器是否是 EC2 实例,即使我们的 EC2 实例上的 DNS 被破坏。

我们使用的功能是:

def is_ec2?
  require 'socket'
  Socket::gethostbyname('instance-data.ec2.internal.')
  true
rescue
  false
end

除了当 DNS 崩溃时,每台 EC2 机器都认为它不是 EC2 机器,并且发生了一些不好的事情,比如生产机器删除了自己的 SSL 证书并用本地开发盒的证书替换它们。

在 Python 中,我们使用:

@memoized
def is_ec2():
    # This is a 99% check to avoid the need to wait for the timeout. 
    # Our VM's have this file.  Our dev VM's don't.  
    if not os.path.isfile('/sys/hypervisor/uuid'):
        return False

    try:
        result = boto.utils.get_instance_metadata()
        if result == {}:
            return False
        return True
    except Exception:
        return False

除了使用wget -q -O - http://169.254.169.254/latest/meta-data而不是boto.utils.get_instance_metadata(),那会起作用吗?

4

1 回答 1

1

只需将它放在您的主机文件中,您就不必担心 DNS。

但实际上,使用 ENV var 不是更有意义吗?

于 2013-08-03T02:07:12.220 回答