Skip to content

Commit da31185

Browse files
authored
Merge pull request #3 from blockmar/log-forwarder-eventbridge-s3-support-handler-refactor
Refactored EventBridge S3 events to a new event type. Extracted handler, similar to kinesis.
2 parents ace0bf3 + 9baae4d commit da31185

4 files changed

Lines changed: 67 additions & 60 deletions

File tree

aws/logs_monitoring/steps/enums.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def __str__(self):
5858
class AwsEventType(Enum):
5959
AWSLOGS = "awslogs"
6060
EVENTS = "events"
61+
EVENTBRIDGE_S3 = "eventbridge_s3"
6162
KINESIS = "kinesis"
6263
S3 = "s3"
6364
SNS = "sns"

aws/logs_monitoring/steps/parsing.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ def parse(event, context, cache_layer):
3737
events = aws_handler.handle(event)
3838
return collect_and_count(events)
3939
case AwsEventType.S3:
40-
event = _reformat_eventbridge_s3_event(event)
4140
s3_handler = S3EventHandler(context, metadata, cache_layer)
4241
events = s3_handler.handle(event)
42+
case AwsEventType.EVENTBRIDGE_S3:
43+
events = eventbridge_s3_handler(event, context, metadata, cache_layer)
4344
case AwsEventType.EVENTS:
4445
events = cwevent_handler(event, metadata)
4546
case AwsEventType.SNS:
@@ -82,12 +83,14 @@ def parse_event_type(event):
8283
elif "detail" in event:
8384
# Check if this is an EventBridge S3 event
8485
if event.get("source") == "aws.s3" and "Object Created" in event.get("detail-type", ""):
85-
return AwsEventType.S3
86+
return AwsEventType.EVENTBRIDGE_S3
8687
return AwsEventType.EVENTS
8788
raise Exception("Event type not supported (see #Event supported section)")
8889

8990

90-
def _reformat_eventbridge_s3_event(event):
91+
# Handle S3 event over EventBridge
92+
def eventbridge_s3_handler(event, context, metadata, cache_layer):
93+
9194
"""
9295
Transform EventBridge S3 event to standard S3 event format.
9396
@@ -112,7 +115,7 @@ def _reformat_eventbridge_s3_event(event):
112115
}]
113116
}
114117
"""
115-
if event.get("source") == "aws.s3" and "detail" in event:
118+
def reformat_eventbridge_s3_event(event):
116119
return {
117120
"Records": [
118121
{
@@ -125,7 +128,10 @@ def _reformat_eventbridge_s3_event(event):
125128
}
126129
]
127130
}
128-
return event
131+
132+
event = reformat_eventbridge_s3_event(event)
133+
s3_handler = S3EventHandler(context, metadata, cache_layer)
134+
return s3_handler.handle(event)
129135

130136

131137
# Handle Cloudwatch Events

aws/logs_monitoring/tests/test_lambda_function.py

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -300,58 +300,5 @@ def _create_log_event_from_data(self, data):
300300
return encoded_data
301301

302302

