Boto EC2: создание экземпляра с тегами

Есть ли способ с помощью API boto python указать теги при создании экземпляра? Я пытаюсь избежать необходимости создавать экземпляр, извлекать его, а затем добавлять теги. Было бы намного проще либо предварительно настроить экземпляр для определенных тегов, либо указать теги, когда я выполняю следующую команду:

ec2server.create_instance(
        ec2_conn, ami_name, security_group, instance_type_name, key_pair_name, user_data
    )

person stevebot    schedule 09.11.2011    source источник
comment
Вы действительно можете назначать теги во время создания экземпляра - см. мой ответ: stackoverflow.com/a/43723682/4988742   -  person Dmitry Tokarev    schedule 08.06.2017


Ответы (4)


Этот ответ был точным в то время, когда он был написан, но сейчас он устарел. API-интерфейсы и библиотеки AWS (например, boto3) теперь могут принимать параметр «TagSpecification», который позволяет указывать теги при выполнении вызова «create_instances».


Теги не могут быть созданы до тех пор, пока экземпляр не будет создан. Несмотря на то, что функция называется create_instance, на самом деле она выполняет резервирование и создание экземпляра. Затем этот экземпляр может быть запущен или не запущен. (обычно так, но иногда...)

Таким образом, вы не можете добавить тег, пока он не будет запущен. И нет способа узнать, был ли он запущен, без опроса. Вот так:

reservation = conn.run_instances( ... )

# NOTE: this isn't ideal, and assumes you're reserving one instance. Use a for loop, ideally.
instance = reservation.instances[0]

# Check up on its status every so often
status = instance.update()
while status == 'pending':
    time.sleep(10)
    status = instance.update()

if status == 'running':
    instance.add_tag("Name","{{INSERT NAME}}")
else:
    print('Instance status: ' + status)
    return None

# Now that the status is running, it's not yet launched. The only way to tell if it's fully up is to try to SSH in.
if status == "running":
    retry = True
    while retry:
        try:
            # SSH into the box here. I personally use fabric
            retry = False
        except:
            time.sleep(10)

# If we've reached this point, the instance is up and running, and we can SSH and do as we will with it. Or, there never was an instance to begin with.
person Craig Ferguson    schedule 24.05.2012
comment
Дополнением к этому решению может быть использование conn.create_tags(instance_id_list,tag_dict), который позволяет добавлять несколько тегов к нескольким (уже созданным!) экземплярам с помощью одной команды. - person dgh; 03.03.2013
comment
Цикл опроса не нужен; вы можете установить теги, пока экземпляр все еще находится в статусе pending. - person Chris Martin; 19.11.2015
comment
Я хочу добавить к комментарию @ChrisMartin: вы действительно не хотите ждать, пока экземпляр будет запущен, прежде чем добавлять теги; вы хотите добавить их как можно скорее, потому что, если у вас есть сценарии cloud-init или пользовательских данных, которые действуют на значения тегов, вы хотите убедиться, что теги существуют до запуска этих сценариев запуска. - person grayaii; 19.11.2015
comment
Это устаревший ответ. Вы действительно можете назначать теги во время создания экземпляра - см. мой ответ: stackoverflow.com/a/43723682/4988742 - person Dmitry Tokarev; 11.05.2017

Вы можете пометить экземпляр или том при создании

Из документов run_instances:

Вы можете пометить экземпляры и тома EBS во время запуска, после запуска или в обоих случаях. Дополнительные сведения см. в разделах CreateTags и Тегирование ресурсов Amazon EC2.

Документ AWS Использование тегов содержит таблицу с ресурсами, поддерживающими тегирование и поддержку пометка при создании (с 01 мая 2017 г. поддерживается как экземпляр, так и том EBS)

Вот фрагмент кода для пометки экземпляра во время создания в Python (другие ссылки на SDK перечислены на эта страница):

from pkg_resources import parse_version
import boto3
assert parse_version(boto3.__version__) >= parse_version('1.4.4'), \
    "Older version of boto3 installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U boto3>=1.4.4'".format(boto3.__version__)
import botocore
assert parse_version(botocore.__version__) >= parse_version('1.5.63'), \
   "Older version of botocore installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U botocore>=1.5.63'".format(botocore.__version__)
ec2 = boto3.resource('ec2')
tag_purpose_test = {"Key": "Purpose", "Value": "Test"}
instance = ec2.create_instances(
    ImageId=EC2_IMAGE_ID,
    MinCount=1,
    MaxCount=1,
    InstanceType=EC2_INSTANCE_TYPE,
    KeyName=EC2_KEY_NAME,
    SecurityGroupIds=[EC2_DEFAULT_SEC_GROUP],
    SubnetId=EC2_SUBNET_ID,
    TagSpecifications=[{'ResourceType': 'instance',
                        'Tags': [tag_purpose_test]}])[0]

