如何判断我的机器是否为EC2实例?
问题描述:
我需要一个Ruby功能,可以在100%的时间内告诉我这台机器是否为EC2实例,即使DNS在我们的EC2实例上发生故障时也是如此。如何判断我的机器是否为EC2实例?
,我们使用的功能是:
def is_ec2?
require 'socket'
Socket::gethostbyname('instance-data.ec2.internal.')
true
rescue
false
end
除了当DNS爆发,每一个EC2机认为这不是一个EC2的机器,坏的事情发生了,像生产机器删除其自己的SSL证书,并与当地JIANGSU作者:孙军框的证书替换他们..
在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()
,那会起作用吗?
答
只要把它放在你的hosts文件中,你就不用担心DNS。
但是真的,使用ENV var不会更有意义吗?
为什么不检查亚马逊池中的IP? – taro
不起作用。我们不控制我们的本地网络,并且我们很少在我们本地盒子的亚马逊IP空间内。好主意,但。 –