2010-10-07 6 views
73

Недавно Amazon добавила замечательную особенность тегов EC2-экземпляров с парами ключ-значение, чтобы упростить управление большим количеством виртуальных машин.Query теги EC2 изнутри экземпляра

Есть ли способ запросить эти теги так же, как некоторые другие данные, заданные пользователем? Например:

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

Есть ли аналогичный способ запроса тегов?

ответ

32

Вы можете использовать комбинацию AWS metadata tool (для получения идентификатора вашего экземпляра) и new Tag API для получения тегов для текущего экземпляра.

+0

ОК, я последовал за эту ссылку, и, похоже, это документация API. Нет ли инструмента, который я могу использовать, или мне нужно прочитать документацию по API и написать собственный инструмент? –

+3

Легко ли доступна команда ec2-describe-tags? Предположительно, он находится в пакете ec2-api-tools, но я не получил ничего, кроме 404, когда пытался его установить. –

+1

Приведите пример, получите значение значения тега: aws ec2 description-tags --filters Name = resource-id, Values ​​= 'ec2metadata --instance-id' --out = json | jq '.Tags [] | select (.Key == "role") | .Value ' – jolestar

40

После того, как вы получили ec2-metadata и ec2-describe-tags установлен (как указано в Ranieri's answer above), вот пример команды оболочки, чтобы получить «имя» текущего экземпляра, предполагая, что у вас есть «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.

+13

Было бы неплохо, если бы мои процессы могли получать теги для текущего экземпляра без также должен иметь EC2_PRIVATE_KEY на экземпляре. :-( –

+1

@ william-payne Да, это действительно хромой. Возможно, используя IAM Amazon, вы могли бы хотя бы использовать пользователя с очень ограниченным доступом ко всему. FWIW, я больше не использую этот подход и просто использую внешние скрипты для установите флажок – overthink

+11

@WilliamPayne. Вы можете настроить роль IAM с помощью политики «Доступ только для чтения в формате Amazon EC2» и создать экземпляр, имеющий эту роль. Также возможно создать настраиваемую политику, имеющую только привилегию «Описания», если вы хочу быть более зернистым – roverwolf

3

Используя API-интерфейсы пользовательских данных AWS и метаданные, можно написать скрипт, который обертывает куклу, чтобы начать марионетку с пользовательским именем сертификата.

Сначала начать AWS экземпляр с пользовательскими данными пользователя: «роль: веб-сервер»

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

Если вы не находитесь в зоне доступности по умолчанию, результаты 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: среда-имя в моем случае), то вы можете сделать это.

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 (значение тега «Имя»). Измените 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`" 

Для установки АМС кли

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

В случае использования IAM вместо явных учетных данных, использовать эти IAM разрешения:

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

Я получаю« Вы не авторизованы для выполнения этой операции »с' aws ec2 describe-tags'. Мне нужно было добавить этот IAM к встроенным политикам моей роли IAM. Спасибо! –

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

+0

Кроме того, это прекрасно работает с ролями IAM - если вы установите роль экземпляра, boto автоматически обнаружит идентификатор и ключ. – dbn

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 установлены на вашей системе: вы можете установить их с 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" 

You может включать файл как есть в сценарии оболочки, используя . /etc/ec2-tags, например:

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

Теги загружаются во время инициализации экземпляра, поэтому они не будут отражать последующие изменения.


Сценарий и политика IAM основаны на ответе itaifrenkel.

+0

a + предпочитает этот метод – Cmag

+0

слишком плохо, это перерывы для тегов, созданных группами автомасштабирования:' 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 (. *) \ т. * \ т. * \ т (. *)/EC2_TAG_ \ 1 = "\ 2"/'| sed -r' s/aws: autoscaling:/aws_autoscaling_/'>/etc/ec2-tags' –

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

1

Скачать и запустить исполняемый, чтобы сделать это.

Иногда нельзя установить awscli, который зависит от python. Возможно, докер тоже не работает.

Вот моя реализация в golang: https://github.com/hmalphettes/go-ec2-describe-tags

Смежные вопросы