24

Ich habe ein Tag auf der AWS-Konsole für eine meiner EC2-Instanzen erstellt.So legen Sie eine Umgebungsvariable in Amazon EC2 fest

enter image description here

Allerdings, wenn ich auf dem Server suchen, ein solche Umgebungsvariablen gesetzt ist.

Das gleiche funktioniert mit elastischen Bohnen. env zeigt die Tags, die ich auf der Konsole erstellt habe.

$ env 
[...] 
DB_PORT=5432 

Wie kann ich Umgebungsvariablen in Amazon EC2 festlegen?

Antwort

2

Nach den Anweisungen von Guy schrieb ich ein kleines Shell-Skript. Dieses Skript verwendet AWS CLI und jq. Sie können Ihre AWS-Instanz und AMI-Tags als Shell-Umgebungsvariablen importieren.

Ich hoffe, es kann ein paar Menschen helfen.

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

+0

Erstellt gerade eine verbesserte Version der oben bereitgestellten Lösung unter https://gist.github.com/marcellodesales/a890b8ca240403187269 –

18

Sie können diese Informationen aus den Metadaten abrufen und dann eigene Set-Environment-Befehle ausführen.

Sie können die Instanz-ID aus den Meta-Daten (siehe hier für weitere Details: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval) erhalten

curl http://169.254.169.254/latest/meta-data/instance-id 

Dann können Sie die describe-Tags mit Hilfe der vorinstallierten AWS CLI aufrufen (oder auf installieren AMI Ihre)

aws ec2 describe-tags --filters "Name=resource-id,Values=i-5f4e3d2a" "Name=Value,Values=DB_PORT" 

Dann können Sie OS Umgebungsvariable Befehl

export DB_PORT=/what/you/got/from/the/previous/call 

Sie können all das in Ihrem Benutzerdatenskript ausführen. Siehe hier für Details: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

+5

ich für die Instanz mit einem IAM-Rolle empfehlen - das Sie ermöglichen wird, Führen Sie den API-Aufruf ohne Angabe der Anmeldeinformationen aus. Diese Antwort, die Guy gab, ist genau das, was wir in der Produktion verwenden. –

+1

Danke für Ihre Antworten. Ich habe eine IAM-Rolle erstellt, die 'ec2: DescribeTags' erlaubt, aber wenn ich 'aws ec2 describe-tags' ausführe, bekomme ich 'Ein Client-Fehler (UnauthorizedOperation) beim Aufruf der DescribeTags-Operation: Sie sind nicht berechtigt, diese Operation auszuführen'. Was vermisse ich? –

+0

Ok, ich musste 'rm -rf .aws' und' aws configure' (ohne Eingabe eines API-Schlüssels) tun, damit aws die neuen Berechtigungsnachweise aus den Metadaten der Instanz liest. –

3

habe ich eine Kombination der folgenden Tools:

  • installieren jq-Bibliothek (sudo apt-get install -y jq)
  • Installieren Sie die EC2 Instanz Metadaten Abfrage-Tool

Hier ist der Kern des Codes unten, falls ich ihn in Zukunft aktualisiere: 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" 
0

Ich normalerweise Tags als Umgebungsvariablen beim Booten laden, indem Sie ein UserData-Skript ausführen. Abhängig von der Instanz ändere ich die Parameter --query und --filter auf den describe-instances Aufruf, aber ansonsten bleibt das Skript gleich. HINWEIS: Im folgenden Beispiel sind das Tag Name und Tags mit : nicht enthalten. Ändern Sie dieses Verhalten entsprechend Ihren Anforderungen.

#!/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 

Es läuft describe-tags Alle Tags aufzulisten, formatiert die Ausgabe in eine Folge von Export-Anweisungen mit sed führt dann das Ergebnis mit eval

Verwandte Themen