18

I have written an AWS Lambda function in Python that filters through instances and turns them on or off depending on how they are tagged. This will show you a working function, and the set-up needed to get it working. If you have questions on anything post it in the comments.

Here is my Lambda Function as of now:

import boto3
def lambda_handler(event, context):
    startStop = event['startStop']
    vertical = event['vertical']
    isRunning = ''

    if(startStop == 'start'):
        isRunning = 'stopped'
    elif (startStop == 'stop'):
        isRunning = 'running'

    ec2 = boto3.resource('ec2')
    filters = [
        {
            'Name': 'instance-state-name', 
            'Values': [isRunning] 
        },
        {
            'Name': 'tag:Vertical',
            'Values': [vertical]
        }
    ]

    instances = ec2.instances.filter(Filters=filters)

    runningInstances = [instance.id for instance in instances]

    if len(runningInstances) > 0:
        if(startStop == 'start'):
            shuttingDown = ec2.instances.filter(InstanceIds=runningInstances).start()
        elif (startStop == 'stop'):
            shuttingDown = ec2.instances.filter(InstanceIds=runningInstances).stop()

For reference, here is my mapping template:

{
    "startStop":"$input.params('startStop')",
    "vertical":"$input.params('vertical')"
}

And this is how I am passing in the parameters within the URL:

https://awslambdaapiurl.../prod/-params?startStop=start&vertical=TEST
Doug Andres
  • 273
  • 3
  • 4
  • 11
  • I ended up figuring out the answer to my original question, so I have posted the working code as a resource for anyone to look at. – Doug Andres Jul 19 '17 at 20:31
  • 2
    Can you just paste what you did as an answer and mark this as answered. – Abhigna Nagaraja Jul 21 '17 at 17:50
  • Sure, should I just delete the post and then re-post it as an answer? @AbhignaNagaraja – Doug Andres Jul 21 '17 at 18:31
  • @DougAndres It's not necessary to repost. Just rollback the changes in the question as it was at the beginning (https://stackoverflow.com/revisions/45198321/1), and add what you did as an answer for this question. Then, mark it as answered and that's it! :-) – JonDoe297 Jul 12 '18 at 22:45

2 Answers2

3

Pass in parameter values in a mapping template:

{
    "startStop":"$input.params('startStop')",
    "vertical":"$input.params('vertical')"
}

Read parameter values via event Object:

    startStop = event['startStop']
    vertical = event['vertical']
cellepo
  • 4,001
  • 2
  • 38
  • 57
2

You can use the queryStringParameters on event object.

request_data = event['queryStringParameters']
startStop = request_data['startStop']
vertical = request_data['vertical']