"""Lambda copy-recovery-point function module.""" import json import os import boto3 from lambdacommon.common_config import logger from environs import env from src.event_source_mapping import set_lambda_event_source_mapping REFRESH_TABLE_ARN = os.environ.get('REFRESH_TABLE_ARN') REFRESH_TABLE_NAME = os.environ.get('REFRESH_TABLE_NAME') REFRESH_TABLE_STREAM_ENABLED = env.bool('REFRESH_TABLE_STREAM_ENABLED', default=False) REFRESH_TABLE_STREAM_VIEW_TYPE = os.environ.get('REFRESH_TABLE_STREAM_VIEW_TYPE') REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_ARN = env.str('REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_ARN', default=None) REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_BATCH_SIZE = env.int( 'REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_BATCH_SIZE', default=100) REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_PARALLELIZATION_FACTOR = env.int( 'REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_PARALLELIZATION_FACTOR', default=1) REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_STARTING_POSITION = env.str( 'REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_STARTING_POSITION', default='LATEST') REFRESH_TABLE_GLOBAL_REPLICAS_ENABLED = env.bool('REFRESH_TABLE_GLOBAL_REPLICAS_ENABLED', default=False) REFRESH_TABLE_GLOBAL_REPLICAS_REGION = os.environ.get('REFRESH_TABLE_GLOBAL_REPLICAS_REGION') REFRESH_TABLE_GLOBAL_REPLICAS_KMS_KEY = os.environ.get('REFRESH_TABLE_GLOBAL_REPLICAS_KMS_KEY') AWS_REGION = 'us-east-1' TTL_ENABLED = env.bool('TTL_ENABLED', default=False) TTL_ATTRIBUTE = os.environ.get('TTL_ATTRIBUTE', 'expires_at') APPLY_TAGS = os.environ.get('APPLY_TAGS', None) dynamodb = boto3.client('dynamodb', region_name=AWS_REGION) lambda_client = boto3.client('lambda', region_name=AWS_REGION) def handler(event, context): """Lambda entry point.""" try: if REFRESH_TABLE_STREAM_ENABLED or REFRESH_TABLE_GLOBAL_REPLICAS_ENABLED: logger.info(f'Starting table update for {REFRESH_TABLE_NAME}') update_table(REFRESH_TABLE_NAME) return {'status': 'OK'} except Exception as e: logger.exception(str(e)) raise e def update_table(table_name): """Update DynamoDB Table.""" if REFRESH_TABLE_GLOBAL_REPLICAS_ENABLED: try: dynamodb.update_table( TableName=table_name, ReplicaUpdates=replica_update_spec(), ) logger.info('Global table update complete') except Exception as e: logger.exception(e) raise e if REFRESH_TABLE_STREAM_ENABLED: try: dynamodb.update_table(TableName=table_name, StreamSpecification=stream_update_spec()) logger.info('Stream update complete') except Exception as e: logger.exception(e) raise e if REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_ARN: event_source_mapping_configs = { 'BatchSize': REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_BATCH_SIZE, 'ParallelizationFactor': REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_PARALLELIZATION_FACTOR, 'StartingPosition': REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_STARTING_POSITION, } set_lambda_event_source_mapping( dynamodb_client=dynamodb, dynamodb_table=table_name, lambda_client=lambda_client, target_lambda_arn=REFRESH_TABLE_STREAM_CONSUMER_LAMBDA_ARN, **event_source_mapping_configs, ) if TTL_ENABLED: try: dynamodb.update_time_to_live( TableName=table_name, TimeToLiveSpecification={ 'AttributeName': TTL_ATTRIBUTE, 'Enabled': TTL_ENABLED } ) logger.info('TTL update complete') except Exception as e: logger.exception(e) raise e if APPLY_TAGS: try: # transform string into tag format transformed_tags = json.loads(APPLY_TAGS) dynamodb.tag_resource(ResourceArn=REFRESH_TABLE_ARN, Tags=transformed_tags) except Exception as e: logger.exception(e) raise e def replica_update_spec(): """Replica Update spec.""" return [ { 'Create': { 'RegionName': REFRESH_TABLE_GLOBAL_REPLICAS_REGION, 'KMSMasterKeyId': REFRESH_TABLE_GLOBAL_REPLICAS_KMS_KEY, } } ] def stream_update_spec(): """Stream Update spec.""" return {'StreamEnabled': REFRESH_TABLE_STREAM_ENABLED, 'StreamViewType': REFRESH_TABLE_STREAM_VIEW_TYPE}