インスタンス内からEC2タグをクエリする


96

Amazonは最近、EC2インスタンスにキーと値のペアでタグ付けする素晴らしい機能を追加して、多数のVMの管理を少し簡単にしました。

他のユーザー設定データと同じ方法でこれらのタグをクエリする方法はありますか?例えば:

$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d

タグをクエリする同様の方法はありますか?

回答:


36

AWSメタデータツール(インスタンスIDを取得するため)と新しいTag APIを組み合わせて使用​​して、現在のインスタンスのタグを取得できます。


OK、私はそのリンクをたどりました、そしてそれはそれがAPIドキュメントであるように見えます。使用できるツールはありませんか、またはAPIドキュメントを読んで独自のツールを作成する必要がありますか?
エドワードフォーク

3
ec2-describe-tagsコマンドは簡単に利用できますか?ec2-api-toolsパッケージにあると思われますが、インストールしようとしたときに404しかありませんでした。
エドワードフォーク

2
例を挙げて、タグの役割の値を取得します。awsec2 describe-tags --filters Name = resource-id、Values = ec2metadata --instance-id--out = json | jq '.Tags [] | select(.Key == "role")| .Value '
jolestar

11
これは回答へのポインタですが、それ自体の回答ではありません
Roy Truelove 2017年

3
このec2metadataツールは非推奨です。次に、169.254.169.254 / latest / meta -dataで「マジック」URLをクエリします-cURLでヒットすると、さまざまなデータを取得するために使用できるマジックエンドポイントが提供されます。この場合curl http://169.254.169.254/latest/meta-data/instance-id、インスタンスIDを取得します
Asfand Qazi

52

次の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ロールのインラインポリシーに追加する必要がありました。ありがとう!
Victor D.

をわずかに最適化して、| cut -f5をに置き換えることができ--query="Tags[0].Value"ます。
リチャードAクワドリング

47

上記の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


17
インスタンスにEC2_PRIVATE_KEYも必要とせずに、プロセスが現在のインスタンスのタグを取得できればいいのですが。:-(
ウィリアム・ペイン

1
@ william-payneええ、それは本当に不自由です。おそらく、AmazonのIAMを使用すれば、少なくとも何かへのアクセスが非常に制限されたユーザーを使用できます。FWIW、私はこのアプローチをもう使用せず、外部スクリプトを使用してボックスをセットアップします。
overthink

12
@WilliamPayne「Amazon EC2読み取り専用アクセス」ポリシーを使用してIAMロールを設定し、そのロールを持つインスタンスを作成できます。さらに詳細にしたい場合は、「DescribeTags」権限のみを持つカスタムポリシーを作成することもできます。
ローバーウルフ

@WilliamPayneローバーウルフの提案が気に入りました。それはうまくいきました。あなたはそれを見たい場合、私は実際に詳細を別の質問に答え:stackoverflow.com/questions/9950586/...
トニー・

2
ec2-describe-tagsデフォルトはであることに注意してくださいus-east-2--region別の地域を使用するには、フラグを渡してください。
15

15

このスクリプトを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の回答に基づいています。


a +この方法を好む
Cmag

グループを自動スケーリングによって作成されたタグはあまりにも悪いこの休憩:aws:autoscaling:groupName
Cmag

2
そして、この試してください: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
ライアンGooler

10

デフォルトのアベイラビリティーゾーンにいない場合、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

偉大な仕事は、別のDNSインスタンス・データは私のために働いていない、最後の1のためにあなたが名前タグを必要とする場合は交換持つ、あなたに感謝elasticbeanstalk:environment-nameしてName
detzu

5

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)
Bartvds

また、これはIAMロールでうまく機能します。インスタンスロールを設定すると、botoがIDとキーを自動的に検出します。
dbn 2017年

5

別の方法として、代わりにdescribe-instancescli呼び出しを使用できます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がない場合に役立ちます。


3

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)ロール設定を使用して、好きなだけ細かく設定できます。


3

既存の回答のいくつかよりもシンプルでクリーンであり、AWS CLIのみを使用し、追加のツールは使用しない次のものをまとめました。

次のコード例は、現在のEC2インスタンスのタグ「myTag」の値を取得する方法を示しています。

describe-tagsの使用:

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

2

上記の回答の一部のバリエーションですが、これはインスタンスのユーザーデータスクリプトから特定のタグの値を取得する方法です

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')

1

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

ec2metadataaws-cliにはありませんが、で置き換えることができますcurl --silent http://169.254.169.254/latest/meta-data/instance-id。また、jqjsonの解析が簡単になります。または、別の出力形式の方が簡単です。
tedder42 2015

:この作品は、しかし、私は、以下を追加する必要があるsudo apt-get -y install pythonexport AWS_DEFAULT_REGION=us-west-1
ユージン

これは機能しません... 1. ec2metadataは誤ったコマンドです。2. ec2-metadata --instance-idが返されますinstance-id: i-07f59f3564618f148
Daniel Hornik

1

これを行うには、スタンドアロンの実行可能ファイルをダウンロードして実行します。

Pythonに依存するawscliをインストールできない場合があります。dockerも画像から外れている可能性があります。

これが私のgolangでの実装です:https : //github.com/hmalphettes/go-ec2-describe-tags


1

Jq + ec2metadataを使用すると、少し快適になります。私はcfを使用しており、リージョンにアクセスできます。それ以外の場合は、bashで取得できます。

aws ec2 describe-tags --region $REGION \
--filters "Name=resource-id,Values=`ec2metadata --instance-id`" | jq --raw-output \
'.Tags[] | select(.Key=="TAG_NAME") | .Value'

0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.