import boto3 import requests from json import dumps ''' Initialize AWS XRAY available. ''' try: from aws_xray_sdk.core import patch_all, xray_recorder patch_all() XRAY_AVAILABLE=True except: XRAY_AVAILABLE=False def function_main(event:dict, context:dict)->dict: print(dumps(event)) assert 'region_name' in event, "missing region_name" assert 'stack_name' in event, "missing stack_name" assert 'template_path' in event, "missing template_path" assert 'parameters' in event, "missing parameters" region_name:str = event['region_name'] stack_name:str = event['stack_name'] template_path:str = event['template_path'] parameters:dict = event['parameters'] ''' Fetch the template ''' template = requests.get(url=template_path).text print(template) client = boto3.client('cloudformation', region_name=region_name) try: client.create_stack( StackName=stack_name, TemplateBody=template, DisableRollback=False, Capabilities=[ 'CAPABILITY_IAM','CAPABILITY_NAMED_IAM','CAPABILITY_AUTO_EXPAND', ], Parameters=[{ 'ParameterKey':x, 'ParameterValue': parameters[x], 'UsePreviousValue': True, } for x in parameters.keys()]) return { 'status': 'Creating the stack %s' % stack_name } except client.exceptions.AlreadyExistsException as error: return { 'status': 'Stack %s AlreadyExists; returning existing' % stack_name, } if __name__ == '__main__': ''' Debug the local run... ''' if XRAY_AVAILABLE: xray_recorder.begin_segment('LocalDebug') function_main( event={ "template_path": "https://disaster-recovery.wellarchitectedlabs.com/Reliability/Disaster%20Recovery/Workshop_1/US-East-1-Deployment/_index.en.files/BackupAndRestore.yaml", "stack_name": "DeployTest", "region_name": "us-east-1", "parameters":{ 'IsPrimary':'yes', 'LatestAmiId': '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' } }, context={ })