我需要一个 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()
,那会起作用吗?