Почему мой сценарий AWS Lambda возвращает «Экземпляры» вместо идентификатора экземпляра?

Ниже приведен мой скрипт Lambda, работа над которым выполняется для резервного копирования некоторых из моих экземпляров EC2. Я распечатал значение instanceId сразу после присваивания, и, к моему удивлению, он вернул строку «Instances», а не идентификатор экземпляра. Я проверил ожидаемый формат ответа здесь: http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Client.describe_instances, и я считаю, что делаю вызов правильно. Сначала я получаю только элемент Instances из списка (schedule_instances = schedulers ['Instances']), а затем пытаюсь получить идентификатор экземпляра из этого нового списка. Это верно? У меня также есть аналогичные сомнения по поводу получения VolumeId.

from __future__ import print_function
import json
import boto3
import datetime
import time

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    try:
        print("Creating snapshots on " + str(datetime.datetime.today()) + ".")
        schedulers = ec2.describe_instances(MaxResults=50, Filters=[{'Name':'tag:GL-sub-purpose', 'Values':['Schedule']}])
        print("Performing backup on " + str(len(schedulers)) + " schedules.")
        successful = []
        failed     = []
        schedule_instances = schedulers['Instances']
        for s in schedulers:
            try:
                instanceId=s['InstanceId']
                print (instanceId)
                snapshotDescription = instanceId + "-" + str(datetime.date.today().strftime('%Y-%m-%d')) + "-46130e7ac954-automated"
                ec2.create_snapshot(
                VolumeId=s['VolumeId'], 
                Description=snapshotDescription
                )
                successful.append(instanceId)
            except Exception as e:
                print(e)
                failed.append(instanceId + " :\t" + str(e))
        print("Performed backup on " + str(len(successful)) + " schedulers. Failed backup on " + str(len(failed)) + " schedulers. ")
        sendEmail(successful, failed)
        return "Success"
    except Exception as e:
        print(e)
        return "Failed"

person Rome_Leader    schedule 12.09.2016    source источник
comment
Вы хотите получить идентификаторы всех экземпляров, соответствующих фильтру? Есть гораздо более простой способ получить эту информацию.   -  person helloV    schedule 12.09.2016
comment
Моя цель - перебрать каждый экземпляр в списке с указанным мной тегом и создать для него снимок. Поэтому мне будет нужен идентификатор экземпляра для этого конкретного элемента при каждом запуске цикла.   -  person Rome_Leader    schedule 12.09.2016


Ответы (1)


Похоже, ваш раздел цикла for не проходит через значения Json Key.

Используйте следующий код для получения идентификаторов экземпляров с помощью Boto3

import boto3

ec2 = boto3.client('ec2')

schedulers = ec2.describe_instances(InstanceIds=['i-xxxxxxxx'])

for i in schedulers['Reservations']:
   print i['Instances'][0]['InstanceId']

Вы можете реализовать цикл for так же, как и в своем коде (если требуется несколько экземпляров, используйте цикл)

Надеюсь, это поможет.

person Ali    schedule 14.09.2016
comment
Ах, это привело меня в правильное русло. Пришлось сначала проанализировать словарь резервирования, а затем итоговый список резервирований. Спасибо за помощь! - person Rome_Leader; 14.09.2016