я использовал

Python 2.7.13
boto3 (1.4.4)
botocore (1.5.63)
person Dmitry Tokarev    schedule 01.05.2017
comment
@Zulu, не могли бы вы поделиться своим фрагментом кода и версиями libs? Интересно, изменились ли определения API с более новыми версиями libs. - person Dmitry Tokarev; 05.06.2017
comment
@Zulu у вас определенно более старая версия boto3. Я вижу, что старый boto3 не поддерживает TagSpecifications для функции create_instances. обновите boto3: pip install -U boto3›=1.4.4 и повторите попытку. - person Dmitry Tokarev; 08.06.2017
comment
Получил ту же ошибку (Unknown parameter in input: "TagSpecifications"), и я использую Boto3 1.4.4. Тот же код работал несколько месяцев назад, поэтому я думаю, что они могли что-то изменить на стороне AWS. Я вижу, что TagSpecifications упоминаются в документах (boto3.readthedocs.io/en/latest/reference/services/). - person np8; 17.07.2017
comment
@ np8, не могли бы вы поделиться фрагментом своего кода? Вы пытались просто использовать AWS-CLI? (также проверьте установленную версию) Интересно, какие другие различия могут вызвать разницу ... Я столкнулся с вашей проблемой только со старой версией boto3. - person Dmitry Tokarev; 17.07.2017
comment
@np8 также убедитесь, что ваш botocore >= 1.5.63 (последняя версия 1.5.83) - person Dmitry Tokarev; 17.07.2017
comment
Пробовал с botocore 1.5.84, ошибок не было. Спасибо! - person np8; 18.07.2017
comment
@np8 ура! рад помочь - person Dmitry Tokarev; 18.07.2017
comment
@Zulu .. Я добавил тег для моментального снимка тома, но продолжаю поднимать «это недопустимый тип ресурса с тегами для этой операции». Я пробовал volid, где переменная содержит фактический volid, а также snap, но все с похожей ошибкой. Ниже приведен вариант с volid как resourceType snap=ec2.create_snapshot(VolumeId=volid,Description=instancename+/+instanceid+/+volid,DryRun=False,TagSpecifications=[{'ResourceType':volid, 'Tags':[vol_name_tag]} ]) - person Telebh; 13.04.2021

Используя boto 2.9.6, я могу добавлять теги к экземпляру сразу после получения ответа от run_instances. Что-то вроде этого работает без сна:

reservation = my_connection.run_instances(...)
for instance in reservation.instances:
    instance.add_tag('Name', <whatever>)

Я убедился, что экземпляр все еще находится в состоянии ожидания после успешного добавления тега. Было бы легко обернуть эту логику в функцию, аналогичную той, что запрашивалась в исходном посте.

person bobchase    schedule 02.07.2013

Этот метод работал для меня:

rsvn = image.run(
  ... standard options ...
)

sleep(1)

for instance in rsvn.instances:
   instance.add_tag('<tag name>', <tag value>)
person Zack Bloom    schedule 09.11.2011
comment
да, это то, что в настоящее время должен делать мой код, но, как указано в вопросе, я ищу способ либо предварительно настроить теги, либо включить их в команду create_instance. - person stevebot; 10.11.2011
comment
@stevebot Почему? В чем этот метод недостаточен? - person Zack Bloom; 10.11.2011
comment
У вас есть сон (1), который, как я предполагаю, предназначен для того, чтобы экземпляр загружался и настраивался. Что, если этого никогда не произойдет или потребуется больше времени? Это означает больше кода. Было бы гораздо лучше иметь уже позаботившуюся о конфигурации и не беспокоиться о зависших экземплярах в этом случае. - person stevebot; 10.11.2011
comment
@ZackBloom, stevebot прав, этот фрагмент зависит от запуска экземпляра в течение фиксированного периода времени. - person dgh; 03.03.2013
comment
Слон в комнате здесь заключается в том, что организации должны иметь возможность ограничивать, какой набор ресурсов может контролировать конкретный человек, и они хотят сделать это с помощью тегов на уровне ресурсов EC2. Однако, чтобы пометить инстанс EC2 тегом 'dev', вам нужно сделать это после запуска, а это означает, что у вас должно быть разрешение на создание/изменение тегов. Если у вас есть эти разрешения, вы можете эффективно обойти любые ограничения на основе тегов. Неудачная Уловка-22. - person jarmod; 25.02.2015
comment
Да, я сделал что-то подобное, но с циклом, ожидающим, пока статус экземпляра станет «работающим». Однако способ сделать это в run_instances() - это то, что мне нужно. - person Phil; 18.12.2020