web-dev-qa-db-ja.com

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

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

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

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

タグを照会する同様の方法はありますか?

90
Josh Lindsey

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

36
drxzcl

ec2-metadataおよびec2-describe-tagsインストール済み(上記の Ranieriの回答 に記載)、ここに「Name = Foo」タグがあると仮定して、現在のインスタンスの「名前」を取得するシェルコマンドの例を示します。

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を返します。

45
overthink

次の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": ["*"]
    }
  ]
}
44
itaifrenkel

このスクリプトを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ツールをインストールする必要があります。スクリプトの前にcloud-configファイルのpackagesセクションを使用してインストールするか、既に含まれているAMIを使用するか、aptまたはyumコマンドはスクリプトの先頭にあります。

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の回答に基づいています。

12
Andrea

デフォルトのアベイラビリティゾーンにいない場合、オーバーシンクの結果は空になります。

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
10
Michael Connor

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)
5
Sergei

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」などの証明書名でpuppetが呼び出され、「webserver」と呼ばれるノードマニフェストを作成できます。また、「fuzzy node matching」というパペットは、すべてのWebサーバーのプロビジョニングに使用されます。

この例では、Puppetがインストールされたベースイメージなどでビルドすることを想定しています。

利点:

1)資格情報を渡す必要はありません。

2)ロール設定を使用して、好きなだけきめ細かくすることができます。

3
Ben Waine

または、describe-instancesの代わりにdescribe-tags cli呼び出しを使用できます。

次の例は、インスタンスのタグ「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 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
2
Patrick Collins

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

Pythonに依存するawscliをインストールできない場合があります。港湾労働者も絵の外かもしれません。

Golangでの実装を次に示します。 https://github.com/hmalphettes/go-ec2-describe-tags

1
hmalphettes

既存の回答のいくつかよりも簡単で簡潔であり、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
1
Alex Harvey

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
pbsladek