2010-10-07 93 views
73

亞馬遜最近添加了用鍵值對標記EC2實例的奇妙功能,使大量虛擬機的管理更容易一些。查詢實例中的EC2標籤

有沒有某種方式來查詢這些標籤的方式與其他一些用戶設置的數據相同?例如:

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

是否有一些類似的方式來查詢標籤?

回答

32

您可以使用AWS metadata tool(檢索您的實例ID)和new Tag API的組合來檢索當前實例的標籤。

+0

OK,我也跟着鏈接,它看起來像它的API文檔。有沒有我可以使用的工具,還是我需要閱讀API文檔並編寫我自己的工具? – 2012-04-08 19:33:03

+3

ec2-describe-tags命令是否易於使用?據說它在ec2-api-tools軟件包中,但是當我嘗試安裝它時,除了404以外我什麼都沒有。 – 2012-04-08 19:39:58

+1

舉個例子,獲取標記角色的值: aws ec2 describe-tags --filters Name = resource-id,Values ='ec2metadata --instance-id' --out = json | jq'.Tags [] |選擇(.Key ==「role」)| .Value' – jolestar 2015-04-25 02:14:13

40

一旦你得到了ec2-metadata並安裝ec2-describe-tags(如Ranieri's answer above提到的),這裏是一個例子shell命令獲得「名」當前情況下,假設你有上有一個「名稱=富」的標籤。

假定設置了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

+13

如果我的進程可以獲取當前實例的標籤,必須在實例上也有EC2_PRIVATE_KEY。 :-( – 2012-10-10 21:33:02

+1

@ william-payne是的,那真的很蹩腳,也許使用亞馬遜的IAM,你至少可以使用一個用戶訪問非常有限的任何東西。FWIW,我不再使用這種方法,只是使用外部腳本 – overthink 2012-10-15 21:46:38

+11

@WilliamPayne您可以使用「Amazon EC2只讀訪問權限」策略設置IAM角色並創建具有該角色的實例。如果您創建了僅具有「DescribeTags」權限的自定義策略,也可以創建該角色我希望能夠更細化 – roverwolf 2012-10-17 15:04:32

3

使用AWS的「用戶數據」和「元數據」API,可以編寫一個包裝puppet的腳本來開始使用自定義證書名稱的puppet運行。

首先開始定製用戶數據的AWS實例:「角色:Web服務器」

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

這就要求木偶像certname「webserver.i-hfg453.aws」然後你可以創建一個名爲清單節點'網絡服務器'和木偶的'模糊節點匹配'將意味着它被用來配置所有的網絡服務器。

這個例子假設你建立一個基本映像安裝木偶等

優點:

1)你不必通過圓您的憑據

2)你可以像如果您喜歡角色配置,則可以進行細化。

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) 

如果你想添加一個過濾器來獲得一個特定的標籤(elasticbeanstalk:環境名稱在我的情況),那麼你可以這樣做。

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 

並且爲了僅獲得我過濾的標籤的值,我們管道切割並獲得第五個字段。

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 
35

以下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`" 

要CLI

sudo apt-get install python-pip -y 
sudo pip install awscli 

安裝AWS如果您在使用IAM而不是明確的憑據,使用這些IAM權限:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    {  
     "Effect": "Allow", 
     "Action": [ "ec2:DescribeTags"], 
     "Resource": ["*"] 
    } 
    ] 
} 
+0

我用'aws ec2 describe-tags'得到了」您無權執行此操作「。我需要將這個IAM添加到我的IAM角色的內聯策略中。謝謝! – 2016-01-05 16:06:43

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) 
+0

Legit。讀者注意到您甚至不需要證書的基本本地信息,只是'instance_metadata = utils.get_instance_metadata(timeout = 0.5,num_retries = 1 )' – Bartvds 2015-05-14 13:15:35

+0

此外,這與IAM角色搭配得很好 - 如果你設置了一個實例角色,boto會自動檢測ID和密鑰 – dbn 2017-06-12 19:41:51

10

您可以將此腳本添加到您的雲初始化用戶數據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工具:您可以與之前在雲-config文件中packages部分進行安裝該腳本使用已包含它們的AMI,或者在腳本的開頭添加aptyum命令。

爲了訪問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將該文件原樣包含在shell腳本中,例如:

#!/bin/sh 
. /etc/ec2-tags 
echo $Name 

標記在實例初始化期間下載,因此它們不會反映後續更改。


腳本和IAM策略基於itaifrenkel的回答。

+0

a +更喜歡這個方法 – Cmag 2015-05-19 15:36:16

+0

太糟糕了,這對於自動縮放組創建的標籤來說太糟糕了:'aws:autoscaling: groupName' – Cmag 2015-05-19 15:36:53

+2

然後試試這個: 'aws ec2 describe-tags --region $ REGION --filter「Name = resource-id,Values = $ INSTANCE_ID」--output = text | sed -r's/TAGS \ t( 。*)\噸。* \噸。* \噸(。*)/ EC2_TAG_ \ 1 = 「\ 2」/ '| sed -r's/aws:autoscaling:/ aws_autoscaling_ /'>/etc/ec2-tags' – 2015-06-23 23:45:50

0

安裝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 
+0

'ec2metadata'不在aws-cli中,但可以用curl替換--silent http://169.254.169.254 /最新/元數據/實例id'。另外,'jq'可以更輕鬆地解析json,或者更簡單的輸出格式。 – tedder42 2015-08-04 21:35:17