Como você identifica e nomeia a instância do EC2 que foi iniciada por uma solicitação de ponto do EC2?

8

Tenho algumas solicitações spot EC2 que iniciam instâncias EC2 quando o preço é justo. Gostaria que as instâncias resultantes fossem etiquetadas com as tags Namee, Rolepara que minha ferramenta de gerenciamento de configuração saiba que tipo de máquina é.

ATUALIZAÇÃO :

Peguei o conselho do Hyper Anthony e o implementei - porque a pesquisa seria propensa a erros e consumia muitos recursos. Adicionei um script de inicialização à minha AMI que atualiza as tags quando uma instância é iniciada, estas são as etapas que eu executei:

Verifique se o Boto está instalado em qualquer AMI que você estiver usando

pip install boto

Atribuir uma função do IAM à instância do EC2

A instância que você está iniciando deve ter alguma maneira de acessar informações sobre a solicitação de spot. Use uma função IAM ou, alternativamente, disponibilize as chaves de acesso à sua instância. A política que anexei à função do IAM que usei é:

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

Execute um script na inicialização para atualizar as tags

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
fonte

Respostas:

10

Solicitações de instâncias spot são um tipo de recurso EC2. A documentação da AWS observa que esse tipo de recurso pode ser marcado , mas as tags resultantes não são transferidas para as instâncias reais:

As tags que você cria para suas solicitações de Instância Spot aplicam-se apenas às solicitações. Essas tags não são adicionadas automaticamente à Instância Spot que o serviço Spot inicia para atender à solicitação. Você deve adicionar tags a uma Instância Spot quando criar a solicitação de Instância Spot ou após o lançamento da Instância Spot.

Portanto, você precisará adicionar as tags após o lançamento das instâncias. Você tem algumas opções aqui:

  • Script de dados do usuário na instância criada: escreva um script de dados do usuário que use ferramentas de linha de comando e o serviço de metadados EC2 para permitir que a instância descubra seu ID de instância e crie tags para si mesma. Você pode usar as tags de criação da AWS CLI para marcar qualquer um dos seus recursos do EC2. Como alternativa, você pode incluir isso na AMI como um script de inicialização para qualquer sistema operacional que pretenda usar. Em qualquer uma das situações, a instância precisará ter permissões suficientes para criar tags EC2 para si mesma.
  • Utilitário externo que monitora sua solicitação de localização: você pode usar um dos AWS SDKs para monitorar sua solicitação de localização e marcar as instâncias depois que elas forem criadas. A AWS tem um tutorial sobre esse mesmo tópico no cabeçalho "Como marcar solicitações e instâncias spot". Sem ficar muito detalhado, isso envolve simplesmente pesquisar Descrever Solicitações de Instância Spot até que um ID de Instância criado esteja disponível e depois chamar Criar Tags .
Anthony Neace
fonte
1

Outra possibilidade é usar o Ansible como sua ferramenta de gerenciamento de configuração. No módulo ec2, que permite disparar instâncias spot e normal do ciclo de vida, você pode adicionar os atributos "instance_tags" para criar as tags. Um manual simples seria:


  - 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

Curiosamente, minha reclamação é que ela apenas codifica a instância e não codifica a solicitação pontual, o oposto do seu problema.

efreedom
fonte
Se esse pedido ansioso de ponto expirar. A solicitação local permanece na AWS, mas o que acontece se o ansible não estiver mais ativo para marcar a instância depois que ela terminar? Dependendo de como o restante do manual lida com instâncias não identificadas, pode levar a instâncias "zumbis"?
precisa saber é