web-dev-qa-db-fra.com

Comment définir une variable d'environnement dans Amazon EC2

J'ai créé une balise sur la console AWS pour l'une de mes instances EC2.

enter image description here

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?

31
PJ Bergeron

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.

https://github.com/12moons/ec2-tags-env

2
PJ Bergeron

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

26
Guy

J'ai utilisé une combinaison des outils suivants:

  • Installer la bibliothèque jq (Sudo apt-get install -y jq)
  • Installer l'outil de requête de métadonnées d'instance EC2

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"
6
Marcello de Sales

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 .

https://github.com/lezavala/ec2-ssm-env

2
dlz21

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

1
Sebastian N