Amazon agregó recientemente la maravillosa característica de etiquetar instancias EC2 con pares clave-valor para facilitar un poco la administración de un gran número de VM.
¿Hay alguna forma de consultar estas etiquetas de la misma manera que algunos de los otros datos establecidos por el usuario? Por ejemplo:
$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d
¿Existe alguna forma similar de consultar las etiquetas?
amazon-web-services
amazon-ec2
Josh Lindsey
fuente
fuente
ec2metadata --instance-id
--out = json | jq '.Tags [] | select (.Key == "role") | .Value 'ec2metadata
herramienta está obsoleta. Ahora consulta la URL 'mágica' en 169.254.169.254/latest/meta-data ; presione con cURL y le brinda puntos finales mágicos que puede usar para obtener varios bits de datos. En este caso,curl http://169.254.169.254/latest/meta-data/instance-id
obtenga su ID de instanciaEl siguiente script bash devuelve el nombre de su instancia ec2 actual (el valor de la etiqueta "Nombre"). Modifique TAG_NAME a su caso específico.
Para instalar aws cli
En caso de que use IAM en lugar de credenciales explícitas, use estos permisos de IAM:
fuente
aws ec2 describe-tags
. Necesitaba agregar este IAM a las políticas en línea de mi función de IAM. ¡Gracias!| cut -f5
con--query="Tags[0].Value"
.Una vez que tenga
ec2-metadata
yec2-describe-tags
ha instalado (como se menciona en la respuesta de Ranieri anterior ), esto es un ejemplo del comando shell para obtener el "nombre" de la instancia actual, suponiendo que tiene una etiqueta "Name = Foo" en él.Supone que las variables de entorno EC2_PRIVATE_KEY y EC2_CERT están configuradas.
Esto vuelve
Foo
.fuente
ec2-describe-tags
predeterminado esus-east-2
. Pasa la--region
bandera para usar una región diferente.Puede agregar esta secuencia de comandos a sus datos de usuario de inicio en la nube para descargar etiquetas EC2 en un archivo local:
Necesita las herramientas de la AWS CLI instaladas en su sistema: puede instalarlas con una
packages
sección en un archivo de configuración de la nube antes del script, usar una AMI que ya las incluya o agregar un comandoapt
oyum
al principio del script.Para acceder a las etiquetas EC2, necesita una política como esta en el rol de IAM de su instancia:
Las etiquetas EC2 de la instancia estarán disponibles
/etc/ec2-tags
en este formato:Puede incluir el archivo tal cual en un script de shell usando
. /etc/ec2-tags
, por ejemplo:Las etiquetas se descargan durante la inicialización de la instancia, por lo que no reflejarán los cambios posteriores.
El script y la política de IAM se basan en la respuesta de itaifrenkel.
fuente
aws:autoscaling:groupName
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/EC2_TAG_\1="\2"/' |sed -r 's/aws:autoscaling:/aws_autoscaling_/' > /etc/ec2-tags
Si no se encuentra en la zona de disponibilidad predeterminada, los resultados de pensar demasiado volverán vacíos.
Si desea agregar un filtro para obtener una etiqueta específica (elasticbeanstalk: environment-name en mi caso), puede hacerlo.
Y para obtener solo el valor de la etiqueta en la que filtré, canalizamos para cortar y obtenemos el quinto campo.
fuente
elasticbeanstalk:environment-name
conName
Para Python:
fuente
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
Alternativamente, puede usar la
describe-instances
llamada cli en lugar dedescribe-tags
:Este ejemplo muestra cómo obtener el valor de la etiqueta 'my-tag-name' para la instancia:
Cambie la región para adaptarse a sus circunstancias locales. Esto puede ser útil cuando su instancia tiene el privilegio describe-instance pero no describe-tags en la política de perfil de instancia
fuente
Con las API de 'datos de usuario' y 'metadatos' de AWS, es posible escribir un script que envuelva a puppet para iniciar una ejecución de puppet con un nombre de certificado personalizado.
Primero inicie una instancia de aws con datos de usuario personalizados: 'rol: servidor web'
Esto llama a puppet con un nombre de certificado como 'webserver.i-hfg453.aws', luego puede crear un manifiesto de nodo llamado 'webserver' y puppets 'fuzzy node matching' significará que se usa para aprovisionar todos los servidores web.
Este ejemplo asume que se basa en una imagen base con la marioneta instalada, etc.
Beneficios:
1) No tiene que pasar sus credenciales
2) Puede ser tan granular como desee con las configuraciones de roles.
fuente
He reunido lo siguiente que, con suerte, es más simple y más limpio que algunas de las respuestas existentes y usa solo la AWS CLI y no herramientas adicionales.
Este ejemplo de código muestra cómo obtener el valor de la etiqueta 'myTag' para la instancia EC2 actual:
Usando etiquetas de descripción :
O, alternativamente, usando describe-instances :
fuente
Una variación de algunas de las respuestas anteriores, pero así es como obtuve el valor de una etiqueta específica del script de datos de usuario en una instancia
fuente
Instale AWS CLI:
Obtén las etiquetas de la instancia actual:
Salidas:
Use un poco de perl para extraer las etiquetas:
Devoluciones:
fuente
ec2metadata
no está en aws-cli, pero se puede reemplazar porcurl --silent http://169.254.169.254/latest/meta-data/instance-id
. Además,jq
puede analizar el json más fácilmente, o un formato de salida diferente es aún más fácil.sudo apt-get -y install python
yexport AWS_DEFAULT_REGION=us-west-1
instance-id: i-07f59f3564618f148
Descargue y ejecute un ejecutable independiente para hacer eso.
A veces, no se puede instalar awscli que depende de Python. Docker también podría estar fuera de escena.
Aquí está mi implementación en golang: https://github.com/hmalphettes/go-ec2-describe-tags
fuente
Jq + ec2metadata lo hace un poco más agradable. Estoy usando cf y tengo acceso a la región. De lo contrario, puedes agarrarlo en bash.
fuente
Para aquellos lo suficientemente locos como para usar Fish Shell en EC2, aquí hay un fragmento útil para su /home/ec2-user/.config/fish/config.fish. El comando hostdata ahora enumerará todas sus etiquetas, así como la IP pública y el nombre de host.
fuente