Как вы помечаете и называете экземпляр EC2, который был запущен спотовым запросом EC2?

8

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

ОБНОВЛЕНИЕ :

Я воспользовался советом Hyper Anthony и реализовал его - поскольку опрос собирался быть подверженным ошибкам и ресурсоемким, я добавил в AMI сценарий запуска, который обновляет теги при запуске экземпляра. Вот шаги, которые я предпринял:

Убедитесь, что Boto установлен на любой AMI, который вы используете

pip install boto

Назначьте роль IAM для экземпляра EC2

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

{
    "Statement": [
        {
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeTags",
                "ec2:DescribeInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ],
            "Sid": "Stmt1432737176000"
        }
    ],
    "Version": "2012-10-17"
}

Запустите скрипт при запуске, чтобы обновить теги

def get_tags_from_spot_request():

    instance_id = boto.utils.get_instance_identity()['document']['instanceId']
    region = boto.utils.get_instance_identity()['document']['region']
    conn = boto.ec2.connect_to_region(region)
    inst = boto.ec2.instance.Instance(connection=conn)
    inst.id = instance_id
    inst.update()
    spot_id = inst.spot_instance_request_id
    tags = conn.get_all_tags(filters={'resource-type': 'spot-instances-request', 'resource-id': spot_id})
    for tag in tags:
        inst.add_tag(tag.name, tag.value)
c4urself
источник

Ответы:

10

Запросы точечных экземпляров являются типом ресурса EC2. В документации AWS отмечается, что этот тип ресурса может быть помечен , но полученные теги не переносятся на фактические экземпляры:

Теги, которые вы создаете для запросов Spot Instance, применяются только к запросам. Эти теги не добавляются автоматически в экземпляр Spot, который запускается сервисом Spot для выполнения запроса. Вы должны добавить теги в точечный экземпляр самостоятельно, когда создаете запрос точечного экземпляра или после запуска точечного экземпляра.

Поэтому вам нужно добавить теги после запуска экземпляров. У вас есть несколько вариантов здесь:

  • Сценарий пользовательских данных на созданном экземпляре: напишите сценарий пользовательских данных, который использует инструменты командной строки и службу метаданных EC2, чтобы позволить экземпляру обнаруживать свой идентификатор экземпляра и создавать теги для себя. Вы можете использовать теги создания интерфейса командной строки AWS, чтобы пометить любой из ваших ресурсов EC2. В качестве альтернативы, вы можете вставить это в AMI в качестве сценария запуска для любой ОС, которую вы собираетесь использовать. В любом случае экземпляр должен иметь достаточные разрешения для создания тегов EC2 для себя.
  • Внешняя утилита, которая отслеживает ваш запрос на выборку. Вы можете использовать один из пакетов AWS SDK, чтобы отслеживать запрос на выборку и отмечать экземпляры после их создания. По этой теме в AWS есть учебник под заголовком «Как пометить ваши спотовые запросы и экземпляры». Не становясь слишком многословным, это просто включает в себя опрос Describe Spot Instance Requests до тех пор, пока не будет создан созданный Instance Id, а затем вызовет Create Tags .
Энтони Нис
источник
1

Другой возможностью является использование Ansible в качестве инструмента управления конфигурацией. В модуле ec2, который позволяет запускать как точечные, так и обычные экземпляры жизненного цикла, вы можете добавить атрибуты «instance_tags» для создания тегов. Простая пьеса будет:


  - name: Provision Spot Instance
    hosts: localhost
    connection: local
    gather_facts: False
    tasks:
      - name: Launch the new Spot Instance
        local_action:
          module: ec2
          spot_price: 0.02
          group: testSG
          instance_type: m3.medium
          image: ami-12345
          wait: true
          instance_tags:
            Name: TagValueForName
            Foo: TagValueForFoo
          region: us-east-1
          keypair: mykeypair

Интересно, что моя жалоба заключается в том, что он помечает только экземпляр, а не местный запрос, что противоположно вашей проблеме.

efreedom
источник
Если время ожидания этого ответного запроса истекло. Спотовый запрос находится внутри AWS, но что произойдет, если ansible больше не будет активен, чтобы пометить экземпляр, как только он будет запущен? В зависимости от того, как остальная часть playbook обрабатывает нетегированные экземпляры, может привести к появлению «зомби»?
t1m0