2011-11-09 12 views
21

C'è un modo con l'API boto python per specificare i tag quando si crea un'istanza? Sto cercando di evitare di dover creare un'istanza, recuperarla e quindi aggiungere tag. Sarebbe molto più facile avere l'istanza sia pre-configurato per avere alcuni tag o per specificare i tag quando eseguo il seguente comando:Boto EC2: creare un'istanza con i tag

ec2server.create_instance(
     ec2_conn, ami_name, security_group, instance_type_name, key_pair_name, user_data 
    ) 
+0

Puoi effettivamente assegnare tag ad esempio creare tempo - vedi la mia risposta: https://stackoverflow.com/a/43723682/4988742 –

risposta

24

Tag non può essere creato fino a quando l'istanza non è stata creata. Anche se la funzione è chiamata create_instance, ciò che sta facendo è riservare e istanza. Quindi l'istanza potrebbe o non essere avviata. (Di solito lo è, ma a volte ...)

Quindi, non è possibile aggiungere un tag finché non è stato avviato. E non c'è modo di sapere se è stato lanciato senza eseguire il polling. In questo modo:

reservation = conn.run_instances(...) 

# NOTE: this isn't ideal, and assumes you're reserving one instance. Use a for loop, ideally. 
instance = reservation.instances[0] 

# Check up on its status every so often 
status = instance.update() 
while status == 'pending': 
    time.sleep(10) 
    status = instance.update() 

if status == 'running': 
    instance.add_tag("Name","{{INSERT NAME}}") 
else: 
    print('Instance status: ' + status) 
    return None 

# Now that the status is running, it's not yet launched. The only way to tell if it's fully up is to try to SSH in. 
if status == "running": 
    retry = True 
    while retry: 
     try: 
      # SSH into the box here. I personally use fabric 
      retry = False 
     except: 
      time.sleep(10) 

# If we've reached this point, the instance is up and running, and we can SSH and do as we will with it. Or, there never was an instance to begin with. 
+3

Un supplemento a questa soluzione potrebbe essere l'uso di [conn.create_tags (instance_id_list, tag_dict)] (http://boto.readthedocs.org/en/latest/ref/ec2.html#boto.ec2.connection.EC2Connection.create_tags) che consente di aggiungere più tag a più istanze (già create!) con un solo comando. – dghubble

+2

Il ciclo di polling non è necessario; puoi impostare i tag mentre un'istanza è ancora nello stato 'in sospeso'. –

+0

Voglio aggiungere al commento @ChrisMartin: Non vuoi davvero aspettare che l'istanza sia in esecuzione prima di aggiungere i tag; si desidera aggiungerli al più presto, perché se si dispone di script cloud-init o di dati utente che agiscono sui valori dei tag, si desidera assicurarsi che i tag siano presenti prima dell'esecuzione di questi script di avvio. – grayaii

0

Questo metodo ha funzionato per me:

rsvn = image.run(
    ... standard options ... 
) 

sleep(1) 

for instance in rsvn.instances: 
    instance.add_tag('<tag name>', <tag value>) 
+1

sì, questo è ciò che il mio codice attualmente deve fare, ma come la domanda dichiarata, sto cercando per un modo di preconfigurare i tag o includerli nel comando create_instance. – stevebot

+0

@stevebot Perché? In che modo questo metodo è insufficiente? –

+1

Si ha un sonno (1) che presumo sia così l'istanza si avvierà e sarà configurata. Cosa succede se questo non accade mai o richiede più tempo? Ciò significa più codice. Sarebbe molto più bello avere la configurazione già curata e non doversi preoccupare delle istanze bloccate in questo caso. – stevebot

3

Utilizzando boto 2.9.6, sono in grado di aggiungere tag a un'istanza subito dopo ottenere la mia risposta indietro da run_instances. Qualcosa di simile funziona senza dormire:

reservation = my_connection.run_instances(...) 
for instance in reservation.instances: 
    instance.add_tag('Name', <whatever>) 

Ho verificato che l'istanza era ancora in sospeso dopo aver aggiunto correttamente il tag. Sarebbe facile racchiudere questa logica in una funzione simile a quella richiesta dal post originale.

2

You can tag instance or volume on creation

Da run_instances docs:

È possibile contrassegnare le istanze e dei volumi EBS durante il lancio, dopo il lancio, o di entrambi. Per ulteriori informazioni, vedere CreateTags e Tagging Your Amazon EC2 Resources.

Using Tags AWS doc comprende una tabella con le risorse di supporto tagging e supporto codifica sulla creazione (supporto Volume grado e EBS sia come della 01-mag-2017)

Ecco un frammento di codice per tag di istanza al momento della creazione tempo in Python (altri riferimenti SDK sono elencati sul this page):

import boto3 
assert boto3.__version__ >= '1.4.4', \ 
    "Older version of boto3 installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U boto3>=1.4.4'".format(boto3.__version__) 
import botocore 
assert botocore.__version__ >= '1.5.63', \ 
    "Older version of botocore installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U botocore>=1.5.63'".format(botocore.__version__) 
ec2 = boto3.resource('ec2') 
tag_purpose_test = {"Key": "Purpose", "Value": "Test"} 
instance = ec2.create_instances(
    ImageId=EC2_IMAGE_ID, 
    MinCount=1, 
    MaxCount=1, 
    InstanceType=EC2_INSTANCE_TYPE, 
    KeyName=EC2_KEY_NAME, 
    SecurityGroupIds=[EC2_DEFAULT_SEC_GROUP], 
    SubnetId=EC2_SUBNET_ID, 
    TagSpecifications=[{'ResourceType': 'instance', 
         'Tags': [tag_purpose_test]}])[0] 

ho usato

Python 2.7.13 
boto3 (1.4.4) 
botocore (1.5.63) 
+1

''Parameter validation failed: parametro sconosciuto nell'input:" TagSpecifications ", deve essere uno di: DryRun, ImageId, MinCount ... ' – Zulu

+0

@Zulu potresti condividere lo snippet di codice e le versioni di libs? Mi chiedo se le definizioni API siano cambiate con le versioni più recenti di libs. –

+0

@Zulu hai sicuramente una versione precedente di boto3. Vedo più vecchio boto3 non supporta TagSpecifications per la funzione create_instances. aggiorna il tuo boto3: pip install -U boto3> = 1.4.4 e riprova. –

Problemi correlati