Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Following is the Lambda function, I wrote that gets the list of Autoscaling group and prints them.

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))

This function uses: boto.ec2.autoscale.connect_to_region to connect and returns the object.

But when I try to deploy it on AWS, I get the following error:

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

It seems like the class boto.ec2.autoscale is not being loaded by AWS.

Any idea what might be wrong here?

like image 574
Spaniard89 Avatar asked Jul 20 '26 20:07

Spaniard89


1 Answers

For someone looking for an answer, the following piece of Lambda code gets the lists of all ASG's and then suspends them (except the ones that match the 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)
like image 141
Spaniard89 Avatar answered Jul 22 '26 13:07

Spaniard89



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!