如何知道一台机器是否是EC2实例

我想在EC2实例的主机上运行一些脚本,但是我不知道如何确定主机实际上是一个EC2实例。

我做了一些testing,但这还不够:

  • testing二进制ec2_userdata是否可用(但这并不总是如此)
  • testing“ http://169.254.169.254/latest/meta-data ”的可用性(但是这将永远是真的吗?这个“神奇的IP”是什么?)

实际上,有一个非常简单的方法来检测主机是否是EC2实例:检查您的公有IP的反向查找。 EC2反转是相当难以想象的。

另外,如果你没有修改它,主机名应该是你的反向,使它更容易发现。

你也可以使用你所说的“魔法IP”,因为它确实是获得EC2实例标签的标准方法,但是,如果你不在EC2networking上,你将不得不等待超时,通常不是合意…

如果这些方法还不够,只要做一个你的IP的whois,并检查你是否在亚马逊EC2 IP块。

编辑:你可以使用这个小shell位:

#!/bin/bash LOCAL_HOSTNAME=$(hostname -d) if [[ ${LOCAL_HOSTNAME} =~ .*\.amazonaws\.com ]] then echo "This is an EC2 instance" else echo "This is not an EC2 instance, or a reverse-customized one" fi 

小心,虽然,[是一个bashism。 您也可以使用Python或Perl单线程YMMV。

更改了Hannes的答案以避免错误消息,并在脚本中包含示例用法:

 if [ -f /sys/hypervisor/uuid ] && [ `head -c 3 /sys/hypervisor/uuid` == ec2 ]; then echo yes else echo no fi 

这在Windows实例中不起作用。 优于curl的是它在EC2和非EC2上接近瞬时。

通过EC2内部域名而不是IP查找元数据,如果您不在EC2上,将返回一个快速的DNS故障,并避免IP冲突或路由问题:

 curl -s http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!" 

在一些发行版中,非常基本的系统,或者在安装阶段curl很早就不可用。 改用wget

 wget -q http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!" 

如果目标是要判断它是EC2实例还是其他types的云实例(如google),那么dmidecode工作方式非常好,不需要联网。 我比较喜欢这个方法,因为EC2和GCE的元数据urlpath是不同的。

 # From a google compute VM $ sudo dmidecode -s bios-version Google # From an amazon ec2 VM $ sudo dmidecode -s bios-version 4.2.amazon 

主机名可能会发生变化,对您的公共IP运行whois:

 if [[ ! -z $(whois $(curl -s shtuff.it/myip/short) | grep -i amazon) ]]; then echo "I'm Amazon" else echo "I'm not Amazon" fi 

或者点击AWS元数据url

 if [[ ! -z $(curl -s http://169.254.169.254/1.0/) ]]; then echo "I'm Amazon" else echo "I'm not Amazon" fi 
 test -f /sys/hypervisor/uuid -a `head -c 3 /sys/hypervisor/uuid` == ec2 && echo yes 

但我不知道这是跨越分布的便携式。

这也适用于ec2中的Linux主机,不需要networking和任何相关的超时:

grep -q amazon /sys/devices/virtual/dmi/id/bios_version

这是有效的,因为亚马逊如此定义了这个条目:

$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon

也许你可以使用“facter”:

“Facter是一个跨平台的库,用于检索简单的操作系统事实,如操作系统,Linux发行版或MAC地址。”

http://www.puppetlabs.com/puppet/related-projects/facter/

例如,如果我们看看ec2的事实(facter-1.6.12 / lib / facter / ec2.rb):

 require 'facter/util/ec2' require 'open-uri' def metadata(id = "") open("http://169.254.169.254/2008-02-01/meta-data/#{id||=''}").read. split("\n").each do |o| key = "#{id}#{o.gsub(/\=.*$/, '/')}" if key[-1..-1] != '/' value = open("http://169.254.169.254/2008-02-01/meta-data/#{key}").read. split("\n") symbol = "ec2_#{key.gsub(/\-|\//, '_')}".to_sym Facter.add(symbol) { setcode { value.join(',') } } else metadata(key) end end end def userdata() begin value = open("http://169.254.169.254/2008-02-01/user-data/").read.split Facter.add(:ec2_userdata) { setcode { value } } rescue OpenURI::HTTPError end end if (Facter::Util::EC2.has_euca_mac? || Facter::Util::EC2.has_openstack_mac? || Facter::Util::EC2.has_ec2_arp?) && Facter::Util::EC2.can_connect? metadata userdata else Facter.debug "Not an EC2 host" end 

如果你已经安装了curl,那么如果你在EC2中运行,这个命令将返回0;如果你不在,

 curl --max-time 3 http://169.254.169.254/latest/meta-data/ami-id 2>/dev/null 1>/dev/null` 

它试图拉取声明AMI-ID的EC2元数据。 如果3秒后没有成功,则认为它不在EC2中运行。