с помощью сервиса 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
Не могли бы вы уточнить? Что вы делаете с переменной ec2_instances? И почему, по вашему мнению, список перезагружается каждый раз? –
да, я добавил пример на мой вопрос –
Не могли бы вы также разместить код для 'Aws.get_instance()'? Я думаю, что проблема может быть в этой строке 'environment = Aws.get_instance(). Get_environments_from_instances (экземпляры)' –