Requête EC2 balises de l'intérieur de l'instance
Amazon a récemment ajouté une merveilleuse fonctionnalité de marquage des instances EC2 avec des paires clé-valeur, à la gestion d'un grand nombre de machines virtuelles un peu plus facile.
Est-il un moyen d'interroger ces balises de la même façon que certains de l'autre utilisateur des données de jeu? Par exemple:
$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d
Est-il une manière similaire à la requête des tags?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une combinaison de la AWS métadonnées (pour récupérer votre ID d'instance) et la nouveau Tag de l'API pour récupérer les balises pour l'instance en cours.
ec2metadata --instance-id
--out=json|jq '.Tags[]| select(.Key == "rôle")|.De la valeur"ec2metadata
outil est obsolète. Maintenant vous interroger la "magie" de l'URL 169.254.169.254/latest/méta-données - frapper avec cURL et il vous donne les points de terminaison de la magie que vous pouvez utiliser pour obtenir les différents bits de données. Dans ce cascurl http://169.254.169.254/latest/meta-data/instance-id
obtient votre votre ID d'instanceUne fois que vous avez
ec2-metadata
etec2-describe-tags
installé (comme mentionné dans Ranieri est la réponse ci-dessus), voici un exemple de commande shell pour obtenir le "nom" de l'instance en cours, en supposant que vous avez une "Name=Foo" tag sur elle.Suppose EC2_PRIVATE_KEY et EC2_CERT variables d'environnement sont définies.
Cela renvoie
Foo
.ec2-describe-tags
par défautus-east-2
. Merci de faire passer le--region
drapeau pour utiliser une autre région.aws ec2 describe-tags --region eu-west-1 --filters "Name=resource-type,Values=instance" "Name=resource-id,Values=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id | cut -d ' ' -f2)" "Name=key,Values=Name" --output text | cut -f5
Le script bash suivant retourne le Nom de votre instance ec2 (la valeur de la balise "Name"). Modifier NOM_DU_TAG à votre cas spécifique.
Pour installer le aws cli
Dans le cas où vous utilisez IAM plutôt explicite de ces informations, utilisez ces IAM autorisations:
aws ec2 describe-tags
. J'ai besoin d'ajouter cette IAM à la ligne des politiques de mon rôle IAM. Merci!Vous pouvez ajouter ce script à votre cloud-init données de l'utilisateur à télécharger EC2 balises dans un fichier local:
Vous avez besoin d'AWS outils CLI installé sur votre système: vous pouvez soit installer avec une
packages
section dans un nuage fichier de config avant que le script, utilisez un AMI, qui comprend déjà, ou ajouter unapt
ouyum
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:
De l'instance EC2 balises disponibles dans
/etc/ec2-tags
dans ce format:Vous pouvez inclure le fichier dans un script shell en utilisant
. /etc/ec2-tags
, par exemple: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.
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 vous n'êtes pas en disponibilité par défaut de la zone les résultats de l'overthink serait de retour à vide.
Si vous souhaitez ajouter un filtre pour obtenir une balise spécifique (elasticbeanstalk:environnement-nom dans mon cas), alors vous pouvez le faire.
Et d'obtenir que la valeur de la balise que j'ai filtré sur, nous avons tuyau pour couper et obtenir le cinquième champ.
elasticbeanstalk:environment-name
avecName
Pour Python:
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
Vous pouvez également utiliser la
describe-instances
cli appel plutôt que dedescribe-tags
:Cet exemple montre comment obtenir la valeur de la balise 'mon-tag-name' pour l'exemple:
Changer de région pour répondre à vos circonstances locales. Cela peut être utile lorsque l'instance a pour objet de décrire, d'instances de privilège, mais pas de décrire les balises dans le profil d'instance politique
À 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"
Ce appels de marionnettes avec une 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.
Installer AWS CLI:
Obtenir les balises de l'instance en cours:
Sorties:
Utiliser un peu de perl pour extraire les tags:
Retourne:
ec2metadata
n'est pas dans aws-cli, mais il peut être remplacé parcurl --silent http://169.254.169.254/latest/meta-data/instance-id
. aussi,jq
peut parser le json est plus facile, ou d'un autre format de sortie est encore plus facile.sudo apt-get -y install python
etexport AWS_DEFAULT_REGION=us-west-1
J'ai reconstitué la suite qui, je l'espère, plus simple et plus propre que certaines de ces réponses et n'utilise que les AWS CLI et sans outils supplémentaires.
Cet exemple de code montre comment obtenir la valeur de l'étiquette "montag" pour l'actuelle instance EC2:
À l'aide de décrivez-les tags:
Ou, alternativement, à l'aide de décrivez-les instances:
Télécharger et exécuter un fichier exécutable autonome pour le faire.
Parfois on ne peut pas installer awscli qui dépend de python. docker est peut-être l'image aussi.
Voici ma mise en œuvre dans golang:
https://github.com/hmalphettes/go-ec2-describe-tags
Jq + ec2metadata fait un peu plus agréable. Je suis l'aide de cf et d'avoir accès à la région. Sinon, vous pouvez la saisir dans bash.