J'aimerais exécuter des scripts sur des hôtes qui sont des instances EC2, mais je ne sais pas comment m'assurer que l'hôte est vraiment une instance EC2.
J'ai fait des tests, mais cela ne suffit pas:
- Testez que b2 ec2_userdata est disponible (mais ce ne sera pas toujours vrai)
- Disponibilité de test de " http://169.254.169.254/latest/meta-data " (mais cela sera-t-il toujours vrai? Et quelle est cette "adresse magique"?)
amazon-ec2
Kelindil
la source
la source
Réponses:
En fait, il existe un moyen très simple de détecter si l'hôte est une instance EC2: vérifiez la recherche inversée de votre adresse IP publique. Les revers de l'EC2 sont assez difficiles à manquer.
De plus, si vous ne le modifiez pas, le nom d’hôte doit être votre inverse, ce qui le rend plus facile à repérer.
Vous pouvez également utiliser "l'adresse IP magique" dont vous avez parlé, car il s'agit en effet du moyen standard d'obtenir les balises d'instance EC2. Toutefois, si vous ne travaillez pas sur un réseau EC2, vous devrez attendre un délai d'expiration, ce qui n'est généralement pas le cas. souhaitable...
Si ces méthodes ne suffisent pas, il suffit de faire un whois de votre adresse IP et de vérifier si vous vous trouvez dans le bloc IP Amazon EC2.
EDIT: Vous pouvez utiliser ce petit bit shell:
Attention cependant, [[est un bashisme. Vous pouvez également utiliser un Python ou Perl Uniline, YMMV.
la source
hostname -d
retourseu-west-1.compute.internal
Modification de la réponse de Hannes pour éviter les messages d'erreur et inclure un exemple d'utilisation dans le script:
Cela ne fonctionne pas dans les instances Windows. L'avantage par rapport au curl est qu'il est presque instantané sur les EC2 et les non-EC2.
la source
ec2
- un faux positif. Il est peu probable (une chance sur 256) et uniquement si vous utilisez un hyperviseur qui remplit ce fichier. C'est pourquoi la documentation liée ci-dessus indique «vous êtes probablement en train de regarder une instance EC2».Premièrement, j’ai ressenti le besoin de publier une nouvelle réponse en raison des problèmes subtils suivants avec les réponses existantes et après avoir reçu une question à propos de mon commentaire sur la réponse de @ qwertzguy . Voici les problèmes avec les réponses actuelles:
hostname -d
, qui est utilisé pour le DNS interne, mais pas avec "amazonaws.com".)instance-data.ec2.internal
recherche DNS peut ne pas fonctionner. Sur une instance de VPC Ubuntu EC2 que je viens de tester, je vois:$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
ce qui ferait que le code s’appuyant sur cette méthode conclurait à tort qu’il ne s’agissait pas de EC2!dmidecode
partir de @tamale peut fonctionner, mais dépend de vous: a)) avoirdmidecode
à votre disposition sur votre instance, et b.) Avoirsudo
une capacité root ou sans mot de passe à partir de votre code.bios_version
de1.0
. Ce fichier n'est pas du tout documenté dans la documentation d'Amazon , je ne le ferais donc vraiment pas.whois
sur le résultat pose problème à plusieurs niveaux. Notez que l'URL suggérée dans cette réponse est une page 404 en ce moment! Même si vous trouviez un service tiers qui fonctionnait, il serait comparativement très lent (par rapport à la vérification locale d'un fichier) et risquerait peut-être de rencontrer des problèmes de limitation de débit ou de réseau, ou votre instance EC2 n'a peut-être même pas accès réseau extérieur.-m
ou--max-time
argument curl pour éviter la pendaison pendant très longtemps, en particulier sur une instance non-EC2 où cette adresse peut conduire à nulle part et se bloquer (comme dans la réponse de @ algale ).En outre, je ne vois pas que quiconque ait mentionné le recours documenté d'Amazon consistant à rechercher le fichier (possible)
/sys/devices/virtual/dmi/id/product_uuid
.Qui savait que déterminer si vous utilisiez EC2 pouvait être si compliqué?! OK, maintenant que nous avons (la plupart) des problèmes avec les approches énumérées, voici un extrait de code suggéré pour vérifier si vous utilisez bien EC2. Je pense que cela devrait fonctionner généralement sur presque toutes les instances Linux, les instances Windows étant un exercice pour le lecteur.
Évidemment, vous pourriez élargir ceci avec encore plus de vérifications de substitution et inclure la paranoïa au sujet de la gestion, par exemple d'un faux positif
/sys/hypervisor/uuid
pour commencer avec "ec2" par hasard, etc. Mais il s’agit là d’une solution suffisante pour illustrer notre propos et probablement pour presque tous les cas d’utilisation non pathologiques.[†] Vous avez obtenu cette explication du support AWS à propos de la modification des instances c5 / m5:
la source
elif
dit le commentaire au-dessus de ce bloc, et c'est pourquoi leelif
test utilise l'-r
opérateur de test, qui vérifie si le fichier existe et si vous avez les droits de lecture requis.Recherchez les métadonnées par le nom de domaine interne EC2 au lieu de l'adresse IP, ce qui renverra une défaillance DNS rapide si vous n'êtes pas sur EC2 et évite les conflits IP ou les problèmes de routage:
Sur certains systèmes, distros très basiques, ou très tôt à des stades de installion boucle ne sont pas disponibles. Utiliser wget à la place:
la source
-bash: !": event not found
. Utilisez des guillemets simples pour ceux à laecho
place.Si l'objectif est de déterminer s'il s'agit d'une instance EC2 OU d'un autre type d'instance de cloud, telle que Google,
dmidecode
fonctionne très bien et qu'aucun réseau n'est requis. J'aime cela par rapport à d'autres approches car le chemin de l'URL des métadonnées est différent pour EC2 et GCE.la source
1.0
- aucune mention deamazon
.Les noms d'hôte sont susceptibles de changer, lancez un whois contre votre IP publique:
ou cliquez sur l'URL de méta-données AWS
la source
Cela fonctionne également bien pour les hôtes Linux dans ec2 et ne nécessite pas le réseau ni 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
la source
1.0
. Aucune mention deamazon
.mais je ne sais pas à quel point c'est portable dans toutes les distributions.
la source
Réponse rapide:
J'utilisais l'une des réponses publiées ici depuis plus d'un an, mais cela ne fonctionnait pas avec les nouveaux types d'instances «c5» (je travaille actuellement à la mise à niveau à partir de «c4»).
J'aime cette solution car elle semble être la moins susceptible de se briser à l'avenir.
Sur les types d'instance les plus anciens et les plus récents, ce fichier est présent et commence par «EC2». J'ai vérifié Ubuntu sous VirtualBox (que je dois également prendre en charge) et il contient la chaîne 'VirtualBox'.
Comme l'a noté une affiche précédente (mais c'était facile à manquer) - il existe une documentation d'Amazon sur les moyens de le faire - qui inclut ma réponse.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
la source
Peut-être que vous pouvez utiliser "facter":
"Facter est une bibliothèque multi-plateforme permettant de récupérer des informations simples sur le système d’exploitation, telles que le système d’exploitation, la distribution Linux ou l’adresse MAC."
http://www.puppetlabs.com/puppet/related-projects/facter/
Par exemple, si nous examinons le fait ec2 (facter-1.6.12 / lib / facter / ec2.rb):
la source
Si vous avez installé curl, cette commande retournera 0 si vous utilisez EC2 et une valeur différente de zéro si vous n’êtes pas:
Il tente d'extraire les métadonnées EC2 déclarant l'identificateur AMI-ID. Si cela ne réussit pas au bout de 3 secondes, cela suppose qu’il ne fonctionne pas dans EC2.
la source
Un peu tard pour cette soirée, mais je suis tombé sur ce post et puis j'ai trouvé cette documentation AWS:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
Ceci, bien sûr, nécessite la surcharge du réseau bien que vous puissiez définir le délai d’arrêt de la manière suivante:
Cela définit le délai d'attente à 5 secondes.
la source