Skip to content

Commit 64a203f

Browse files
author
Elad Ben-Israel
authored
fix(sns): create subscriptions in consumer scope (#3065)
Since in most cases the consumer needs to reference the topic to permit it to send them messages (e.g. invoke a lambda function or send messages to the queue), it makes much more send to create the SNS subscription resource on the consumer's scope/stack instead of the topic's. This change adds an optional scope field to TopicSubscriptionConfig which is respected by topic.addSubscription. If scope is not defined, the topic's scope will be used. We also changed subscriberId to be optional, since in the case where scope is specified, the natural ID for the subscription construct would be the topic's unique ID, which is now the default. A runtime error will be emitted if both scope and subscriberId are not provided. Fixes #3064
1 parent 71ad83d commit 64a203f

19 files changed

+580
-486
lines changed

packages/@aws-cdk/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.lit.expected.json

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -506,34 +506,34 @@
506506
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"
507507
]
508508
},
509-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFunctionA8966A35": {
510-
"Type": "AWS::SNS::Subscription",
509+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeawsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AFBA77E328": {
510+
"Type": "AWS::Lambda::Permission",
511511
"Properties": {
512-
"Protocol": "lambda",
513-
"TopicArn": {
514-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
515-
},
516-
"Endpoint": {
512+
"Action": "lambda:InvokeFunction",
513+
"FunctionName": {
517514
"Fn::GetAtt": [
518515
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
519516
"Arn"
520517
]
518+
},
519+
"Principal": "sns.amazonaws.com",
520+
"SourceArn": {
521+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
521522
}
522523
}
523524
},
524-
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopicE6B1EBA6": {
525-
"Type": "AWS::Lambda::Permission",
525+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394": {
526+
"Type": "AWS::SNS::Subscription",
526527
"Properties": {
527-
"Action": "lambda:InvokeFunction",
528-
"FunctionName": {
528+
"Protocol": "lambda",
529+
"TopicArn": {
530+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
531+
},
532+
"Endpoint": {
529533
"Fn::GetAtt": [
530534
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
531535
"Arn"
532536
]
533-
},
534-
"Principal": "sns.amazonaws.com",
535-
"SourceArn": {
536-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
537537
}
538538
}
539539
},
@@ -700,6 +700,10 @@
700700
"Volumes": []
701701
}
702702
},
703+
"ScheduledEc2TaskScheduledTaskDefScheduledContainerLogGroupA85E11E6": {
704+
"Type": "AWS::Logs::LogGroup",
705+
"DeletionPolicy": "Retain"
706+
},
703707
"ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F": {
704708
"Type": "AWS::IAM::Role",
705709
"Properties": {
@@ -826,10 +830,6 @@
826830
]
827831
}
828832
},
829-
"ScheduledEc2TaskScheduledTaskDefScheduledContainerLogGroupA85E11E6": {
830-
"Type": "AWS::Logs::LogGroup",
831-
"DeletionPolicy": "Retain"
832-
},
833833
"ScheduledEc2TaskScheduledEventRuleFE2376A2": {
834834
"Type": "AWS::Events::Rule",
835835
"Properties": {
@@ -868,4 +868,4 @@
868868
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
869869
}
870870
}
871-
}
871+
}

packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-awsvpc-nw.expected.json

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
{
2-
"Parameters": {
3-
"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
4-
"Type": "AWS::SSM::Parameter::Value<String>",
5-
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
6-
}
7-
},
82
"Resources": {
93
"Vpc8378EB38": {
104
"Type": "AWS::EC2::VPC",
@@ -516,9 +510,6 @@
516510
}
517511
}
518512
},
519-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": {
520-
"Type": "AWS::SNS::Topic"
521-
},
522513
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA": {
523514
"Type": "AWS::IAM::Role",
524515
"Properties": {
@@ -671,34 +662,34 @@
671662
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"
672663
]
673664
},
674-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFunctionA8966A35": {
675-
"Type": "AWS::SNS::Subscription",
665+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeawsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925AFDCBEE50": {
666+
"Type": "AWS::Lambda::Permission",
676667
"Properties": {
677-
"Protocol": "lambda",
678-
"TopicArn": {
679-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
680-
},
681-
"Endpoint": {
668+
"Action": "lambda:InvokeFunction",
669+
"FunctionName": {
682670
"Fn::GetAtt": [
683671
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
684672
"Arn"
685673
]
674+
},
675+
"Principal": "sns.amazonaws.com",
676+
"SourceArn": {
677+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
686678
}
687679
}
688680
},
689-
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopicE6B1EBA6": {
690-
"Type": "AWS::Lambda::Permission",
681+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394": {
682+
"Type": "AWS::SNS::Subscription",
691683
"Properties": {
692-
"Action": "lambda:InvokeFunction",
693-
"FunctionName": {
684+
"Protocol": "lambda",
685+
"TopicArn": {
686+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
687+
},
688+
"Endpoint": {
694689
"Fn::GetAtt": [
695690
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
696691
"Arn"
697692
]
698-
},
699-
"Principal": "sns.amazonaws.com",
700-
"SourceArn": {
701-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
702693
}
703694
}
704695
},
@@ -752,6 +743,9 @@
752743
]
753744
}
754745
},
746+
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": {
747+
"Type": "AWS::SNS::Topic"
748+
},
755749
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookFFA63029": {
756750
"Type": "AWS::AutoScaling::LifecycleHook",
757751
"Properties": {
@@ -1031,6 +1025,12 @@
10311025
}
10321026
}
10331027
},
1028+
"Parameters": {
1029+
"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
1030+
"Type": "AWS::SSM::Parameter::Value<String>",
1031+
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
1032+
}
1033+
},
10341034
"Outputs": {
10351035
"LoadBalancerDNS": {
10361036
"Value": {

packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-bridge-nw.expected.json

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
{
2-
"Parameters": {
3-
"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
4-
"Type": "AWS::SSM::Parameter::Value<String>",
5-
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
6-
}
7-
},
82
"Resources": {
93
"Vpc8378EB38": {
104
"Type": "AWS::EC2::VPC",
@@ -537,9 +531,6 @@
537531
}
538532
}
539533
},
540-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": {
541-
"Type": "AWS::SNS::Topic"
542-
},
543534
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA": {
544535
"Type": "AWS::IAM::Role",
545536
"Properties": {
@@ -692,34 +683,34 @@
692683
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"
693684
]
694685
},
695-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFunctionA8966A35": {
696-
"Type": "AWS::SNS::Subscription",
686+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeawsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AFBA77E328": {
687+
"Type": "AWS::Lambda::Permission",
697688
"Properties": {
698-
"Protocol": "lambda",
699-
"TopicArn": {
700-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
701-
},
702-
"Endpoint": {
689+
"Action": "lambda:InvokeFunction",
690+
"FunctionName": {
703691
"Fn::GetAtt": [
704692
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
705693
"Arn"
706694
]
695+
},
696+
"Principal": "sns.amazonaws.com",
697+
"SourceArn": {
698+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
707699
}
708700
}
709701
},
710-
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopicE6B1EBA6": {
711-
"Type": "AWS::Lambda::Permission",
702+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394": {
703+
"Type": "AWS::SNS::Subscription",
712704
"Properties": {
713-
"Action": "lambda:InvokeFunction",
714-
"FunctionName": {
705+
"Protocol": "lambda",
706+
"TopicArn": {
707+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
708+
},
709+
"Endpoint": {
715710
"Fn::GetAtt": [
716711
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
717712
"Arn"
718713
]
719-
},
720-
"Principal": "sns.amazonaws.com",
721-
"SourceArn": {
722-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
723714
}
724715
}
725716
},
@@ -773,6 +764,9 @@
773764
]
774765
}
775766
},
767+
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": {
768+
"Type": "AWS::SNS::Topic"
769+
},
776770
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookFFA63029": {
777771
"Type": "AWS::AutoScaling::LifecycleHook",
778772
"Properties": {
@@ -994,6 +988,12 @@
994988
}
995989
}
996990
},
991+
"Parameters": {
992+
"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
993+
"Type": "AWS::SSM::Parameter::Value<String>",
994+
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
995+
}
996+
},
997997
"Outputs": {
998998
"LoadBalancerDNS": {
999999
"Value": {

packages/@aws-cdk/aws-ecs/test/ec2/integ.sd-awsvpc-nw.expected.json

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
{
2-
"Parameters": {
3-
"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
4-
"Type": "AWS::SSM::Parameter::Value<String>",
5-
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
6-
}
7-
},
82
"Resources": {
93
"Vpc8378EB38": {
104
"Type": "AWS::EC2::VPC",
@@ -516,9 +510,6 @@
516510
}
517511
}
518512
},
519-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": {
520-
"Type": "AWS::SNS::Topic"
521-
},
522513
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA": {
523514
"Type": "AWS::IAM::Role",
524515
"Properties": {
@@ -671,34 +662,34 @@
671662
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"
672663
]
673664
},
674-
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFunctionA8966A35": {
675-
"Type": "AWS::SNS::Subscription",
665+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeawsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AFBA77E328": {
666+
"Type": "AWS::Lambda::Permission",
676667
"Properties": {
677-
"Protocol": "lambda",
678-
"TopicArn": {
679-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
680-
},
681-
"Endpoint": {
668+
"Action": "lambda:InvokeFunction",
669+
"FunctionName": {
682670
"Fn::GetAtt": [
683671
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
684672
"Arn"
685673
]
674+
},
675+
"Principal": "sns.amazonaws.com",
676+
"SourceArn": {
677+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
686678
}
687679
}
688680
},
689-
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopicE6B1EBA6": {
690-
"Type": "AWS::Lambda::Permission",
681+
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394": {
682+
"Type": "AWS::SNS::Subscription",
691683
"Properties": {
692-
"Action": "lambda:InvokeFunction",
693-
"FunctionName": {
684+
"Protocol": "lambda",
685+
"TopicArn": {
686+
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
687+
},
688+
"Endpoint": {
694689
"Fn::GetAtt": [
695690
"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
696691
"Arn"
697692
]
698-
},
699-
"Principal": "sns.amazonaws.com",
700-
"SourceArn": {
701-
"Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
702693
}
703694
}
704695
},
@@ -752,6 +743,9 @@
752743
]
753744
}
754745
},
746+
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": {
747+
"Type": "AWS::SNS::Topic"
748+
},
755749
"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookFFA63029": {
756750
"Type": "AWS::AutoScaling::LifecycleHook",
757751
"Properties": {
@@ -945,5 +939,11 @@
945939
}
946940
}
947941
}
942+
},
943+
"Parameters": {
944+
"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
945+
"Type": "AWS::SSM::Parameter::Value<String>",
946+
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
947+
}
948948
}
949-
}
949+
}

0 commit comments

Comments
 (0)