Comment étiqueter et nommer l'instance EC2 qui a été lancée par une demande spot EC2?

8

J'ai quelques demandes ponctuelles EC2 qui lancent des instances EC2 lorsque le prix est correct. J'aimerais que les instances résultantes soient étiquetées avec une balise Nameet Roleafin que mon outil de gestion de configuration sache de quel type de machine il s'agit.

MISE À JOUR :

J'ai suivi les conseils d'Hyper Anthony et les ai mis en œuvre - parce que l'interrogation allait être source d'erreurs et gourmande en ressources, j'ai ajouté un script de démarrage à mon AMI qui met à jour les balises lors du lancement d'une instance, voici les étapes que j'ai suivies:

Assurez-vous que Boto est installé sur l'AMI que vous utilisez

pip install boto

Attribuer un rôle IAM à l'instance EC2

L'instance que vous lancez doit avoir un moyen d'accéder aux informations sur la demande spot. Utilisez un rôle IAM ou mettez les clés d'accès à la disposition de votre instance. La stratégie que j'ai attachée au rôle IAM que j'ai utilisé est la suivante:

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

Exécutez un script au démarrage pour mettre à jour les balises

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)
c4ourself
la source

Réponses:

10

Les demandes d'instances ponctuelles sont un type de ressource EC2. La documentation AWS note que ce type de ressource peut être balisé , mais les balises résultantes ne sont pas reportées sur les instances réelles:

Les balises que vous créez pour vos demandes d'instance Spot s'appliquent uniquement aux demandes. Ces balises ne sont pas ajoutées automatiquement à l'instance Spot que le service Spot lance pour répondre à la demande. Vous devez ajouter vous-même des balises à une instance Spot lorsque vous créez la demande d'instance Spot ou après le lancement de l'instance Spot.

Vous devrez donc ajouter les balises après le lancement des instances. Vous avez quelques options ici:

  • Script de données utilisateur sur l'instance créée: rédigez un script de données utilisateur qui utilise les outils de ligne de commande et le service de métadonnées EC2 pour permettre à l'instance de découvrir son ID d'instance et de créer des balises pour elle-même. Vous pouvez utiliser les AWS CLI create-tags pour baliser n'importe laquelle de vos ressources EC2. Vous pouvez également l'intégrer dans l'AMI en tant que script de démarrage pour le système d'exploitation que vous souhaitez utiliser. Dans les deux cas, l'instance devra disposer des autorisations suffisantes pour créer des balises EC2 pour elle-même.
  • Utilitaire externe qui surveille votre demande spot: vous pouvez utiliser l'un des kits SDK AWS pour surveiller votre demande spot et baliser les instances une fois qu'elles ont été créées. AWS propose un didacticiel sur ce sujet sous l'en-tête "Comment baliser vos requêtes et instances ponctuelles". Sans être trop verbeux, cela implique simplement d'interroger la description des demandes d'instance ponctuelle jusqu'à ce qu'un ID d'instance créé soit disponible, puis d'appeler Créer des balises .
Anthony Neace
la source
1

Une autre possibilité est d'utiliser Ansible comme outil de gestion de configuration. Dans le module ec2, qui vous permet de lancer des instances de cycle de vie ponctuelles et normales, vous pouvez ajouter les attributs "instance_tags" pour créer les balises. Un livre de jeu simple serait:


  - 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

Chose intéressante, ma plainte est qu'elle ne marque que l'instance et ne marque pas la demande ponctuelle, contrairement à votre problème.

liberté
la source
Si cette demande de spot ansible expire. La demande ponctuelle persiste dans AWS, mais que se passe-t-il si ansible n'est plus en vie pour baliser l'instance une fois qu'elle est active? Selon la façon dont le reste du manuel gère les instances non marquées, peut-il conduire à des instances "zombies"?
t1m0