virginia una tipos tipo que instancias instancia ec2 east aws amazon-web-services amazon-ec2

amazon web services - una - Consultar etiquetas EC2 desde dentro de la instancia



tipos de instancia en aws (9)

Recientemente, Amazon agregó 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 máquinas virtuales.

¿Hay alguna manera de consultar estas etiquetas de la misma manera que algunos de los otros datos configurados por el usuario? Por ejemplo:

$ wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone us-east-1d

¿Hay alguna manera similar de consultar las etiquetas?


Al utilizar las API de datos de usuario y metadatos de AWS, es posible escribir un script que envuelva al títere para iniciar una ejecución de títeres con un nombre de certificado personalizado.

Primero, inicie una instancia de aws con datos de usuario personalizados: ''role: webserver''

#!/bin/bash # Find the name from the user data passed in on instance creation USER=$(curl -s "http://169.254.169.254/latest/user-data") IFS='':'' read -ra UDATA <<< "$USER" # Find the instance ID from the meta data api ID=$(curl -s "http://169.254.169.254/latest/meta-data/instance-id") CERTNAME=${UDATA[1]}.$ID.aws echo "Running Puppet for certname: " $CERTNAME puppet agent -t --certname=$CERTNAME

Esto llama títere con un certname como ''webserver.i-hfg453.aws'', luego puede crear un manifiesto de nodo llamado ''servidor web'' y la combinación de ''nodos difusos'' de títeres significa que se utilizará para aprovisionar todos los servidores web.

Este ejemplo supone que construyes una imagen base con marionetas instaladas, etc.

Beneficios:

1) No tienes que pasar tus credenciales

2) Puede ser tan detallado como desee con las configuraciones de roles.


Descargue y ejecute un ejecutable independiente para hacer eso.

A veces no se puede instalar awscli que dependa de python. Docker podría estar fuera de la imagen también.

Aquí está mi implementación en golang: https://github.com/hmalphettes/go-ec2-describe-tags


El siguiente script bash devuelve el nombre de su instancia actual de ec2 (el valor de la etiqueta "Nombre"). Modifica TAG_NAME en tu caso específico.

TAG_NAME="Name" INSTANCE_ID="`wget -qO- http://instance-data/latest/meta-data/instance-id`" REGION="`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed -e ''s:/([0-9][0-9]*/)[a-z]*/$://1:''`" TAG_VALUE="`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values=$TAG_NAME" --region $REGION --output=text | cut -f5`"

Para instalar el aws cli

sudo apt-get install python-pip -y sudo pip install awscli

En caso de que use IAM en lugar de credenciales explícitas, use estos permisos de IAM:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeTags"], "Resource": ["*"] } ] }


Instalar AWS CLI:

curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" sudo apt-get install unzip unzip awscli-bundle.zip sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

Obtenga las etiquetas para la instancia actual:

aws ec2 describe-tags --filters "Name=resource-id,Values=`ec2metadata --instance-id`"

Productos:

{ "Tags": [ { "ResourceType": "instance", "ResourceId": "i-6a7e559d", "Value": "Webserver", "Key": "Name" } ] }

Use un poco de perl para extraer las etiquetas:

aws ec2 describe-tags --filters / "Name=resource-id,Values=`ec2metadata --instance-id`" | / perl -ne ''print "$1/n" if //"Value/": /"(.*?)/"/''

Devoluciones:

Webserver


Para Python:

from boto import utils, ec2 from os import environ # import keys from os.env or use default (not secure) aws_access_key_id = environ.get(''AWS_ACCESS_KEY_ID'', failobj=''XXXXXXXXXXX'') aws_secret_access_key = environ.get(''AWS_SECRET_ACCESS_KEY'', failobj=''XXXXXXXXXXXXXXXXXXXXX'') #load metadata , if = {} we are on localhost # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1) region = instance_metadata[''placement''][''availability-zone''][:-1] instance_id = instance_metadata[''instance-id''] conn = ec2.connect_to_region(region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key) # get tag status for our instance_id using filters # http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeTags.html tags = conn.get_all_tags(filters={''resource-id'': instance_id, ''key'': ''status''}) if tags: instance_status = tags[0].value else: instance_status = None logging.error(''no status tag for ''+region+'' ''+instance_id)


Puede agregar esta secuencia de comandos a sus datos de usuario de cloud-init para descargar etiquetas EC2 a un archivo local:

#!/bin/sh INSTANCE_ID=`wget -qO- http://instance-data/latest/meta-data/instance-id` REGION=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed ''s/.$//''` aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r ''s/TAGS/t(.*)/t.*/t.*/t(.*)//1="/2"/'' > /etc/ec2-tags

Necesita las herramientas de CLI de AWS instaladas en su sistema: puede instalarlas con una sección de packages en un archivo de configuración de nube antes del script, usar un AMI que ya las incluya, o agregar un comando apt o yum al comienzo del guión.

Para acceder a las etiquetas EC2 necesita una política como esta en el rol IAM de su instancia:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1409309287000", "Effect": "Allow", "Action": [ "ec2:DescribeTags" ], "Resource": [ "*" ] } ] }

Las etiquetas EC2 de la instancia estarán disponibles en /etc/ec2-tags en este formato:

FOO="Bar" Name="EC2 tags with cloud-init"

Puede incluir el archivo tal como está en un script de shell usando . /etc/ec2-tags . /etc/ec2-tags , por ejemplo:

#!/bin/sh . /etc/ec2-tags echo $Name

Las etiquetas se descargan durante la inicialización de la instancia, por lo que no reflejarán los cambios posteriores.

El guión y la política de IAM se basan en la respuesta de itaifrenkel.



Si no se encuentra en la zona de disponibilidad predeterminada, los resultados de overthink volverán vacíos.

ec2-describe-tags / --region / $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") / --filter / resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id)

Si desea agregar un filtro para obtener una etiqueta específica (elasticbeanstalk: environment-name en mi caso), puede hacerlo.

ec2-describe-tags / --region / $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") / --filter / resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) / --filter / key=elasticbeanstalk:environment-name | cut -f5

Y para obtener solo el valor de la etiqueta que filtré, canalizamos para cortar y obtener el quinto campo.

ec2-describe-tags / --region / $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") / --filter / resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) / --filter / key=elasticbeanstalk:environment-name | cut -f5


Una vez que haya ec2-metadata y ec2-describe-tags (como se menciona en la respuesta anterior de Ranieri ), aquí hay un ejemplo de comando de shell para obtener el "nombre" de la instancia actual, suponiendo que tiene una etiqueta "Name = Foo" en eso.

Asume que las variables de entorno EC2_PRIVATE_KEY y EC2_CERT están establecidas.

ec2-describe-tags / --filter "resource-type=instance" / --filter "resource-id=$(ec2-metadata -i | cut -d '' '' -f2)" / --filter "key=Name" | cut -f5

Esto devuelve Foo .