121 votes

Interroger les balises EC2 depuis l'instance

Amazon a récemment ajouté la fonctionnalité merveilleuse consistant à marquer les instances EC2 avec des paires clé-valeur pour faciliter la gestion d'un grand nombre de machines virtuelles.

Existe-t-il un moyen d'interroger ces balises de la même manière que certaines des autres données définies par l'utilisateur? Par exemple:

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

Existe-t-il un moyen similaire d'interroger les tags?

80voto

itaifrenkel Points 454

Le script bash suivant renvoie le nom de votre instance actuelle ec2 (la valeur de la balise "Name"). Modifiez TAG_NAME en fonction de votre cas particulier.

 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`"
 

Pour installer le aws cli

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

Si vous utilisez IAM au lieu d'informations d'identification explicites, utilisez les autorisations IAM suivantes:

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

46voto

overthink Points 9471

Une fois que vous avez ec2-metadata et ec2-describe-tags installé (comme mentionné dans la réponse de Ranieri ci-dessus ), voici un exemple de commande shell pour obtenir le "nom" de l'instance actuelle, en supposant que vous ayez un "Nom = Foo" tag dessus.

Suppose que les variables d'environnement EC2_PRIVATE_KEY et EC2_CERT sont définies.

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

Cela renvoie Foo .

34voto

drxzcl Points 2156

Vous pouvez utiliser une combinaison de l' outil de métadonnées AWS (pour extraire votre ID d'instance) et de la nouvelle API de balise pour extraire les balises de l'instance actuelle.

19voto

Andrea Points 1328

Vous pouvez ajouter ce script à votre cloud-init données de l'utilisateur à télécharger EC2 balises dans un fichier 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

Vous avez besoin d'AWS outils CLI installé sur votre système: vous pouvez les installer avec un packages section dans un nuage fichier de config avant que le script, utilisez un AMI, qui comprend déjà, ou ajouter un apt ou yum commande au début du script.

Pour accéder EC2 tags vous besoin d'une politique de ce genre dans votre exemple du rôle IAM:

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

L'instance EC2 balises sera disponible en /etc/ec2-tags dans ce format:

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

Vous pouvez inclure le fichier dans un script shell en utilisant . /etc/ec2-tags, par exemple:

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

Les balises sont téléchargés lors de l'initialisation instance, de sorte qu'ils ne reflète pas les modifications ultérieures.


Le script et IAM politique sont basés sur itaifrenkel de réponse.

3voto

Ben Waine Points 669

À l'aide de l'AWS données de l'utilisateur " et "méta-données" Api, il est possible d'écrire un script qui enveloppe de marionnette pour démarrer une marionnette exécuter avec un cert nom.

Premier démarrage d'une instance aws personnalisée avec des données de l'utilisateur: rôle: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 

Cela demande de la marionnette, un certname comme " serveur web.i-hfg453.aws vous pouvez ensuite créer un nœud manifeste appelé "serveur" et marionnettes floue nœud correspondant' signifie qu'il est utilisé à la disposition de tous les serveurs web.

Cet exemple suppose que vous construisez sur une image de base avec de marionnettes installé etc.

Avantages:

1) Vous n'avez pas à passer autour de vos informations d'identification

2) Vous pouvez être aussi granulaire que vous le souhaitez avec le rôle de configs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X