62 votes

Comment savoir si une machine est une instance EC2

Je voudrais exécuter des scripts sur des hôtes qui sont des instances EC2 mais je ne sais pas comment être sûr que l'hôte est vraiment une instance EC2.

J'ai fait quelques tests, mais ce n'est pas suffisant :

  • Tester que le binaire ec2_userdata est disponible (mais ce ne sera pas toujours vrai)
  • Test de disponibilité de " http://169.254.169.254/latest/meta-data "(mais cela sera-t-il toujours vrai ? et qu'est-ce que ce "IP magique" ?)

5voto

spkane Points 191

Cela fonctionne également bien pour les hôtes Linux dans ec2 et ne nécessite pas le réseau et les délais d'attente associés :

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

Cela fonctionne, car Amazon définit cette entrée comme suit :

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

3voto

Hannes Points 151
test -f /sys/hypervisor/uuid -a `head -c 3 /sys/hypervisor/uuid` == ec2 && echo yes

mais je ne sais pas si cela est portable d'une distribution à l'autre.

3voto

Zach Anthony Points 31

Réponse rapide :

if [[ -f /sys/devices/virtual/dmi/id/product_uuid ]] && \
    grep -q "^EC2" /sys/devices/virtual/dmi/id/product_uuid
then
    echo "IS EC2"
else
    echo "NOT EC2"
fi

J'utilisais l'une des réponses publiées ici depuis plus d'un an, mais elle ne fonctionne pas avec les nouveaux types d'instance "c5" (je travaille actuellement à la mise à niveau de "c4").

J'aime cette solution car elle semble être la moins susceptible de se briser à l'avenir.

Sur les anciens types d'instance, et les plus récents, ce fichier est présent et commence par 'EC2'. J'ai vérifié sur Ubuntu fonctionnant sur VirtualBox (que je dois également prendre en charge) et il contient la chaîne 'VirtualBox'.

Comme l'a fait remarquer un poster précédent (mais il était facile de le manquer) - il existe une documentation Amazon sur les moyens de faire cela - qui inclut ma réponse.

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html

2voto

Rob Marshall Points 161

En fait, il existe un moyen très simple de détecter si l'hôte est une instance EC2 : vérifiez la recherche inverse de votre IP publique. Les inversions EC2 sont assez difficiles à manquer.

De plus, si vous ne l'avez pas modifié, le nom d'hôte devrait être votre inverse, ce qui facilite encore plus le repérage.

Vous pouvez également utiliser l'"IP magique" dont vous avez parlé, car c'est en effet le moyen standard d'obtenir des balises d'instance EC2. Cependant, si vous n'êtes pas sur un réseau EC2, vous devrez attendre un timeout, ce qui n'est généralement pas souhaitable...

Si ces méthodes ne suffisent pas, il suffit de faire un whois de votre IP et de vérifier si vous êtes dans un bloc d'IP Amazon EC2.

EDIT : Vous pouvez utiliser ce petit Shell bit :

#!/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

Attention cependant, [[ est un bashisme. Vous pouvez également utiliser un uniline Python ou Perl, YMMV.

2voto

Bobster Points 80

Vous pouvez peut-être utiliser "facter" :

"Facter est une bibliothèque multiplateforme permettant de récupérer des informations simples sur le système d'exploitation, comme le système d'exploitation, la distribution linux ou l'adresse MAC."

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

Par exemple, si nous regardons le fact 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X