¿Cómo etiqueta y nombra la instancia de EC2 que se lanzó mediante una solicitud de EC2 Spot?

8

Tengo un par de solicitudes de EC2 Spot que lanzan instancias de EC2 cuando el precio es correcto. Me gustaría que las instancias resultantes se etiqueten con una Namey una Roleetiqueta para que mi herramienta de administración de configuración sepa qué tipo de máquina es.

ACTUALIZACIÓN :

Tomé el consejo de Hyper Anthony y lo implementé, porque la encuesta iba a ser propensa a errores y requeriría muchos recursos. Agregué un script de inicio a mi AMI que actualiza las etiquetas cuando se inicia una instancia, estos son los pasos que tomé:

Asegúrese de que Boto esté instalado en cualquier AMI que esté utilizando

pip install boto

Asigne un rol de IAM a la instancia EC2

La instancia que está iniciando debe tener alguna forma de acceder a la información sobre la solicitud puntual. Use un rol de IAM o, alternativamente, haga que las claves de acceso estén disponibles para su instancia. La política que adjunté al rol de IAM que utilicé es:

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

Ejecute un script en el inicio para actualizar las etiquetas

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
fuente

Respuestas:

10

Las solicitudes de instancias puntuales son un tipo de recurso EC2. La documentación de AWS señala que este tipo de recurso se puede etiquetar , pero las etiquetas resultantes no se transfieren a las instancias reales:

Las etiquetas que cree para sus solicitudes de Instancia puntual solo se aplican a las solicitudes. Estas etiquetas no se agregan automáticamente a la instancia de Spot que el servicio de Spot inicia para cumplir con la solicitud. Debe agregar etiquetas a una instancia de Spot usted mismo cuando cree la solicitud de instancia de Spot o después de que se inicie la instancia de Spot.

Por lo tanto, deberá agregar las etiquetas después de que se hayan lanzado las instancias. Tienes algunas opciones aquí:

  • Script de datos de usuario en la instancia creada: escriba un script de datos de usuario que use herramientas de línea de comandos y el servicio de metadatos EC2 para permitir que la instancia descubra su Id de instancia y cree etiquetas por sí misma. Puede usar las etiquetas de creación de la CLI de AWS para etiquetar cualquiera de sus recursos EC2. Alternativamente, puede incluir esto en el AMI como un script de inicio para cualquier sistema operativo que desee utilizar. En cualquier situación, la instancia tendrá que tener permisos suficientes para crear etiquetas EC2 por sí misma.
  • Utilidad externa que supervisa su solicitud puntual: puede utilizar uno de los SDK de AWS para supervisar su solicitud puntual y etiquetar las instancias una vez que se hayan creado. AWS tiene un tutorial sobre este mismo tema bajo el encabezado "Cómo etiquetar sus solicitudes e instancias puntuales". Sin ser demasiado detallado, esto simplemente implica sondear Describir solicitudes de instancias puntuales hasta que un ID de instancia creado esté disponible, y luego llamar a Crear etiquetas .
Anthony Neace
fuente
1

Otra posibilidad es usar Ansible como su herramienta de administración de configuración. En el módulo ec2, que le permite iniciar instancias de ciclo de vida normales y puntuales, puede agregar los atributos "instance_tags" para crear las etiquetas. Un libro de jugadas simple sería:


  - 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, mi queja es que solo etiqueta la instancia y no etiqueta la solicitud puntual, lo contrario de su problema.

libertad
fuente
Si esta solicitud de lugar ansible se agota. La solicitud de spot permanece dentro de AWS, pero ¿qué sucede si ansible ya no está vivo para etiquetar la instancia una vez que está activa? Dependiendo de cómo el resto del libro de jugadas maneja instancias sin etiquetar, ¿podría conducir a instancias "zombies"?
t1m0