def lambda_handler()

in source/lambda/iot-dr-launch-solution/lambda_function.py [0:0]


def lambda_handler(event, context):
    logger.info('event: {}'.format(event))

    responseData = {}

    if event['RequestType'] == 'Update':
        logger.info('update cycle')
        responseData = {'Success': 'Update pass'}
        cfnresponse_send(event, context, SUCCESS, responseData, 'CustomResourcePhysicalID')

    if event['RequestType'] == 'Delete':
        cfn_result = FAILED
        responseData = {}
        logger.info('delete cycle')
        try:
            primary_region = event['ResourceProperties']['PRIMARY_REGION']
            secondary_region = event['ResourceProperties']['SECONDARY_REGION']
            lambda_arn = event['ServiceToken']
            logger.info('primary_region: {} secondary_region: {} ambda_arn: {}'.
                format(primary_region, secondary_region, lambda_arn))

            #verify_regions(primary_region, secondary_region)

            client = boto3.client('lambda')
            response = client.list_tags(
                Resource=lambda_arn
            )
            iot_dr_primary_stack_name = None
            iot_dr_secondary_stack_name = None
            iot_dr_r53_health_checker_name = None

            iot_dr_primary_bucket = None
            iot_dr_secondary_bucket = None

            executor = futures.ThreadPoolExecutor(max_workers=MAX_WORKERS)
            logger.info('executor: started: {}'.format(executor))

            if 'Tags' in response:
                if 'STACK_POSTFIX' in response['Tags']:
                    iot_dr_primary_stack_name = 'IoTDRPrimary{}'.format(response['Tags']['STACK_POSTFIX'])
                    executor.submit(delete_cfn_stack, iot_dr_primary_stack_name, primary_region)

                    iot_dr_secondary_stack_name = 'IoTDRSecondary{}'.format(response['Tags']['STACK_POSTFIX'])
                    executor.submit(delete_cfn_stack, iot_dr_secondary_stack_name, secondary_region)

                    iot_dr_r53_health_checker_name = 'R53HealthChecker{}'.format(response['Tags']['STACK_POSTFIX'])
                    executor.submit(delete_cfn_stack, iot_dr_r53_health_checker_name, primary_region)
                    executor.submit(delete_cfn_stack, iot_dr_r53_health_checker_name, secondary_region)

                if 'UUID' in response['Tags']:
                    iot_dr_primary_bucket = 'iot-dr-primary-{}'.format(response['Tags']['UUID'])
                    empty_and_delete_bucket(iot_dr_primary_bucket)

                    iot_dr_secondary_bucket = 'iot-dr-secondary-{}'.format(response['Tags']['UUID'])
                    empty_and_delete_bucket(iot_dr_secondary_bucket)


            logger.info('iot_dr_primary_stack_name: {} iot_dr_secondary_stack_name: {} iot_dr_r53_health_checker_name: {}'.
                format(iot_dr_primary_stack_name, iot_dr_secondary_stack_name, iot_dr_r53_health_checker_name))

            logger.info('iot_dr_primary_bucket: {} iot_dr_secondary_bucket: {}'.
                format(iot_dr_primary_bucket, iot_dr_secondary_bucket))

            logger.info('executor: waiting to finish')
            executor.shutdown(wait=True)
            logger.info('executor: shutted down')

            responseData = {'Success': 'resources deleted'}

            cfn_result = SUCCESS

        except Exception as e:
            cfn_result = FAILED
            responseData = {'Error': '{}: see also CloudWatch Log Stream: {}'.format(e, context.log_stream_name)}
            logger.error('{}'.format(e))

        cfnresponse_send(event, context, cfn_result, responseData, 'CustomResourcePhysicalID')

    if event['RequestType'] == 'Create':
        cfn_result = FAILED
        responseData = {}
        try:
            primary_region = event['ResourceProperties']['PRIMARY_REGION']
            secondary_region = event['ResourceProperties']['SECONDARY_REGION']
            codebuild_project = event['ResourceProperties']['CODEBUID_PROJECT']

            date_time = datetime.now().strftime('%Y%m%d%H%M%S')
            bucket_uuid = '{}'.format(uuid.uuid4())
            lambda_arn = event['ServiceToken']

            logger.info('primary_region: {} secondary_region: {} codebuild_project: {} date_time: {} bucket_uuid: {} lambda_arn: {}'.
                format(primary_region, secondary_region, codebuild_project, date_time, bucket_uuid, lambda_arn))

            verify_regions(primary_region, secondary_region)
            verify_events_indexing_enabled(primary_region)

            logger.info('tagging myself to preserve STACK_POSTFIX {} and UUID {}'.format(date_time, bucket_uuid))
            response = boto3.client('lambda').tag_resource(
                Resource=lambda_arn,
                Tags={
                    'STACK_POSTFIX': date_time,
                    'UUID': bucket_uuid
                }
            )
            logger.info('tag_resource: response: {}'.format(response))

            responseData['IOT_ENDPOINT_PRIMARY'] = boto3.client('iot', region_name=primary_region).describe_endpoint(endpointType='iot:Data-ATS')['endpointAddress']
            responseData['IOT_ENDPOINT_SECONDARY'] = boto3.client('iot', region_name=secondary_region).describe_endpoint(endpointType='iot:Data-ATS')['endpointAddress']

            responseData['STACK_POSTFIX'] = date_time
            responseData['UUID'] = bucket_uuid
            responseData['Success'] = 'Solution launch initiated'

            logger.info('starting codebuild_project {}'.format(codebuild_project))
            response = boto3.client('codebuild').start_build(
                projectName=codebuild_project,
                environmentVariablesOverride=[
                    {
                        'name': 'PRIMARY_REGION',
                        'value': primary_region,
                        'type': 'PLAINTEXT'
                    },
                    {
                        'name': 'SECONDARY_REGION',
                        'value': secondary_region,
                        'type': 'PLAINTEXT'
                    },
                    {
                        'name': 'STACK_POSTFIX',
                        'value': date_time,
                        'type': 'PLAINTEXT'
                    },
                    {
                        'name': 'UUID',
                        'value': bucket_uuid,
                        'type': 'PLAINTEXT'
                    }
                ]
            )
            logger.info('start_build: response: {}'.format(response))

            logger.info('responseData: {}'.format(responseData))

            cfn_result = SUCCESS

        except Exception as e:
            cfn_result = FAILED
            responseData = {'Error': '{}: see also CloudWatch Log Stream: {}'.format(e, context.log_stream_name)}
            logger.error('{}'.format(e))

        cfnresponse_send(event, context, cfn_result, responseData, 'CustomResourcePhysicalID')