Boto EC2: создание экземпляра с тегами - PullRequest
21 голосов
/ 09 ноября 2011

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

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

Ответы [ 4 ]

24 голосов
/ 24 мая 2012

Метки не могут быть сделаны, пока экземпляр не был создан.Несмотря на то, что функция называется 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.
6 голосов
/ 01 мая 2017

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

Из run_instances docs :

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

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

Ниже приведен фрагмент кода для экземпляра тега во время создания в 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)
3 голосов
/ 02 июля 2013

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

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

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

0 голосов
/ 09 ноября 2011

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

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

sleep(1)

for instance in rsvn.instances:
   instance.add_tag('<tag name>', <tag value>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...