Wie markieren und benennen Sie die EC2-Instanz, die durch eine EC2-Spot-Anforderung gestartet wurde?

8

Ich habe ein paar EC2-Spot-Anfragen, die EC2-Instanzen starten, wenn der Preis stimmt. Ich möchte, dass die resultierenden Instanzen mit einem Nameund einem RoleTag versehen werden, damit mein Konfigurationsverwaltungstool weiß, um welchen Maschinentyp es sich handelt.

UPDATE :

Ich habe den Rat von Hyper Anthony befolgt und implementiert. Da das Abrufen fehleranfällig und ressourcenintensiv sein würde, habe ich meinem AMI ein Startskript hinzugefügt, das die Tags beim Start einer Instanz aktualisiert. Dies sind die Schritte, die ich unternommen habe:

Stellen Sie sicher, dass Boto auf dem von Ihnen verwendeten AMI installiert ist

pip install boto

Weisen Sie der EC2-Instanz eine IAM-Rolle zu

Die Instanz, die Sie starten, muss über eine Möglichkeit verfügen, auf Informationen zur Spot-Anfrage zuzugreifen. Verwenden Sie eine IAM-Rolle oder stellen Sie Ihrer Instanz alternativ Zugriffsschlüssel zur Verfügung. Die Richtlinie, die ich an die von mir verwendete IAM-Rolle angehängt habe, lautet:

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

Führen Sie beim Start ein Skript aus, um die Tags zu aktualisieren

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
quelle

Antworten:

10

Spotinstanzanforderungen sind eine Art EC2-Ressource. In der AWS-Dokumentation wird darauf hingewiesen, dass dieser Ressourcentyp mit Tags versehen werden kann, die resultierenden Tags jedoch nicht auf die tatsächlichen Instanzen übertragen werden:

Die Tags, die Sie für Ihre Spot Instance-Anforderungen erstellen, gelten nur für die Anforderungen. Diese Tags werden nicht automatisch zu der Spot-Instanz hinzugefügt, die der Spot-Dienst startet, um die Anforderung zu erfüllen. Sie müssen einer Spot-Instanz selbst Tags hinzufügen, wenn Sie die Spot-Instanz-Anforderung erstellen oder nachdem die Spot-Instanz gestartet wurde.

Sie müssen die Tags also hinzufügen, nachdem die Instanzen gestartet wurden. Sie haben hier einige Möglichkeiten:

  • Benutzerdatenskript für die erstellte Instanz: Schreiben Sie ein Benutzerdatenskript, das Befehlszeilentools und den EC2-Metadatendienst verwendet , damit die Instanz ihre Instanz-ID ermitteln und Tags für sich selbst erstellen kann. Mit den AWS CLI- Erstellungs-Tags können Sie alle Ihre EC2-Ressourcen mit Tags versehen . Alternativ können Sie dies als Startskript für jedes Betriebssystem, das Sie verwenden möchten, in AMI einbinden. In beiden Situationen muss die Instanz über ausreichende Berechtigungen verfügen , um EC2-Tags für sich selbst zu erstellen.
  • Externes Dienstprogramm zur Überwachung Ihrer Spot-Anfrage: Sie können eines der AWS SDKs verwenden, um Ihre Spot-Anfrage zu überwachen und die Instanzen zu kennzeichnen, sobald sie erstellt wurden. AWS bietet ein Tutorial zu diesem Thema unter der Überschrift "So kennzeichnen Sie Ihre Spot-Anforderungen und -Instanzen". Ohne zu ausführlich zu werden, müssen lediglich Describe Spot Instance Requests abgefragt werden, bis eine erstellte Instanz-ID verfügbar ist, und anschließend Create Tags aufgerufen werden .
Anthony Neace
quelle
1

Eine andere Möglichkeit besteht darin, Ansible als Konfigurationsmanagement-Tool zu verwenden. Im ec2-Modul, mit dem Sie sowohl Spot- als auch normale Lebenszyklusinstanzen starten können, können Sie die Attribute "instance_tags" hinzufügen, um die Tags zu erstellen. Ein einfaches Spielbuch wäre:


  - 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

Interessanterweise beschwere ich mich, dass es nur die Instanz und nicht die Spot-Anfrage markiert, das Gegenteil von Ihrem Problem.

Freiheit
quelle
Wenn diese ansible Spot-Anfrage abläuft. Die Spot-Anfrage lebt in AWS weiter, aber was passiert, wenn ansible nicht mehr aktiv ist, um die Instanz zu markieren, sobald sie aktiv ist? Je nachdem, wie der Rest des Playbooks mit Instanzen ohne Tags umgeht, kann dies zu "Zombie" -Instanzen führen?
t1m0