2017-08-20 6 views
0

Je souhaite remplir certaines variables de l'instance de spot EC2, mais comme il est impossible de le faire directement en requête ponctuelle, je le fais par script de données utilisateur. Tout va bien quand je spécifie une région de manière statique, mais ce n'est pas une approche universelle. Lorsque j'essaie de détecter la région actuelle à partir des données d'utilisateur de l'instance, la variable région est toujours vide. Je le fais d'une manière suivante:La zone d'instance EC2 n'est pas renseignée dans le script de données utilisateur

#!/bin/bash 
region=$(ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//') 
aws ec2 create-tags \ 
    --region $region \ 
    --resources `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id` \ 
    --tags Key=sometag,Value=somevalue Key=sometag,Value=somevalue 

J'ai essayé de fait un délai avant que la région peuplant

/bin/sleep 30 

mais cela n'a eu aucun résultat.

Cependant, lorsque je lance ce script manuellement après le démarrage, les balises sont ajoutées correctement. Que se passe-t-il?

Pourquoi tout dans tout aws-cli n'obtient pas la région par défaut du profil? J'ai aws configure correctement configuré à l'intérieur de l'instance, mais sans clause --region il renvoie erreur que la région n'est pas spécifiée.

+1

Il est toujours recommandé de qualifier complètement les chemins dans les scripts shell. Lorsque vous l'exécutez manuellement, l'environnement est probablement très différent, y compris '$ PATH' ... donc vous voulez' region = $ (/ usr/bin/ec2-metadata ... '(ou n'importe où sur votre système) –

Répondre

0

J'ai fini avec

region=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print" 

qui a bien fonctionné. Cependant, ce serait bien si quelqu'un expliquait les écrous et les boulons.

+0

Il s'agit de l'URL via laquelle l'hyperviseur Amazon EC2 fournit [métadonnées d'instance] (http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html). à travers le réseau - il est directement renvoyé à l'instance La commande 'ec2-metadata' appelle simplement cette URL en votre nom, donc le résultat de travail l'appelle directement Le document renvoie [informations sur l'instance] (http: //docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html). –

2

Je suppose que la commande ec2-metadata n'est pas disponible lorsque votre script de données utilisateur est exécuté. Essayez d'obtenir la région à partir du serveur de métadonnées directement (ce qui est ce que ec2-metadata-t de toute façon)

region=$(curl -fsq http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//') 

AWS CLI n'utilise la région de profil par défaut.