AWSTemplateFormatVersion: '2010-09-09' Description: (AWS Heidi) Back fill stack to do one time backfill of events to dynamodb Resources: EventHealthLambdaForDDBInitialLoadRole: Type: AWS::IAM::Role Properties: RoleName: !Sub EventHealthLambdaForDDBInitialLoadRole-${AWS::AccountId}-${AWS::Region} AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: cloudwatch-logs-access PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: "*" - PolicyName: Healthapiaccess PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - health:* Resource: "*" - PolicyName: PutEventtoDefaultBus-access PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - "events:PutEvents" Resource: !Sub "arn:aws:events:${AWS::Region}:${AWS::AccountId}:event-bus/default" AWSLambdatoInitialEventsLoad: Type: AWS::Lambda::Function Properties: Code: ZipFile: | import boto3 import json from datetime import datetime import os import cfnresponse health_client = boto3.client('health') eventbridge_client = boto3.client('events') def get_events(): events = [] next_token = None try: while True: kwargs = {} if next_token and len(next_token) >= 4: kwargs['nextToken'] = next_token events_response = health_client.describe_events(filter={}, **kwargs) events += events_response['events'] if 'nextToken' in events_response: next_token = events_response['nextToken'] else: break return events except Exception as e: print(e) return [] def get_event_data(event_details, event_description): event_data = { 'eventArn': event_details['arn'], 'eventRegion': event_details.get('region', ''), 'eventTypeCode': event_details.get('eventTypeCode', ''), 'lastUpdatedTime': event_details.get('lastUpdatedTime', ''), 'endTime': event_details.get('endTime', ''), 'startTime': event_details.get('startTime', ''), 'eventDescription': [{'latestDescription': event_description['latestDescription']}] } for key, value in event_data.items(): if isinstance(value, datetime): event_data[key] = value.strftime('%a, %d %b %Y %H:%M:%S %Z') """ Get all other fields as is. """ event_data.update((key, value) for key, value in event_details.items() if key not in event_data) print(event_data) return event_data def send_event_defaultBus(event_data): # Send the event to EventBridge eventbridge_client.put_events( Entries=[ { 'Source': 'awshealthtest', 'DetailType': 'awshealthtest', 'Detail': json.dumps(event_data), 'EventBusName': 'default' } ] ) def lambda_handler(event, context): events = get_events() try: for awsevent in events: event_details_response = health_client.describe_event_details(eventArns=[awsevent['arn']]) successful_set = event_details_response.get('successfulSet') if not successful_set: continue event_details = successful_set[0]['event'] event_description = successful_set[0]['eventDescription'] event_data = get_event_data(event_details, event_description) send_event_defaultBus(event_data) cfnresponse.send(event, context, cfnresponse.SUCCESS, {}, None) except Exception as e: cfnresponse.send(event, context, cfnresponse.FAILED, {}, None) print(e) Handler: index.lambda_handler Runtime: python3.8 Timeout: 900 Role: !GetAtt EventHealthLambdaForDDBInitialLoadRole.Arn MyLambdaInvoker: Type: Custom::MyLambdaInvoker Properties: ServiceToken: !GetAtt AWSLambdatoInitialEventsLoad.Arn