2015-12-16 1 views
0

en utilisant AWS Boto3 Service des ressources que je reçois une liste de toutes mes instance EC2:liste boto3 Python AWS des cas toujours mis à jour

ec2_instances = ec2.instances.all() 

chaque fois que je fais quelque chose en utilisant ma variable `ec2_instance » - il coutures pour recharger toute la liste instance ..

Est-il possible de simplement tirer la liste une fois, puis travailler dessus (filtre et tel)

exemple de ce que je fais:

obtenir la liste et le montrer comme un menu après filtrage des valeurs:

Dans ma classe Aws():

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 

dans mon module de menu:

 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 

Il faut du temps en fonction sur ma connexion internet, mais je vois que quand je déconnecte mon internet - il ne peut pas filtrer .. Je n'ai que 12 instances donc la boucle pour les filtrer ne devrait pas prendre du temps du tout ..

Mise à jour: J'ai changé Aws() classe au module et j'utilise ces deux fonctions:

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

Pourriez-vous élaborer? Que faites-vous avec la variable 'ec2_instances' et pourquoi pensez-vous que la liste est rechargée à chaque fois? –

+0

oui, j'ai ajouté un exemple à ma question –

+0

Pourriez-vous également écrire le code pour 'Aws.get_instance()'? Je pense que le problème peut être dans cette ligne 'environnements = Aws.get_instance(). Get_environments_from_instances (instances)' –

Répondre

0

Pour ceux qui posent encore cette question

Essayez d'utiliser le client EC2 plutôt que la Ressource. Les ressources dans boto3 sont de niveau supérieur et font plus de travail pour vous alors que le client vous donne juste ce que vous lui demandez. Lorsque vous utilisez le client, vous obtenez des objets de dictionnaire python que vous pouvez manipuler en mémoire dans votre contenu de cœur. Voir l'exemple ci-dessous. Vous pouvez modifier ceci pour utiliser la compréhension et les méthodes de liste, etc.

Voir EC2.Client.describe_instances pour la documentation sur la méthode client ec2 pour la description des instances 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'])