我需要一个Ruby函数,它会告诉我这台机器是否是一个EC2实例,100%的时间,即使我们的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()
外,还能运作吗?
答案 0 :(得分:1)
只需将其放入您的主机文件中,您就不必担心DNS。
但实际上,使用ENV var是否更有意义?