Подтвердить что ты не робот

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

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

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

Ответ 1

Теги не могут быть выполнены до тех пор, пока экземпляр не будет создан. Несмотря на то, что функция называется 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 not yet launched. The only way to tell if it 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.

Ответ 2

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

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

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

Ответ 3

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

От run_instances docs:

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

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

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

import boto3
assert boto3.__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 botocore.__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)

Ответ 4

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

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

sleep(1)

for instance in rsvn.instances:
   instance.add_tag('<tag name>', <tag value>)