J'ai créé une balise sur la console AWS pour l'une de mes instances EC2.
Cependant, lorsque je regarde sur le serveur, aucune variable d’environnement de ce type n’est définie.
La même chose fonctionne avec un haricot élastique. env
affiche les tags que j'ai créés sur la console.
$ env
[...]
DB_PORT=5432
Comment définir des variables d'environnement dans Amazon EC2?
En suivant les instructions données par Guy , j’ai écrit un petit script Shell. Ce script utilise AWS CLI et jq
. Il vous permet d'importer votre instance AWS et les balises AMI en tant que variables d'environnement Shell.
J'espère que cela peut aider quelques personnes.
Vous pouvez récupérer ces informations à partir des métadonnées, puis exécuter vos propres commandes set environment.
Vous pouvez obtenir l'ID d'instance à partir des métadonnées (voir ici pour plus de détails: http://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data -retraitement )
curl http://169.254.169.254/latest/meta-data/instance-id
Ensuite, vous pouvez appeler les describe-tags à l'aide de l'AWS CLI préinstallée (ou l'installer sur votre AMI).
aws ec2 describe-tags --filters "Name=resource-id,Values=i-5f4e3d2a" "Name=Value,Values=DB_PORT"
Ensuite, vous pouvez utiliser la commande de variable d'environnement OS set
export DB_PORT=/what/you/got/from/the/previous/call
Vous pouvez exécuter tout cela dans votre script de données utilisateur. Voir ici pour plus de détails: http://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/user-data.html
J'ai utilisé une combinaison des outils suivants:
Voici le résumé du code ci-dessous au cas où je le mettrais à jour ultérieurement: https://Gist.github.com/marcellodesales/a890b8ca240403187269
######
# Author: Marcello de Sales ([email protected])
# Description: Create Create Environment Variables in EC2 Hosts from EC2 Host Tags
#
### Requirements:
# * Install jq library (Sudo apt-get install -y jq)
# * Install the EC2 Instance Metadata Query Tool (http://aws.Amazon.com/code/1825)
#
### Installation:
# * Add the Policy EC2:DescribeTags to a User
# * aws configure
# * Souce it to the user's ~/.profile that has permissions
####
# REboot and verify the result of $(env).
# Loads the Tags from the current instance
getInstanceTags () {
# http://aws.Amazon.com/code/1825 EC2 Instance Metadata Query Tool
INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk '{print $2}')
# Describe the tags of this instance
aws ec2 describe-tags --region sa-east-1 --filters "Name=resource-id,Values=$INSTANCE_ID"
}
# Convert the tags to environment variables.
# Based on https://github.com/berpj/ec2-tags-env/pull/1
tags_to_env () {
tags=$1
for key in $(echo $tags | /usr/bin/jq -r ".[][].Key"); do
value=$(echo $tags | /usr/bin/jq -r ".[][] | select(.Key==\"$key\") | .Value")
key=$(echo $key | /usr/bin/tr '-' '_' | /usr/bin/tr '[:lower:]' '[:upper:]')
echo "Exporting $key=$value"
export $key="$value"
done
}
# Execute the commands
instanceTags=$(getInstanceTags)
tags_to_env "$instanceTags"
Dernièrement, il semble qu'AWS Parameter Store soit une meilleure solution.
Maintenant, il existe même un gestionnaire de secrets qui gère automatiquement les configurations sensibles comme des clés de base de données, etc.
Voir ce script en utilisant SSM Parameter Store basé sur les solutions précédentes par Guy et PJ Bergeron .
Je charge normalement les balises en tant que variables d'environnement au démarrage en exécutant un script UserData. Selon l'instance, je change le --query
et --filter
paramètres à la describe-instances
appel, mais sinon le script reste le même. NOTE : L'exemple ci-dessous exclut la balise Name
et les balises contenant :
- changez ce comportement en fonction de vos besoins.
#!/bin/bash -v
apt-get update
apt-get -y install awscli
# add boot script which loads environment variables
cat > /etc/profile.d/export_instance_tags.sh << 'EndOfMessage'
# fetch instance info
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
INSTANCE_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
INSTANCE_REGION="`echo \"$INSTANCE_AZ\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
# export instance tags
export_statement=$(aws ec2 describe-tags --region "$INSTANCE_REGION" --filters "Name=resource-id,Values=$INSTANCE_ID" --query 'Tags[?!contains(Key, `Name`) && !contains(Key, `:`)].[Key,Value]' --output text | sed -E 's/^([^\s\t]+)[\s\t]+([^\n]+)$/export \1="\2"/g')
eval $export_statement
# export instance info
export INSTANCE_ID
export INSTANCE_AZ
export INSTANCE_REGION
EndOfMessage
Il fonctionne describe-tags
pour répertorier toutes les balises, reformate la sortie en une séquence d'instructions d'exportation avec sed
puis exécute le résultat à l'aide de eval