Me gustaría ejecutar algunos scripts en hosts que son instancias de EC2, pero no sé cómo asegurarme de que el host sea realmente una instancia de EC2.
He hecho algunas pruebas, pero esto no es suficiente:
- Pruebe que el binario ec2_userdata esté disponible (pero esto no siempre será cierto)
- Pruebe la disponibilidad de " http://169.254.169.254/latest/meta-data " (pero ¿será esto siempre cierto? ¿Y qué es esta "IP mágica"?)
amazon-ec2
Kelindil
fuente
fuente
Respuestas:
Bueno, en realidad, hay una forma muy simple de detectar si el host es una instancia EC2: verifique la búsqueda inversa de su IP pública. Los reveses de EC2 son bastante difíciles de perder.
Además, si no lo modificó, el nombre de host debe ser el inverso, lo que facilitará aún más su detección.
También puede usar la "IP mágica" de la que habló, ya que de hecho es la forma estándar de obtener etiquetas de instancia EC2, sin embargo, si no está en una red EC2, tendrá que esperar un tiempo de espera, que generalmente no es deseable...
Si estos métodos no son suficientes, solo haga un whois de su IP y verifique si está dentro y un bloqueo de IP de Amazon EC2.
EDITAR: puede usar este pequeño bit de shell:
Pero cuidado, [[es un bashismo. También puede usar Python o Perl uniline, YMMV.
fuente
hostname -d
vuelveeu-west-1.compute.internal
Se cambió la respuesta de Hannes para evitar mensajes de error e incluir ejemplos de uso en el script:
Esto no funciona en instancias de Windows. La ventaja sobre el rizo es que es casi instantánea tanto en EC2 como no EC2.
fuente
ec2
un falso positivo. Es poco probable (una probabilidad de 1 en 256) y solo si está utilizando un hipervisor que llena ese archivo. Es por eso que la documentación vinculada anteriormente dice " probablemente estés viendo una instancia de EC2".Primero, sentí la necesidad de publicar una nueva respuesta debido a los siguientes problemas sutiles con las respuestas existentes, y después de recibir una pregunta sobre mi comentario sobre la respuesta de @ qwertzguy . Aquí están los problemas con las respuestas actuales:
hostname -d
, que se utiliza para DNS interno, no nada con "amazonaws.com").instance-data.ec2.internal
búsqueda de DNS puede no funcionar. En una instancia de Ubuntu EC2 VPC que acabo de probar, veo: ¡$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
lo que causaría que el código que se basa en este método concluya falsamente que no está en EC2!dmidecode
de @tamale puede funcionar, pero depende de usted a.) Tenerdmidecode
disponible en su instancia, y b.) Tenersudo
capacidad de root o sin contraseña desde su código.bios_version
de1.0
. Este archivo no está documentado en absoluto en el documento de Amazon , por lo que realmente no confiaría en él.whois
en el resultado es problemática en varios niveles. Tenga en cuenta que la URL sugerida en esa respuesta es una página 404 en este momento. Incluso si lo hizo encontrar un servicio de tercera partes que se hizo el trabajo, sería comparativamente muy lenta (en comparación con la comprobación de un archivo de forma local) y posiblemente tenga problemas que limitan la velocidad o problemas de red, o, posiblemente, la instancia EC2 no tiene ni siquiera acceso a la red externa.-m
o--max-time
rizo para evitar que se cuelgue durante mucho tiempo, especialmente en una instancia que no sea EC2, donde esta dirección puede llevar a ninguna parte y colgarse (como en la respuesta de @ algal ).Además, no veo que nadie haya mencionado el respaldo documentado de Amazon para verificar el (posible) archivo
/sys/devices/virtual/dmi/id/product_uuid
.¿Quién sabía que determinar si estás ejecutando EC2 podría ser tan complicado? Bien, ahora que tenemos (la mayoría) de los problemas con los enfoques enumerados, aquí hay un fragmento de bash sugerido para verificar si está ejecutando en EC2. Creo que esto debería funcionar en general en casi cualquier instancia de Linux, las instancias de Windows son un ejercicio para el lector.
Obviamente, podría expandir esto con más controles de respaldo e incluir paranoia sobre el manejo, por ejemplo, de un falso positivo que
/sys/hypervisor/uuid
ocurra para comenzar con "ec2" por casualidad, etc. Pero esta es una solución suficientemente buena para fines ilustrativos y probablemente para casi todos los casos de uso no patológicos.[†] Recibí esta explicación del soporte de AWS sobre el cambio para las instancias de c5 / m5:
fuente
elif
dice el comentario sobre ese bloque, y es por eso que laelif
prueba utiliza el-r
operador de prueba, que verifica si el archivo existe y si tiene permisos de lectura para el archivo.Busque los metadatos por el nombre de dominio interno EC2 en lugar de IP, lo que devolverá una falla rápida de DNS si no está en EC2, y evita conflictos de IP o problemas de enrutamiento:
En algunas distribuciones, sistemas muy básicos, o muy temprano en las etapas Installion rizo no está disponible. Usando wget en su lugar:
fuente
-bash: !": event not found
. Use comillas simples para esosecho
s en su lugar.Si el objetivo es saber si se trata de una instancia EC2 O de otro tipo de instancia en la nube, como google,
dmidecode
funciona muy bien y no se requiere una red. Me gusta esto frente a algunos de los otros enfoques porque la ruta de URL de metadatos es diferente para EC2 y GCE.fuente
1.0
, sin mencionarloamazon
.Es probable que cambien los nombres de host, ejecute un whois contra su IP pública:
o pulse la url de metadatos de AWS
fuente
Esto también funciona bien para hosts Linux en ec2 y no requiere la red ni los tiempos de espera relacionados:
grep -q amazon /sys/devices/virtual/dmi/id/bios_version
Esto funciona, porque Amazon define esta entrada así:
$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon
fuente
1.0
. No hay mención deamazon
.pero no sé cuán portátil es esto en todas las distribuciones.
fuente
Respuesta rápida:
Había estado usando una de las respuestas publicadas aquí durante más de un año, pero no funciona en los nuevos tipos de instancia 'c5' (ahora estoy trabajando para actualizar desde 'c4').
Me gusta esta solución porque parece que es menos probable que se rompa en el futuro.
En los tipos de instancia más antiguos y los más nuevos, este archivo está presente y comienza con 'EC2'. Verifiqué Ubuntu que se ejecuta en VirtualBox (que también necesito admitir) y contiene la cadena 'VirtualBox'.
Como señaló un póster anterior (pero fue fácil pasarlo por alto), hay documentación de Amazon sobre formas de hacer esto, que incluye mi respuesta.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
fuente
Quizás puedas usar "facter":
"Facter es una biblioteca multiplataforma para recuperar datos simples del sistema operativo, como el sistema operativo, la distribución de Linux o la dirección MAC".
http://www.puppetlabs.com/puppet/related-projects/facter/
Por ejemplo, si echamos un vistazo al hecho ec2 (facter-1.6.12 / lib / facter / ec2.rb):
fuente
Si tiene instalado curl, este comando devolverá 0 si está ejecutando dentro de EC2 y no cero si no:
Intenta extraer los metadatos EC2 que declaran la ID AMI. Si esto no tiene éxito después de 3 segundos, se supone que no se está ejecutando en EC2.
fuente
Un poco tarde para esta fiesta, sin embargo, me encontré con esta publicación y luego encontré esta documentación de AWS:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
Esto, por supuesto, requiere la sobrecarga de la red, aunque puede configurar el tiempo de espera de curvatura de la siguiente manera:
Eso establece el tiempo de espera en 5s.
fuente