303-
class TestParseEventType(unittest.TestCase):
304-
def test_parse_eventbridge_s3_event_type(self):
305-
"""Test that EventBridge S3 events are correctly identified as S3 type"""
306-
eventbridge_s3_event = {
307-
"version": "0",
308-
"id": "test-event-id",
309-
"detail-type": "Object Created",
310-
"source": "aws.s3",
311-
"account": "123456789012",
312-
"time": "2024-01-15T12:00:00Z",
313-
"region": "us-east-1",
314-
"resources": ["arn:aws:s3:::my-bucket"],
315-
"detail": {
316-
"bucket": {"name": "my-bucket"},
317-
"object": {"key": "my-key.log"},
318-
},
319-
}
320-
321-
event_type = parse_event_type(eventbridge_s3_event)
322-
self.assertEqual(event_type, AwsEventType.S3)
323-
324-
def test_parse_direct_s3_event_type(self):
325-
"""Test that direct S3 events are still correctly identified as S3 type"""
326-
direct_s3_event = {
327-
"Records": [
328-
{
329-
"s3": {
330-
"bucket": {"name": "my-bucket"},
331-
"object": {"key": "my-key"},
332-
}
333-
}
334-
]
335-
}
336-
337-
event_type = parse_event_type(direct_s3_event)
338-
self.assertEqual(event_type, AwsEventType.S3)
339-
340-
def test_parse_non_s3_eventbridge_event_type(self):
341-
"""Test that non-S3 EventBridge events are identified as EVENTS type"""
342-
eventbridge_other_event = {
343-
"version": "0",
344-
"detail-type": "EC2 Instance State-change Notification",
345-
"source": "aws.ec2",
346-
"detail": {
347-
"instance-id": "i-1234567890abcdef0",
348-
"state": "terminated"
349-
},
350-
}
351-
352-
event_type = parse_event_type(eventbridge_other_event)
353-
self.assertEqual(event_type, AwsEventType.EVENTS)
354-
355-
356303
if __name__ == "__main__":
357304
unittest.main()

aws/logs_monitoring/tests/test_parsing.py

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
from settings import DD_CUSTOM_TAGS, DD_SOURCE
55
from steps.common import get_service_from_tags_and_remove_duplicates, parse_event_source
6-
from steps.enums import AwsEventSource
7-
from steps.parsing import parse
6+
from steps.enums import AwsEventSource, AwsEventType
7+
from steps.parsing import parse, parse_event_type
88

99

1010
class TestParseEventSource(unittest.TestCase):
@@ -185,6 +185,59 @@ def test_get_service_from_tags_removing_duplicates(self):
185185
)
186186

187187

188+
class TestParseEventType(unittest.TestCase):
189+
def test_parse_eventbridge_s3_event_type(self):
190+
"""Test that EventBridge S3 events are correctly identified as EventBridge S3 type"""
191+
eventbridge_s3_event = {
192+
"version": "0",
193+
"id": "test-event-id",
194+
"detail-type": "Object Created",
195+
"source": "aws.s3",
196+
"account": "123456789012",
197+
"time": "2024-01-15T12:00:00Z",
198+
"region": "us-east-1",
199+
"resources": ["arn:aws:s3:::my-bucket"],
200+
"detail": {
201+
"bucket": {"name": "my-bucket"},
202+
"object": {"key": "my-key.log"},
203+
},
204+
}
205+
206+
event_type = parse_event_type(eventbridge_s3_event)
207+
self.assertEqual(event_type, AwsEventType.EVENTBRIDGE_S3)
208+
209+
def test_parse_direct_s3_event_type(self):
210+
"""Test that direct S3 events are still correctly identified as S3 type"""
211+
direct_s3_event = {
212+
"Records": [
213+
{
214+
"s3": {
215+
"bucket": {"name": "my-bucket"},
216+
"object": {"key": "my-key"},
217+
}
218+
}
219+
]
220+
}
221+
222+
event_type = parse_event_type(direct_s3_event)
223+
self.assertEqual(event_type, AwsEventType.S3)
224+
225+
def test_parse_non_s3_eventbridge_event_type(self):
226+
"""Test that non-S3 EventBridge events are identified as EVENTS type"""
227+
eventbridge_other_event = {
228+
"version": "0",
229+
"detail-type": "EC2 Instance State-change Notification",
230+
"source": "aws.ec2",
231+
"detail": {
232+
"instance-id": "i-1234567890abcdef0",
233+
"state": "terminated"
234+
},
235+
}
236+
237+
event_type = parse_event_type(eventbridge_other_event)
238+
self.assertEqual(event_type, AwsEventType.EVENTS)
239+
240+
188241
class TestEventBridgeS3Parsing(unittest.TestCase):
189242
class Context:
190243
function_version = "$LATEST"

0 commit comments

Comments
 (0)