回答:
AWSメタデータツール(インスタンスIDを取得するため)と新しいTag APIを組み合わせて使用して、現在のインスタンスのタグを取得できます。
ec2metadata --instance-id
--out = json | jq '.Tags [] | select(.Key == "role")| .Value '
ec2metadata
ツールは非推奨です。次に、169.254.169.254 / latest / meta -dataで「マジック」URLをクエリします-cURLでヒットすると、さまざまなデータを取得するために使用できるマジックエンドポイントが提供されます。この場合curl http://169.254.169.254/latest/meta-data/instance-id
、インスタンスIDを取得します
次のbashスクリプトは、現在のec2インスタンスの名前(「Name」タグの値)を返します。TAG_NAMEを特定のケースに変更します。
TAG_NAME="Name"
INSTANCE_ID="`wget -qO- http://instance-data/latest/meta-data/instance-id`"
REGION="`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
TAG_VALUE="`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values=$TAG_NAME" --region $REGION --output=text | cut -f5`"
AWS CLIをインストールするには
sudo apt-get install python-pip -y
sudo pip install awscli
明示的な認証情報の代わりにIAMを使用する場合は、次のIAMアクセス許可を使用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "ec2:DescribeTags"],
"Resource": ["*"]
}
]
}
aws ec2 describe-tags
。このIAMをIAMロールのインラインポリシーに追加する必要がありました。ありがとう!
| cut -f5
をに置き換えることができ--query="Tags[0].Value"
ます。
(上記のRanieriの回答で述べたように)取得ec2-metadata
してec2-describe-tags
インストールしたら、「Name = Foo」タグが付いていると想定して、現在のインスタンスの「name」を取得するためのシェルコマンドの例を次に示します。
EC2_PRIVATE_KEYおよびEC2_CERT環境変数が設定されていると想定します。
ec2-describe-tags \
--filter "resource-type=instance" \
--filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" \
--filter "key=Name" | cut -f5
これはを返しますFoo
。
ec2-describe-tags
デフォルトはであることに注意してくださいus-east-2
。--region
別の地域を使用するには、フラグを渡してください。
このスクリプトをcloud-initユーザーデータに追加して、EC2タグをローカルファイルにダウンロードできます。
#!/bin/sh
INSTANCE_ID=`wget -qO- http://instance-data/latest/meta-data/instance-id`
REGION=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//'`
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/\1="\2"/' > /etc/ec2-tags
システムにAWS CLIツールをインストールする必要があります。packages
スクリプトの前にcloud-configファイルのセクションを使用してツールをインストールするか、すでにツールが含まれているAMIを使用するか、apt
またはyum
スクリプトの先頭にor コマンドを追加します。
EC2タグにアクセスするには、インスタンスのIAMロールに次のようなポリシーが必要です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1409309287000",
"Effect": "Allow",
"Action": [
"ec2:DescribeTags"
],
"Resource": [
"*"
]
}
]
}
インスタンスのEC2タグは/etc/ec2-tags
次の形式で使用できます。
FOO="Bar"
Name="EC2 tags with cloud-init"
次のように、ファイルをそのまま使用してシェルスクリプトに含めることができます. /etc/ec2-tags
。
#!/bin/sh
. /etc/ec2-tags
echo $Name
タグはインスタンスの初期化中にダウンロードされるため、その後の変更は反映されません。
スクリプトとIAMポリシーは、itaifrenkelの回答に基づいています。
aws:autoscaling:groupName
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/EC2_TAG_\1="\2"/' |sed -r 's/aws:autoscaling:/aws_autoscaling_/' > /etc/ec2-tags
デフォルトのアベイラビリティーゾーンにいない場合、overthinkの結果は空を返します。
ec2-describe-tags \
--region \
$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") \
--filter \
resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id)
フィルターを追加して特定のタグ(私の場合はelasticbeanstalk:environment-name)を取得する場合は、これを行うことができます。
ec2-describe-tags \
--region \
$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") \
--filter \
resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) \
--filter \
key=elasticbeanstalk:environment-name | cut -f5
そして、フィルター処理したタグの値のみを取得するために、パイプで切り取り、5番目のフィールドを取得します。
ec2-describe-tags \
--region \
$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") \
--filter \
resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) \
--filter \
key=elasticbeanstalk:environment-name | cut -f5
elasticbeanstalk:environment-name
してName
Pythonの場合:
from boto import utils, ec2
from os import environ
# import keys from os.env or use default (not secure)
aws_access_key_id = environ.get('AWS_ACCESS_KEY_ID', failobj='XXXXXXXXXXX')
aws_secret_access_key = environ.get('AWS_SECRET_ACCESS_KEY', failobj='XXXXXXXXXXXXXXXXXXXXX')
#load metadata , if = {} we are on localhost
# http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
region = instance_metadata['placement']['availability-zone'][:-1]
instance_id = instance_metadata['instance-id']
conn = ec2.connect_to_region(region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
# get tag status for our instance_id using filters
# http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeTags.html
tags = conn.get_all_tags(filters={'resource-id': instance_id, 'key': 'status'})
if tags:
instance_status = tags[0].value
else:
instance_status = None
logging.error('no status tag for '+region+' '+instance_id)
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
別の方法として、代わりにdescribe-instances
cli呼び出しを使用できますdescribe-tags
。
次の例は、インスタンスのタグ「my-tag-name」の値を取得する方法を示しています。
aws ec2 describe-instances \
--instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) \
--query "Reservations[*].Instances[*].Tags[?Key=='my-tag-name'].Value" \
--region ap-southeast-2 --output text
地域の状況に合わせて地域を変更してください。これは、インスタンスプロファイルポリシーでインスタンスにdescribe-instances権限はあるが、describe-tagsがない場合に役立ちます。
AWSの「ユーザーデータ」および「メタデータ」APIを使用すると、カスタムの証明書名でパペットの実行を開始するパペットをラップするスクリプトを作成できます。
まず、カスタムユーザーデータを使用してawsインスタンスを起動します: 'role:webserver'
#!/bin/bash
# Find the name from the user data passed in on instance creation
USER=$(curl -s "http://169.254.169.254/latest/user-data")
IFS=':' read -ra UDATA <<< "$USER"
# Find the instance ID from the meta data api
ID=$(curl -s "http://169.254.169.254/latest/meta-data/instance-id")
CERTNAME=${UDATA[1]}.$ID.aws
echo "Running Puppet for certname: " $CERTNAME
puppet agent -t --certname=$CERTNAME
これは、「webserver.i-hfg453.aws」のような証明書名でパペットを呼び出します。次に、「webserver」というノードマニフェストを作成できます。パペットは「ファジーノードマッチング」により、すべてのウェブサーバーのプロビジョニングに使用されます。
この例では、puppetがインストールされたベースイメージなどでビルドすることを想定しています。
利点:
1)資格情報を渡す必要はありません
2)ロール設定を使用して、好きなだけ細かく設定できます。
既存の回答のいくつかよりもシンプルでクリーンであり、AWS CLIのみを使用し、追加のツールは使用しない次のものをまとめました。
次のコード例は、現在のEC2インスタンスのタグ「myTag」の値を取得する方法を示しています。
export AWS_DEFAULT_REGION=us-east-1
instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
aws ec2 describe-tags \
--filters "Name=resource-id,Values=$instance_id" 'Name=key,Values=myTag' \
--query 'Tags[].Value' --output text
または、代わりにdescribe-instancesを使用します。
aws ec2 describe-instances --instance-id $instance_id \
--query 'Reservations[].Instances[].Tags[?Key==`myTag`].Value' --output text
上記の回答の一部のバリエーションですが、これはインスタンスのユーザーデータスクリプトから特定のタグの値を取得する方法です
REGION=$(curl http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//')
INSTANCE_ID=$(curl -s http://instance-data/latest/meta-data/instance-id)
TAG_VALUE=$(aws ec2 describe-tags --region $REGION --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values='<TAG_NAME_HERE>'" | jq -r '.Tags[].Value')
AWS CLIをインストールします。
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
sudo apt-get install unzip
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
現在のインスタンスのタグを取得します。
aws ec2 describe-tags --filters "Name=resource-id,Values=`ec2metadata --instance-id`"
出力:
{
"Tags": [
{
"ResourceType": "instance",
"ResourceId": "i-6a7e559d",
"Value": "Webserver",
"Key": "Name"
}
]
}
少しperlを使用してタグを抽出します。
aws ec2 describe-tags --filters \
"Name=resource-id,Values=`ec2metadata --instance-id`" | \
perl -ne 'print "$1\n" if /\"Value\": \"(.*?)\"/'
戻り値:
Webserver
ec2metadata
aws-cliにはありませんが、で置き換えることができますcurl --silent http://169.254.169.254/latest/meta-data/instance-id
。また、jq
jsonの解析が簡単になります。または、別の出力形式の方が簡単です。
sudo apt-get -y install python
とexport AWS_DEFAULT_REGION=us-west-1
instance-id: i-07f59f3564618f148
これを行うには、スタンドアロンの実行可能ファイルをダウンロードして実行します。
Pythonに依存するawscliをインストールできない場合があります。dockerも画像から外れている可能性があります。
これが私のgolangでの実装です:https : //github.com/hmalphettes/go-ec2-describe-tags
EC2でFishシェルを使用するほどクレイジーな人のために、/ home / ec2-user / .config / fish / config.fishの便利なスニペットを次に示します。hostdataコマンドは、すべてのタグと、パブリックIPおよびホスト名を一覧表示します。
set -x INSTANCE_ID (wget -qO- http://instance-data/latest/meta-data/instance-id)
set -x REGION (wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//')
function hostdata
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/\1="\2"/'
ec2-metadata | grep public-hostname
ec2-metadata | grep public-ipv4
end