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:
- La respuesta aceptada de @MatthieuCerda definitivamente no funciona correctamente, al menos no en cualquier instancia de VPC he comprobado en contra. (En mis casos, obtengo un nombre de VPC para
hostname -d
, que se utiliza para DNS interno, no nada con "amazonaws.com").
- La respuesta más votada de @qwertzguy no funciona en las nuevas instancias m5 o c5 , que no tienen este archivo. Amazon no documenta este cambio de comportamiento AFAIK, aunque la página del documento sobre este tema dice "... Si / sys / hypervisor / uuid existe ...". Le pregunté al soporte de AWS si este cambio fue intencional, ver más abajo †.
- La respuesta de @Jer no necesariamente funciona en todas partes porque la
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!
- La respuesta para usar
dmidecode
de @tamale puede funcionar, pero depende de usted a.) Tener dmidecode
disponible en su instancia, y b.) Tener sudo
capacidad de root o sin contraseña desde su código.
- ¡La respuesta a check / sys / devices / virtual / dmi / id / bios_version de @spkane es peligrosamente engañosa! Verifiqué una instancia de Ubuntu 14.04 m5 y obtuve una
bios_version
de 1.0
. Este archivo no está documentado en absoluto en el documento de Amazon , por lo que realmente no confiaría en él.
- La primera parte de la respuesta de @ Chris-Montanaro para verificar una URL de terceros no confiable y usarla
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.
- La segunda sugerencia en la respuesta de @ Chris-Montanaro para verificar http://169.254.169.254/ es un poco mejor, pero otro comentarista señala que otros proveedores de la nube hacen que esta URL de metadatos de instancia esté disponible, por lo que debe tener cuidado para evitar falsas Positivos Además, seguirá siendo mucho más lento que un archivo local, he visto que esta comprobación es especialmente lenta (varios segundos para volver) en instancias con mucha carga. Además, debe recordar pasar un argumento
-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.
#!/bin/bash
# This first, simple check will work for many older instance types.
if [ -f /sys/hypervisor/uuid ]; then
# File should be readable by non-root users.
if [ `head -c 3 /sys/hypervisor/uuid` == "ec2" ]; then
echo yes
else
echo no
fi
# This check will work on newer m5/c5 instances, but only if you have root!
elif [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
# If the file exists AND is readable by us, we can rely on it.
if [ `head -c 3 /sys/devices/virtual/dmi/id/product_uuid` == "EC2" ]; then
echo yes
else
echo no
fi
else
# Fallback check of http://169.254.169.254/. If we wanted to be REALLY
# authoritative, we could follow Amazon's suggestions for cryptographically
# verifying their signature, see here:
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
# but this is almost certainly overkill for this purpose (and the above
# checks of "EC2" prefixes have a higher false positive potential, anyway).
if $(curl -s -m 5 http://169.254.169.254/latest/dynamic/instance-identity/document | grep -q availabilityZone) ; then
echo yes
else
echo no
fi
fi
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:
Las instancias C5 y M5 usan una nueva pila de hipervisor y los controladores de kernel asociados no crean archivos en sysfs (que está montado en / sys) como lo hacen los controladores Xen utilizados por los otros tipos de instancias anteriores . La mejor manera de detectar si el sistema operativo se ejecuta en una instancia EC2 es tener en cuenta las diferentes posibilidades enumeradas en la documentación que ha vinculado .