0

I have lambda function to create new AMI and attach to current auto scale group. This function complete works when I create a test custom test case and pass the payload. Issue occurs when I trigger this from SNS:

import json
import boto3
import time
import sys

asObj = boto3.client('autoscaling')
ec2Obj = boto3.client('ec2')

def lambda_handler(event, context):
    targetASG = event[‘Records’][0][‘Sns’][‘Message’]
    ASG = asObj.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']])
    sourceInstanceId = ASG.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId']
    Date=time.strftime("%d%m%y")
    Time=time.strftime("%H%M%S")
    amiName = "Automated_%s_%s" % (Date, Time)
    configName = "Automated_%s_%s" % (Date, Time)

    CreateNewImage = ec2Obj.create_image(
        InstanceId = sourceInstanceId,
        Name = amiName,
        Description = 'Automatically Created Image from Lambda Service',
        NoReboot = True)
    Image = []
    Image.append(CreateNewImage)
    def getCreatedID(Image):
        for i in Image:
            ID = i['ImageId']
            return ID
    AMINewID = getCreatedID(Image)
    CreateNewConfig = asObj.create_launch_configuration(
        LaunchConfigurationName = configName,
        ImageId = AMINewID,
        InstanceId = sourceInstanceId)

    updateASG = asObj.update_auto_scaling_group(
        AutoScalingGroupName = event['targetASG'],
        LaunchConfigurationName = configName)
    return 'A new AMI has been Created `%s` Updated ASG `%s` with new launch configuration `%s` which includes AMI `%s`.' % (amiName,event['targetASG'], configName, AMINewID)  

To trigger my lambda function I use AWS SNS topic and I publish a msg following message, message type: raw

{   "targetASG": "pre-production-xxx" }

But I get this error:

'targetASG': KeyError Traceback (most recent call last): File "/var/task/lambda_function.py", line 13, in lambda_handler ASG = asObj.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']]) KeyError: 'targetASG'

How can I resolve this?

1 Answer 1

1

ASG = asObj.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']])

I think targetASG is not part of the SNS event.. SNS Events look like this:

{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:EXAMPLE", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "1970-01-01T00:00:00.000Z", "Signature": "EXAMPLE", "SigningCertUrl": "EXAMPLE", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeUrl": "EXAMPLE", "TopicArn": "arn:aws:sns:EXAMPLE", "Subject": "TestInvoke" } } ] }

You should grab the message and parse the targetASG value from there like e.g.

import json

[...]
targetASG = event[‘Records’][0][‘Sns’][‘Message’]
myMessage = json.loads(targetASG)
name = myMessage['targetASG']
ASG = asObj.describe_auto_scaling_groups(AutoScalingGroupNames=[name])
[...]
Sign up to request clarification or add additional context in comments.

1 Comment

yes superb, so when i trigger lambda from SNS, when deployment is success. i wont able to get the current ASG Name from that payload right? so i went on approach like this. so i trigger lambda when deployment success so i hard coded the ASG name on the function. any better approach ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.