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')