Skip to content

Commit 5730edd

Browse files
authored
feat(function): Add validation for S3 NotificationConfiguration (#2473)
1 parent 527caec commit 5730edd

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

samtranslator/model/eventsources/push.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ def to_cloudformation(self, **kwargs):
313313
# merging is literally "last one wins", which works fine because we linearly loop through the template once.
314314
# The de-dupe happens inside `samtranslator.translator.Translator.translate` method when merging results of
315315
# to_cloudformation() to output template.
316-
self._inject_notification_configuration(function, bucket)
316+
self._inject_notification_configuration(function, bucket, bucket_id)
317317
resources.append(S3Bucket.from_dict(bucket_id, bucket))
318318

319319
return resources
@@ -378,7 +378,7 @@ def _depend_on_lambda_permissions_using_tag(self, bucket, permission):
378378
properties["Tags"] = tags + get_tag_list(dep_tag)
379379
return bucket
380380

381-
def _inject_notification_configuration(self, function, bucket):
381+
def _inject_notification_configuration(self, function, bucket, bucket_id):
382382
base_event_mapping = {"Function": function.get_runtime_attr("arn")}
383383

384384
if self.Filter is not None:
@@ -407,13 +407,16 @@ def _inject_notification_configuration(self, function, bucket):
407407
notification_config = {}
408408
properties["NotificationConfiguration"] = notification_config
409409

410+
if not isinstance(notification_config, dict):
411+
raise InvalidResourceException(bucket_id, "Invalid type for NotificationConfiguration.")
412+
410413
lambda_notifications = notification_config.get("LambdaConfigurations", None)
411414
if lambda_notifications is None:
412415
lambda_notifications = []
413416
notification_config["LambdaConfigurations"] = lambda_notifications
414417

415418
if not isinstance(lambda_notifications, list):
416-
raise InvalidResourceException(self.logical_id, "Invalid type for LambdaConfigurations. Must be a list.")
419+
raise InvalidResourceException(bucket_id, "Invalid type for LambdaConfigurations. Must be a list.")
417420

418421
for event_mapping in event_mappings:
419422
if event_mapping not in lambda_notifications:

tests/translator/input/error_s3_lambda_configuration_invalid_type.yaml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,31 @@ Resources:
2121
NotificationConfiguration:
2222
LambdaConfigurations:
2323
Event: s3:ObjectCreated:Put
24-
Function: arn:aws:iam::...
24+
Function: arn:aws:iam::...
25+
26+
AnotherFunction:
27+
Type: AWS::Serverless::Function
28+
Properties:
29+
CodeUri: s3://bucket/key
30+
Handler: app.lambdaHandler
31+
Runtime: nodejs14.x
32+
Architectures:
33+
- x86_64
34+
Events:
35+
S3Event:
36+
Type: S3
37+
Properties:
38+
Bucket:
39+
Ref: AnotherBucket
40+
Events: s3:ObjectCreated:*
41+
42+
AnotherBucket:
43+
Type: AWS::S3::Bucket
44+
Properties:
45+
NotificationConfiguration:
46+
- Event: s3:ObjectCreated:*
47+
Function:
48+
Fn::GetAtt:
49+
- AnotherFunction
50+
- Arn
51+

tests/translator/output/error_s3_lambda_configuration_invalid_type.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
"errorMessage": "Resource with id [AppFunctionS3Event] is invalid. Invalid type for LambdaConfigurations. Must be a list."
55
}
66
],
7-
"errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [AppFunctionS3Event] is invalid. Invalid type for LambdaConfigurations. Must be a list."
7+
"errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 2. Resource with id [AnotherBucket] is invalid. Invalid type for NotificationConfiguration. Resource with id [RandomBucket] is invalid. Invalid type for LambdaConfigurations. Must be a list."
88
}

0 commit comments

Comments
 (0)