如何判断我的机器是否为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(),那会起作用吗?

+0

为什么不检查亚马逊池中的IP? – taro

+0

不起作用。我们不控制我们的本地网络,并且我们很少在我们本地盒子的亚马逊IP空间内。好主意,但。 –

只要把它放在你的hosts文件中,你就不用担心DNS。

但是真的,使用ENV var不会更有意义吗?