24

Я создал тег на консоли AWS для одного из моих экземпляров EC2.Как установить переменную среды в Amazon EC2

enter image description here

Однако, когда я смотрю на сервере, не такая переменная среды не установлена.

То же самое работает с эластичным бобовым стеблем. env показывает теги, которые я создал на консоли.

$ env 
[...] 
DB_PORT=5432 

Как установить переменные среды в Amazon EC2?

ответ

2

Следуя инструкциям, приведенным Guy, я написал небольшой сценарий оболочки. Этот скрипт использует AWS CLI и jq. Он позволяет импортировать экземпляры AWS и теги AMI в качестве переменных среды оболочки.

Надеюсь, это поможет нескольким людям.

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

+0

Только что создал улучшенную версию решения, представленную выше, на странице https://gist.github.com/marcellodesales/a890b8ca240403187269 –

18

Вы можете получить эту информацию из метаданных, а затем запустить свои собственные команды среды установки.

Вы можете получить экземпляр идентификатор из метаданных (см здесь для подробностей: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval)

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

Тогда вы можете назвать описательные-тег, используя предустановленный AWS CLI (или установить его на ваш AMI)

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

Затем вы можете использовать ОС установлена ​​переменная командной среды

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

Вы можете запустить все это в своем скрипте пользовательских данных. См. Здесь для деталей: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

+5

Я рекомендую использовать IAM роль для экземпляра - это позволит вам выполните вызов API без указания учетных данных. Этот ответ Гай дал именно то, что мы используем в производстве. –

+1

Спасибо за ваши ответы. Я создал роль IAM, разрешающую 'ec2: DescribeTags', но когда я выполняю' aws ec2 description-tags', я получаю 'Ошибка клиента (UnauthorizedOperation) при вызове операции DescribeTags: вы не авторизованы для выполнения этой операции'. Что мне не хватает? –

+0

Хорошо, мне пришлось делать 'rm -rf .aws' и' aws configure' (без ввода какого-либо ключа API), чтобы aws считывал новые учетные данные из метаданных экземпляра. –

3

Я использовал комбинацию из следующих инструментов:

  • Установите JQ библиотеку (Sudo APT-получить установку -y JQ)
  • Установите EC2 экземпляра метаданных Query Tool

Вот суть данного ниже кода на случай, если я обновлю его в будущем: 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

Обычно я загружаю теги в качестве переменных среды при загрузке, запустив скрипт UserData. В зависимости от экземпляра я меняю параметры --query и --filter на вызов describe-instances, но в остальном сценарий остается прежним. ПРИМЕЧАНИЕ: Приведенный ниже пример исключает тег Name и теги, содержащие : - измените эту ситуацию в соответствии с вашими потребностями.

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

Он работает describe-tags перечислить все теги, форматирует вывод в последовательности экспорта отчетности с sed затем запускает результат, используя eval

Смежные вопросы