CloudFormation uses a pre-signed S3 URL to receive the response back from the custom resources managed by it. There are few blue prints available for Node.js Lambda custom resources but nothing available for python yet. Hence I created this simple function which shall be used to send the response back to CFN custom resource by performing PUT request to the pre-signed S3 URL.
import json
import requests
def lambda_handler(event, context):
responseStatus = 'SUCCESS'
responseData = {}
if event['RequestType'] == 'Delete':
sendResponse(event, context, responseStatus, responseData)
responseData = {'Success': 'Test Passed.'}
sendResponse(event, context, responseStatus, responseData)
def sendResponse(event, context, responseStatus, responseData):
responseBody = {'Status': responseStatus,
'Reason': 'See the details in CloudWatch Log Stream: ' + context.log_stream_name,
'PhysicalResourceId': context.log_stream_name,
'StackId': event['StackId'],
'RequestId': event['RequestId'],
'LogicalResourceId': event['LogicalResourceId'],
'Data': responseData}
print 'RESPONSE BODY:n' + json.dumps(responseBody)
try:
req = requests.put(event['ResponseURL'], data=json.dumps(responseBody))
if req.status_code != 200:
print req.text
raise Exception('Recieved non 200 response while sending response to CFN.')
return
except requests.exceptions.RequestException as e:
print e
raise
if __name__ == '__main__':
lambda_handler('event', 'handler')
I’m using json module to form the response body, json module is available by default in the Lambda container. Whereas the requests module which I use to perform the http PUT request needs to be packaged along with the python script.
$ pip install requests -t .
$ zip -r9 PythonCFN.zip requests PythonCFN.py