Запрос тегов EC2 из экземпляра - PullRequest
90 голосов
/ 07 октября 2010

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

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

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

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

Ответы [ 12 ]

45 голосов
/ 19 августа 2011

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

41 голосов
/ 03 июля 2014

Следующий скрипт 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": ["*"]
    }
  ]
}
36 голосов
/ 08 октября 2010

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

12 голосов
/ 08 сентября 2014

Вы можете добавить этот сценарий к своим 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

Вам необходимы инструменты CLI AWS, установленные в вашей системе: вы можете установить их с разделом 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 основаны на ответе Итаифренкеля.

10 голосов
/ 14 февраля 2014

Если вы не находитесь в зоне доступности по умолчанию, результаты переосмысления вернутся пустыми.

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)

Если вы хотите добавить фильтр для получения определенного тега (эластичный стержень: имя-среды в моем случае), то вы можете сделать это.

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
5 голосов
/ 08 августа 2014

Для 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)
3 голосов
/ 25 июля 2018

В качестве альтернативы вы можете использовать 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

Измените регион в соответствии с вашими местными условиями. Это может быть полезно, если у вашего экземпляра есть привилегия description-instances, но нет тегов description в политике профиля экземпляра

3 голосов
/ 05 ноября 2013

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

Сначала запустите экземпляр 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', который вы затем можете создатьманифест узла под названием «веб-сервер» и «нечеткое соответствие узлов» марионеток будут означать, что он используется для предоставления всех веб-серверов.

В этом примере предполагается, что вы строите базовый образ с установленной куклой и т. Д.

Преимущества:

1) Вам не нужно передавать свои учетные данные

2) С конфигами ролей вы можете быть настолько гранулированными, насколько вам нравится.

1 голос
/ 17 апреля 2019

Я собрал следующее, которое, надеюсь, проще и чище, чем некоторые из существующих ответов, и использует только CLI AWS и никаких дополнительных инструментов.

В этом примере кода показано, как получить значение тега 'myTag' для текущего экземпляра EC2:

Использование описывает теги :

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

Или, альтернативно, используя описать-экземпляры :

aws ec2 describe-instances --instance-id $instance_id \
  --query 'Reservations[].Instances[].Tags[?Key==`myTag`].Value' --output text
1 голос
/ 26 ноября 2015

Для этого загрузите и запустите автономный исполняемый файл.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...