Skip to content

Commit 3a6dbe0

Browse files
benjamingormanleandrodamascenaheitorlessa
authored
fix(parser): make etag optional field on S3 notification events (#4173)
Co-authored-by: Leandro Damascena <[email protected]> Co-authored-by: Heitor Lessa <[email protected]>
1 parent 2cc71d1 commit 3a6dbe0

File tree

5 files changed

+13
-15
lines changed

5 files changed

+13
-15
lines changed

Diff for: aws_lambda_powertools/utilities/data_classes/s3_event.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ def key(self) -> str:
3232
return unquote_plus(self["key"])
3333

3434
@property
35-
def size(self) -> str:
36-
"""Object size"""
37-
return self["size"]
35+
def size(self) -> Optional[int]:
36+
"""Object size. Object deletion event doesn't contain size."""
37+
return self.get("size")
3838

3939
@property
4040
def etag(self) -> str:
41-
"""Object etag"""
42-
return self["etag"]
41+
"""Object etag. Object deletion event doesn't contain etag; we default to empty string"""
42+
return self.get("etag", "") # type: ignore[return-value] # false positive
4343

4444
@property
4545
def version_id(self) -> str:
@@ -178,8 +178,8 @@ def size(self) -> int:
178178

179179
@property
180180
def etag(self) -> str:
181-
"""object eTag"""
182-
return self["s3"]["object"]["eTag"]
181+
"""Object eTag. Object deletion event doesn't contain eTag; we default to empty string"""
182+
return self["s3"]["object"].get("eTag", "")
183183

184184
@property
185185
def version_id(self) -> Optional[str]:

Diff for: aws_lambda_powertools/utilities/parser/models/s3.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class S3Message(BaseModel):
6161
class S3EventNotificationObjectModel(BaseModel):
6262
key: str
6363
size: Optional[NonNegativeFloat] = None
64-
etag: str
64+
etag: str = Field(default="")
6565
version_id: str = Field(None, alias="version-id")
6666
sequencer: Optional[str] = None
6767

Diff for: tests/events/s3EventBridgeNotificationObjectDeletedEvent.json

+1-3
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
},
1717
"object": {
1818
"key": "IMG_m7fzo3.jpg",
19-
"size": 184662,
20-
"etag": "4e68adba0abe2dc8653dc3354e14c01d",
2119
"sequencer": "006408CAD69598B05E"
2220
},
2321
"request-id": "0BH729840619AG5K",
@@ -26,4 +24,4 @@
2624
"reason": "DeleteObject",
2725
"deletion-type": "Delete Marker Created"
2826
}
29-
}
27+
}

Diff for: tests/unit/data_classes/test_s3_eventbridge_notification.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ def test_s3_eventbridge_notification_detail_parsed(raw_event: Dict):
2626
assert parsed_event.detail.deletion_type == raw_event["detail"].get("deletion-type")
2727
assert parsed_event.detail.destination_access_tier == raw_event["detail"].get("destination-access-tier")
2828
assert parsed_event.detail.destination_storage_class == raw_event["detail"].get("destination-storage-class")
29-
assert parsed_event.detail.object.etag == raw_event["detail"]["object"]["etag"]
29+
assert parsed_event.detail.object.etag == raw_event["detail"]["object"].get("etag", "")
3030
assert parsed_event.detail.object.key == raw_event["detail"]["object"]["key"]
3131
assert parsed_event.detail.object.sequencer == raw_event["detail"]["object"]["sequencer"]
32-
assert parsed_event.detail.object.size == raw_event["detail"]["object"]["size"]
32+
assert parsed_event.detail.object.size == raw_event["detail"]["object"].get("size")
3333
assert parsed_event.detail.reason == raw_event["detail"].get("reason")
3434
assert parsed_event.detail.version == raw_event["detail"].get("version")
3535
assert parsed_event.detail.request_id == raw_event["detail"]["request-id"]

Diff for: tests/unit/parser/test_s3_notification.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ def test_s3_eventbridge_notification_object_deleted_event():
5252
assert model.detail.version == raw_event["detail"]["version"]
5353
assert model.detail.bucket.name == raw_event["detail"]["bucket"]["name"]
5454
assert model.detail.object.key == raw_event["detail"]["object"]["key"]
55-
assert model.detail.object.size == raw_event["detail"]["object"]["size"]
56-
assert model.detail.object.etag == raw_event["detail"]["object"]["etag"]
55+
assert model.detail.object.size == raw_event["detail"]["object"].get("size")
56+
assert model.detail.object.etag == raw_event["detail"]["object"].get("etag", "")
5757
assert model.detail.object.sequencer == raw_event["detail"]["object"]["sequencer"]
5858
assert model.detail.request_id == raw_event["detail"]["request-id"]
5959
assert model.detail.requester == raw_event["detail"]["requester"]

0 commit comments

Comments
 (0)