2017-01-03 1 views
2

Voici la fonction Lambda, j'ai écrit que récupère la liste des groupes d'analyse dynamique et les imprime.AWS Lambda: Impossible d'importer le module 'lambda_function': Aucun module nommé boto.ec2.autoscale

import json 
import boto3 
import boto.ec2.autoscale 

role = "arn:aws:iam::XXXXXXXXXX:role/lambda-autoshutdown-role" 
regions = ["eu-central-1"] 
autoscaling = boto3.client('autoscaling') 


class App(object): 
    def __init__(self,RoleArn): 
    self.RoleArn = RoleArn 

    if self.RoleArn != "local": 
     sts_client = boto3.client('sts') 
     self.sts = sts_client.assume_role(
     RoleArn=self.RoleArn, 
     RoleSessionName="lambda_poweroff")["Credentials"] 

    def get_resource(self,region="eu-central-1"): 
     if self.RoleArn == "local": 
     return boto3.resource(region_name=region) 
     else: 
     return boto.ec2.autoscale.connect_to_region(
      region_name=region, 
      aws_access_key_id=self.sts['AccessKeyId'], 
      aws_secret_access_key=self.sts['SecretAccessKey'],) 



def lambda_handler(event, context): 

    a = App(role) 

    for region in regions: 
    asgs = a.get_resource(region) 
    # locate all running instances 
    #autoscaling_groups_to_suspend = [] 
    #for i in asgs: 
    # print asgs[i] 
    print '[%s]' % ', '.join(map(str, asgs)) 

Cette fonction utilise: boto.ec2.autoscale.connect_to_region pour se connecter et renvoie l'objet.

Mais lorsque je tente de le déployer sur AWS, je reçois l'erreur suivante:

Unable to import module 'lambda_function': No module named boto.ec2.autoscale 

Il semble que le boto.ec2.autoscale de classe n'est pas chargé par AWS.

Une idée de ce qui pourrait être mauvais ici?

Répondre

0

Pour quelqu'un qui cherche une réponse, la pièce de code suivante Lambda obtient les listes de tous les ASG de puis les suspend (sauf ceux qui correspondent à la regrex)

import json 
import boto3 


regions = ["eu-central-1"] 
autoscaling = boto3.client('autoscaling') 

def lambda_handler(event, context): 

    response = autoscaling.describe_auto_scaling_groups(MaxRecords=100) 
    #print response 
    #print(response['AutoScalingGroups'][0]['AutoScalingGroupName']) 
    autoscaling_group_to_suspend = [] 
    for doc in response['AutoScalingGroups']: 
    response_parsed = doc['AutoScalingGroupName'] 
    autoscaling_group_to_suspend.append(response_parsed) 

    #print autoscaling_group_to_suspend 
    import re 
    regex = re.compile(r'es-data-asg|consul|influxdb|vault|es-master') 
    filtered = filter(lambda i: not regex.search(i), autoscaling_group_to_suspend) 
    filtered = [i for i in autoscaling_group_to_suspend if not regex.search(i)] 
    print filtered 

    if len(filtered) > 0: 
    for x in filtered: 
     autoscaling.suspend_processes(AutoScalingGroupName=x) 
0

Je suis en train de faire la même chose avec s3. J'ai besoin de boto.s3.connect_to_region() mais j'ai la même erreur. Probablement l'importation du module boto dans la dépendance lambda pourrait résoudre le problème. Sinon, nous devrons peut-être utiliser boto3.client et analyser la réponse json pour obtenir les valeurs appropriées.