Skip to content

Instantly share code, notes, and snippets.

@marcellodesales
Last active November 8, 2022 11:49
Show Gist options
  • Save marcellodesales/a890b8ca240403187269 to your computer and use it in GitHub Desktop.
Save marcellodesales/a890b8ca240403187269 to your computer and use it in GitHub Desktop.
Create Environment Variables in EC2 Hosts from EC2 Host Tags, just like Beanstalk or Heroku does!
######
# Author: Marcello de Sales (marcello.desales@gmail.com)
# 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
####
# Add tags to an EC2 host or Image Profile
# 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"
@drumadrian
Copy link

this script works well, but has issues with AWS generated tags.

for example: aws:cloudformation:stack-id

The ":" caused a problem when it is in the string used as the export variable name

Here is the full Key=Value tag pair:

aws:cloudformation:stack-id=arn:aws:cloudformation:us-west-2:634580338419:stack/deployment-pipeline-myfeature/ce1580f0-b3ad-11e8-acae-0a3d4b08165a

@adamscarlat
Copy link

This script works when I run it directly from the EC2 instance. It doesn't work for me when I add it as a command to run in the instance's UserData during instance configuration.
Is it possible to run this script from UserData?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment