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.
Puede usar una combinación de la herramienta de metadatos AWS (para recuperar su ID de instancia) y la nueva Tag API para recuperar las etiquetas para la instancia actual.
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
.