Skip to content

Commit 845d1db

Browse files
Merge branch 'develop' into feature/sampling
2 parents 181a1ae + b72078f commit 845d1db

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

aws_lambda_powertools/utilities/parser/models/s3.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import datetime
2-
from typing import List, Literal, Optional
2+
from typing import List, Literal, Optional, Union
33

44
from pydantic import BaseModel, model_validator
55
from pydantic.fields import Field
@@ -23,7 +23,7 @@ class S3Identity(BaseModel):
2323

2424

2525
class S3RequestParameters(BaseModel):
26-
sourceIPAddress: IPvAnyNetwork
26+
sourceIPAddress: Union[IPvAnyNetwork, Literal["s3.amazonaws.com"]]
2727

2828

2929
class S3ResponseElements(BaseModel):
@@ -45,7 +45,7 @@ class S3Object(BaseModel):
4545
key: str
4646
size: Optional[NonNegativeFloat] = None
4747
eTag: Optional[str] = None
48-
sequencer: str
48+
sequencer: Optional[str] = None
4949
versionId: Optional[str] = None
5050

5151

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"Records": [
3+
{
4+
"eventVersion": "2.3",
5+
"eventSource": "aws:s3",
6+
"awsRegion": "us-east-1",
7+
"eventTime": "2019-09-03T19:37:27.192Z",
8+
"eventName": "LifecycleTransition",
9+
"userIdentity": {
10+
"principalId": "s3.amazonaws.com"
11+
},
12+
"requestParameters": {
13+
"sourceIPAddress": "s3.amazonaws.com"
14+
},
15+
"responseElements": {
16+
"x-amz-request-id": "D82B88E5F771F645",
17+
"x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
18+
},
19+
"s3": {
20+
"s3SchemaVersion": "1.0",
21+
"configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
22+
"bucket": {
23+
"name": "lambda-artifacts-deafc19498e3f2df",
24+
"ownerIdentity": {
25+
"principalId": "A3I5XTEXAMAI3E"
26+
},
27+
"arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
28+
},
29+
"object": {
30+
"key": "/path/to/file.parquet",
31+
"size": 12345,
32+
"eTag": "abcdef1232423423",
33+
"versionId": "SomeThingThere"
34+
}
35+
},
36+
"lifecycleEventData": {
37+
"transitionEventData": {
38+
"destinationStorageClass": "INTELLIGENT_TIERING"
39+
}
40+
}
41+
}
42+
]
43+
}

tests/unit/parser/_pydantic/test_s3.py

+41
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,44 @@ def test_s3_none_etag_value_failed_validation():
157157
raw_event["Records"][0]["s3"]["object"]["eTag"] = None
158158
with pytest.raises(ValidationError):
159159
S3Model(**raw_event)
160+
161+
162+
def test_s3_trigger_event_lifecycle_transition():
163+
raw_event = load_event("s3EventLifecycleTransition.json")
164+
parsed_event: S3Model = S3Model(**raw_event)
165+
166+
records = list(parsed_event.Records)
167+
assert len(records) == 1
168+
169+
record: S3RecordModel = records[0]
170+
raw_record = raw_event["Records"][0]
171+
assert record.eventVersion == raw_record["eventVersion"]
172+
assert record.eventSource == raw_record["eventSource"]
173+
assert record.awsRegion == raw_record["awsRegion"]
174+
convert_time = int(round(record.eventTime.timestamp() * 1000))
175+
assert convert_time == 1567539447192
176+
assert record.eventName == raw_record["eventName"]
177+
assert record.glacierEventData is None
178+
179+
user_identity = record.userIdentity
180+
assert user_identity.principalId == raw_record["userIdentity"]["principalId"]
181+
182+
request_parameters = record.requestParameters
183+
assert str(request_parameters.sourceIPAddress) == "s3.amazonaws.com"
184+
assert record.responseElements.x_amz_request_id == raw_record["responseElements"]["x-amz-request-id"]
185+
assert record.responseElements.x_amz_id_2 == raw_record["responseElements"]["x-amz-id-2"]
186+
187+
s3 = record.s3
188+
raw_s3 = raw_event["Records"][0]["s3"]
189+
assert s3.s3SchemaVersion == raw_record["s3"]["s3SchemaVersion"]
190+
assert s3.configurationId == raw_record["s3"]["configurationId"]
191+
assert s3.object.key == raw_s3["object"]["key"]
192+
assert s3.object.size == 12345
193+
assert s3.object.eTag == "abcdef1232423423"
194+
assert s3.object.versionId == "SomeThingThere"
195+
196+
bucket = s3.bucket
197+
raw_bucket = raw_record["s3"]["bucket"]
198+
assert bucket.name == raw_bucket["name"]
199+
assert bucket.ownerIdentity.principalId == raw_bucket["ownerIdentity"]["principalId"]
200+
assert bucket.arn == raw_bucket["arn"]

0 commit comments

Comments
 (0)