in source/ip_retention_handler/remove_expired_ip.py [0:0]
def lambda_handler(event, context):
"""
Invoke functions to delete expired ips from waf ip set.
It is triggered by TTL DynamoDB Stream.
"""
log = logging.getLogger()
try:
# Set Log Level
log_level = str(environ['LOG_LEVEL'].upper())
if log_level not in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']:
log_level = 'ERROR'
log.setLevel(log_level)
log.info('[remove_expired_id: lambda_handler] Start')
log.info("Lambda Handler Event: \n{}".format(event))
response = {}
reip = RemoveExpiredIP(event, log)
# Remove expired ips in the event records
for record in event['Records']:
is_ddb_stream_event = reip.is_ddb_stream_event(reip.is_none(record.get('userIdentity',{})))
# Stop if the REMOVE event is not from DDB Stream triggered by DDB TTL
if not(is_ddb_stream_event) or reip.is_none(record.get('eventName')) != 'REMOVE':
log.info('[remove_expired_id: lambda_handler] The event is Not the IP removal event from DynamoDB Stream triggered by DynamoDB TTL. Skip. End.')
return response
ddb_ip_set = reip.is_none(record.get('dynamodb',{}).get('OldImage',{}))
desiralized_ddb_ip_set = reip.deserialize_ddb_data(ddb_ip_set)
scope = reip.is_none(str(desiralized_ddb_ip_set.get('Scope')))
name = reip.is_none(str(desiralized_ddb_ip_set.get('IPSetName')))
ip_set_id = reip.is_none(str(desiralized_ddb_ip_set.get('IPSetId')))
ip_retention_period = reip.is_none(str(desiralized_ddb_ip_set.get('IPRetentionPeriodMinute')))
waf_ip_set = reip.get_ip_set(log, scope, name, ip_set_id)
description = reip.is_none(waf_ip_set.get('IPSet',{}).get('Description'))
waf_ip_list = reip.is_none(waf_ip_set.get('IPSet',{}).get('Addresses',[]))
ddb_ip_list = reip.is_none(desiralized_ddb_ip_set.get('IPAdressList', []))
keep_ip_list, remove_ip_list = reip.make_ip_list(log, waf_ip_list, ddb_ip_list)
# Stop if None - no need to update ip set
if len(remove_ip_list) == 0:
log.info('[remove_expired_id: lambda_handler] No IPs to remove. End.')
return response
lock_token = reip.is_none(str(waf_ip_set.get('LockToken')))
response = reip.update_ip_set(log, scope, name, ip_set_id, keep_ip_list, lock_token, description)
# Send email notification to user if sns email is configured and ip set is successfully updated
if (environ.get('SNS_EMAIL').lower() == 'yes' and response.get('ResponseMetadata',{}).get('HTTPStatusCode') == 200):
response = reip.send_notification(log, environ.get('SNS_TOPIC_ARN'), name, ip_set_id, ip_retention_period, context.function_name)
# send anonymous solution metrics
reip.send_anonymous_usage_data(log, remove_ip_list, name)
except Exception as error:
log.error(str(error))
raise
log.info('[remove_expired_id: lambda_handler] End')
return response