web-dev-qa-db-ja.com

Amazon EC2で環境変数を設定する方法

EC2インスタンスの1つに対してAWSコンソールでタグを作成しました。

enter image description here

ただし、サーバーを見ると、そのような環境変数は設定されていません。

同じことがElastic Beantalkでも機能します。 envは、コンソールで作成したタグを示しています。

$ env
 [...]
 DB_PORT=5432

Amazon EC2で環境変数を設定するにはどうすればよいですか?

31
PJ Bergeron

Guy の指示に従って、小さなシェルスクリプトを作成しました。このスクリプトは、AWS CLIとjqを使用します。 AWSインスタンスとAMIタグをシェル環境変数としてインポートできます。

数人に役立つことを願っています。

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

2
PJ Bergeron

メタデータからこの情報を取得して、独自の環境設定コマンドを実行できます。

メタデータからインスタンスIDを取得できます(詳細については、こちらを参照してください: 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を使用してdescribe-tagsを呼び出すことができます(またはAMIにインストールします)

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

その後、OS set環境変数コマンドを使用できます

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

これらすべてをユーザーデータスクリプトで実行できます。詳細については、こちらをご覧ください: http://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/user-data.html

26
Guy

次のツールを組み合わせて使用​​しました。

  • Jqライブラリをインストールします(Sudo apt-get install -y jq)
  • EC2インスタンスメタデータクエリツールをインストールする

将来更新する場合のコードの要点は次のとおりです。 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

最近、AWS Parameter Storeがより良いソリューションのようです。

データベースキーなどの機密構成を自動管理するシークレットマネージャーもあります。

Guy および PJ Bergeron による以前のソリューションに基づいたSSMパラメーターストアを使用してこのスクリプトを参照してください。

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

2
dlz21

通常、UserDataスクリプトを実行して、ブート時に環境変数としてタグをロードします。インスタンスに応じて、--queryおよび--filterパラメーターをdescribe-instances呼び出しに変更しますが、それ以外はスクリプトは同じままです。 [〜#〜] note [〜#〜]:以下の例では、タグ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を使用して結果を実行します。

1
Sebastian N