S3: Add EventBridge Notification for DeleteObject (#7420)

This commit is contained in:
Miki Watanabe 2024-03-07 04:12:43 -05:00 committed by GitHub
parent dae651f62e
commit ef7653335b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 0 deletions

View File

@ -2599,10 +2599,17 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
bucket = self.get_bucket(bucket_name) bucket = self.get_bucket(bucket_name)
response_meta = {} response_meta = {}
delete_key = bucket.keys.get(key_name)
try: try:
if not bucket.is_versioned: if not bucket.is_versioned:
bucket.keys.pop(key_name) bucket.keys.pop(key_name)
notifications.send_event(
self.account_id,
notifications.S3NotificationEvent.OBJECT_REMOVED_DELETE_EVENT,
bucket,
delete_key,
)
else: else:
if version_id is None: if version_id is None:
delete_marker = self._set_delete_marker(bucket_name, key_name) delete_marker = self._set_delete_marker(bucket_name, key_name)
@ -2645,6 +2652,13 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
if not bucket.keys.getlist(key_name): if not bucket.keys.getlist(key_name):
bucket.keys.pop(key_name) bucket.keys.pop(key_name)
notifications.send_event(
self.account_id,
notifications.S3NotificationEvent.OBJECT_REMOVED_DELETE_EVENT,
bucket,
delete_key,
)
return True, response_meta return True, response_meta
except KeyError: except KeyError:
return False, None return False, None

View File

@ -142,3 +142,26 @@ def test_copy_object_notification():
assert event_message["detail"]["bucket"]["name"] == bucket_name assert event_message["detail"]["bucket"]["name"] == bucket_name
assert event_message["detail"]["object"]["key"] == object_key assert event_message["detail"]["object"]["key"] == object_key
assert event_message["detail"]["reason"] == "ObjectCreated" assert event_message["detail"]["reason"] == "ObjectCreated"
@mock_aws
def test_delete_object_notification():
resource_names = _seteup_bucket_notification_eventbridge()
bucket_name = resource_names["bucket_name"]
s3_client = boto3.client("s3", region_name=REGION_NAME)
# Put Object
s3_client.put_object(Bucket=bucket_name, Key="keyname", Body="bodyofnewobject")
# Delete Object
s3_client.delete_object(Bucket=bucket_name, Key="keyname")
events = _get_send_events()
assert len(events) == 2
event_message = json.loads(events[1]["message"])
assert event_message["detail-type"] == "Object Deleted"
assert event_message["source"] == "aws.s3"
assert event_message["account"] == ACCOUNT_ID
assert event_message["region"] == REGION_NAME
assert event_message["detail"]["bucket"]["name"] == bucket_name
assert event_message["detail"]["reason"] == "ObjectRemoved"