Итерация не работает в Lambda, так как я хочу запустить Lambda в двух регионах, перечисленных в коде - PullRequest
0 голосов
/ 28 ноября 2018

Привет, у меня есть эта простая лямбда-функция, которая останавливает все экземпляры EC-2, помеченные Auto_off.Я установил цикл for, чтобы он работал для двух регионов: us-east-1 и us-east-2.Я запускаю функцию в регионе us-east-2.

проблема в том, что только экземпляр, расположенный в us-east2, останавливается, а другой - нет (находится в us-east-1).какие изменения я могу сделать.

, пожалуйста, предложите, поскольку я новичок в библиотеке питона и бото

import boto3
import logging

#setup simple logging for INFO
logger = logging.getLogger()
logger.setLevel(logging.INFO)

#define the connection
ec2 = boto3.resource('ec2')

client = boto3.client('ec2', region_name='us-east-1')

ec2_regions = ['us-east-1','us-east-2']

for region in ec2_regions:
conn = boto3.resource('ec2',region_name=region)

def lambda_handler(event, context): 
# Use the filter() method of the instances collection to retrieve
# all running EC2 instances.
filters = [{
        'Name': 'tag:AutoOff',
        'Values': ['True']
    },
    {
        'Name': 'instance-state-name', 
        'Values': ['running']
    }
]

#filter the instances
instances = ec2.instances.filter(Filters=filters)

#locate all running instances
RunningInstances = [instance.id for instance in instances]

#print the instances for logging purposes
#print RunningInstances 

#make sure there are actually instances to shut down. 
if len(RunningInstances) > 0:
    #perform the shutdown
    shuttingDown = ec2.instances.filter(InstanceIds=RunningInstances).stop()
    print shuttingDown
else:
    print "Nothing to see here"

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы создаете 2 экземпляра ресурса ec2 и 1 экземпляр клиента ec2.Вы используете только один экземпляр ресурса ec2 и не используете клиент вообще.Вы также устанавливаете регион в вашем цикле на объекте ресурса, отличном от того, который вы фактически используете.

Измените все это:

ec2 = boto3.resource('ec2')

client = boto3.client('ec2', region_name='us-east-1')

ec2_regions = ['us-east-1','us-east-2']

for region in ec2_regions:
conn = boto3.resource('ec2',region_name=region)

На это:

ec2_regions = ['us-east-1','us-east-2']
for region in ec2_regions:
    ec2 = boto3.resource('ec2',region_name=region)

Кроме того, ваши отступы в коде вашего вопроса неверны.Я надеюсь, что это просто проблема копирования / вставки, а не то, как ваш код действительно имеет отступ, потому что отступы - это синтаксис в Python.

0 голосов
/ 28 ноября 2018

Цикл, который вы здесь делаете

ec2_regions = ['us-east-1','us-east-2']
for region in ec2_regions:
    conn = boto3.resource('ec2',region_name=region)

Сначала присваиваете us-east-1 переменной conn, а на втором шаге перезаписываете ее us-east-2, а затем вводит в вашу функцию.

Итак, вы можете поместить этот цикл в вашу функцию и выполнить текущее определение функции внутри этого цикла.

...