2011-11-09 13 views
21

Czy istnieje sposób, aby API Boto Pythona określało tagi podczas tworzenia instancji? Próbuję uniknąć konieczności tworzenia instancji, pobierania jej, a następnie dodawania znaczników. Byłoby o wiele łatwiej mieć wystąpienie albo wstępnie skonfigurowany, aby mieć pewne znaczniki lub określić tagów, kiedy należy wykonać następujące polecenie:Boto EC2: Stwórz instancję z tagami

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

Rzeczywiście można przypisać znaczniki w momencie tworzenia instancji - zobacz moją odpowiedź: https://stackoverflow.com/a/43723682/4988742 –

Odpowiedz

24

tagi nie można wprowadzić, dopóki instancja nie zostanie utworzona. Mimo że funkcja nazywa się create_instance, to tak naprawdę robi rezerwację i instancję. Wtedy ta instancja może zostać uruchomiona lub nie. (Zwykle jest, ale czasami ...)

Nie można dodać tagu, dopóki nie zostanie uruchomiony. I nie ma sposobu, aby powiedzieć, czy został uruchomiony bez odpytywania. Tak:

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

Uzupełnieniem tego rozwiązania może być użycie [conn.create_tags (instance_id_list, tag_dict)] (http://boto.readthedocs.org/en/latest/ref/ec2.html#boto.ec2.connection.EC2Connection.create_tags), który pozwala dodawać wiele tagów do wielu (już stworzonych!) instancji za pomocą jednego polecenia. – dghubble

+2

Pętla odpytywania nie jest konieczna; możesz ustawić znaczniki, gdy instancja jest nadal w stanie 'oczekującym'. –

+0

Chcę dodać do komentarza @ChrisMartin: Naprawdę nie chcesz czekać na uruchomienie instancji przed dodaniem tagów; chcesz je dodać JAK NAJSZYBCIEJ, ponieważ jeśli masz skrypty inicjujące chmurę lub dane użytkownika, które działają na wartości znaczników, chcesz się upewnić, że znaczniki są tam przed uruchomieniem tych skryptów startowych. – grayaii

0

Metoda ta pracował dla mnie:

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

sleep(1) 

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

tak, to właśnie mój kod ma obecnie do zrobienia, ale jak to zostało zadane, szukam aby albo wstępnie skonfigurować tagi, albo uwzględnić je w komendzie create_instance. – stevebot

+0

@stevebot Dlaczego? W jaki sposób ta metoda jest niewystarczająca? –

+1

Masz sen (1), który zakładam, więc wystąpienie zostanie uruchomione i skonfigurowane. Co się stanie, jeśli to się nigdy nie wydarzy lub potrwa dłużej? Oznacza to więcej kodu. O wiele lepiej byłoby mieć już skonfigurowaną konfigurację i nie musieć w tym przypadku przejmować się zawieszonymi instancjami. – stevebot

3

Korzystanie boto 2.9.6, jestem w stanie dodać tagi do instancji niezwłocznie po otrzymaniu moją odpowiedź z powrotem z run_instances. Coś takiego działa bez snu:

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

Po pomyślnym dodaniu tagu zweryfikowałem, że instancja nadal była w stanie oczekiwania. Łatwo byłoby zawrzeć tę logikę w funkcji podobnej do tej, której wymaga oryginalny post.

2

You can tag instance or volume on creation

Od run_instances docs:

można oznaczyć instancje i woluminów EBS podczas startu, po uruchomieniu, lub obu. Aby uzyskać więcej informacji, zobacz CreateTags i Tagging Your Amazon EC2 Resources.

Using Tags AWS dokument zawiera tabelę z zasobami wspierania znakowania i wspierania znakowania na tworzenie (instancja i EBS wsparcia Volume zarówno jako z 01 maja 2017 r)

Oto fragment kodu oznaczyć wystąpienie na tworzenie czas Pythonie (SDK inne odnośniki wymienione w 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] 

kiedyś

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

''Weryfikacja parametru nie powiodła się: Nieznany parametr na wejściu:" TagSpecifications ", musi być jednym z: DryRun, ImageId, MinCount ... ' – Zulu

+0

@Zulu mógłbyś udostępnić swój fragment kodu i wersje bibliotek? Zastanawiam się, czy definicje interfejsu API zostały zmienione w nowszych wersjach bibliotek. –

+0

@ Zulu zdecydowanie masz starszą wersję boto3. Widzę, że starszy boto3 nie obsługuje funkcji TagSpecifications dla create_instances. zaktualizuj swój boto3: pip install -U boto3> = 1.4.4 i spróbuj ponownie. –

Powiązane problemy