2015-12-16 4 views
0

с помощью сервиса AWS Boto3 ресурсов я получаю список все мой экземпляра ec2:Python AWS boto3 список экземпляров постоянно обновляется

ec2_instances = ec2.instances.all() 

каждый раз, когда я делаю что-то, используя мой переменную `ec2_instance» - это швы перезагружать весь список экземпляров ..

есть ли способ, чтобы просто вытащить список один раз, а затем работать над ней (фильтром и такой)

примера того, что я делаю:

получение списка и показывать его в меню после фильтрации несколько значений:

В моем Аусе() Класс:

def load_ec2_instance(self, region): 
    """ 
    Load the EC2 instances a region 
    :param region: 
    :rtype: list 
    :return: a list of the instances in a region or None if there are no instances 
    """ 
    ec2 = self._get_resource("ec2", region) 
    ec2_instances = ec2.instances.all() 
    counter = collections.Counter(ec2_instances); 
    ec2_size = sum(counter.itervalues()); 
    if ec2_size == 0: 
     return None 
    return ec2_instances 

в моем модуле меню:

 instances = Aws.get_instance().load_ec2_instance(chosen_region) 
     show_environments_menu(instances) 

     def show_environments_menu(instances): 
      subprocess.call("clear") 
      print "Please choose the environment your instance is located in:" 
      environments = Aws.get_instance().get_environments_from_instances(instances) 
      for i, environment in enumerate(environments): 
       print "%d. %s" % (i + 1, environment) 

     def get_environments_from_instances(self, instances): 
     """ 
     Get all the environments available from instances lists 
     :param list instances: the list of instance 
     :rtype: list 
     :return: a list of the environments 
     """ 
     environments = [] 
     for instance in instances: 
      tags = instance.tags 
      for tag in tags: 
       key = tag.get("Key") 
       if key == "Environment": 
        environment = tag.get("Value").strip() 
        if environment not in environments: 
         environments.append(environment) 
     return environments 

Это занимает время, в зависимости на моем подключении к Интернету, но я вижу, что когда я отключу свой интернет - он не может фильтровать. У меня только 12 экземпляров, поэтому цикл для их фильтрации не должен занимать время вообще.

Update: Я изменил AWS() класс модуля и я использую эти две функции:

def load_ec2_instances(region): 
    """ 
    Load the EC2 instances a region 
    :param region: 
    :rtype: list 
    :return: a list of the instances in a region or None if there are no instances 
    """ 
    ec2 = _get_resource("ec2", region) 
    ec2_instances = ec2.instances.all() 
    counter = collections.Counter(ec2_instances); 
    ec2_size = sum(counter.itervalues()); 
    if ec2_size == 0: 
     return None 
    return ec2_instances 


def get_environments_from_instances(instances): 
    """ 
    Get all the environments available from instances lists 
    :param list instances: the list of instance 
    :rtype: list 
    :return: a list of the environments 
    """ 
    environments = [] 
    for instance in instances: 
     tags = instance.tags 
     for tag in tags: 
      key = tag.get("Key") 
      if key == "Environment": 
       environment = tag.get("Value").strip() 
       if environment not in environments: 
        environments.append(environment) 
    return environments 
+0

Не могли бы вы уточнить? Что вы делаете с переменной ec2_instances? И почему, по вашему мнению, список перезагружается каждый раз? –

+0

да, я добавил пример на мой вопрос –

+0

Не могли бы вы также разместить код для 'Aws.get_instance()'? Я думаю, что проблема может быть в этой строке 'environment = Aws.get_instance(). Get_environments_from_instances (экземпляры)' –

ответ

0

Для тех, кто до сих пор стоящих перед этим вопросом

Попробуйте использовать клиент EC2, а не ресурс. Ресурсы в boto3 являются более высоким уровнем и делают больше работы для вас, тогда как клиент просто дает вам то, что вы просите об этом.

Когда вы используете клиента, вы получаете объекты словаря python, которые вы можете манипулировать в памяти вашим содержанием. См. Пример ниже. Вы можете отредактировать это, чтобы использовать методы и методы списка и т. Д.

См. EC2.Client.describe_instances для документации по методу клиента ec2 для описания экземпляров ec2.

import boto3 
ec2 = boto3.client("ec2", region_name = 'us-west-2') 
reservations = ec2.describe_instances()['Reservations'] 
instances = [] 
for reservation in reservations: 
    for instance in reservation['Instances']: 
     instances.append(instance) 

environments = [] 
for instance in instances: 
    for tag in instance['Tags']: 
     if tag['Key'] == 'Environment': 
      environments.append(tag['Value']) 

 Смежные вопросы

  • Нет связанных вопросов^_^