@@ -125,6 +125,7 @@ test('Cannot supply revisionNumber when using taskDefinitionInput', () => {
125
125
cluster,
126
126
taskDefinitionInput : sfn . TaskInput . fromText ( 'arn:aws:ecs:us-east-1:111122223333:task-definition/TestTaskFamilyName:*' ) ,
127
127
revisionNumber : 1 ,
128
+ networkMode : ecs . NetworkMode . AWS_VPC ,
128
129
launchTarget : new tasks . EcsFargateLaunchTarget ( ) ,
129
130
} ) . toStateJson ( ) ,
130
131
) . toThrow ( / C a n n o t s u p p l y ' r e v i s i o n N u m b e r ' w h e n u s i n g ' t a s k D e f i n i t i o n I n p u t ' ./ ) ;
@@ -187,7 +188,7 @@ test('Cannot supply taskExecutionRole when using taskDefinition', () => {
187
188
) . toThrow ( / C a n n o t s u p p l y ' t a s k E x e c u t i o n R o l e ' w h e n u s i n g ' t a s k D e f i n i t i o n ' ./ ) ;
188
189
} ) ;
189
190
190
- test ( 'Cannot supply subnets when networkMode is not AWS_VPC ' , ( ) => {
191
+ test ( 'Cannot supply subnets when networkMode is not set ' , ( ) => {
191
192
expect ( ( ) =>
192
193
new tasks . EcsRunTask ( stack , 'task' , {
193
194
cluster,
@@ -197,15 +198,27 @@ test('Cannot supply subnets when networkMode is not AWS_VPC', () => {
197
198
subnets : vpc . selectSubnets ( { subnetType : ec2 . SubnetType . PRIVATE_WITH_EGRESS } ) ,
198
199
launchTarget : new tasks . EcsFargateLaunchTarget ( ) ,
199
200
} ) . toStateJson ( ) ,
200
- ) . toThrow ( / A ' n e t w o r k M o d e ' o f ' A W S _ V P C ' i s r e q u i r e d t o u s e ' v p c S u b n e t s ' a n d ' s e c u r i t y G r o u p ' . R e c e i v e d : u n d e f i n e d ./ ) ;
201
+ ) . toThrow ( / A ' n e t w o r k M o d e ' o f ' A W S _ V P C ' i s r e q u i r e d t o u s e ' v p c S u b n e t s ' a n d ' s e c u r i t y G r o u p ' . ' n e t w o r k M o d e ' i s n o t d e f i n e d ./ ) ;
202
+ } ) ;
203
+
204
+ test ( 'Cannot supply subnets when networkMode is bridge' , ( ) => {
205
+ expect ( ( ) =>
206
+ new tasks . EcsRunTask ( stack , 'task' , {
207
+ cluster,
208
+ taskDefinitionInput : sfn . TaskInput . fromText ( 'arn:aws:ecs:us-east-1:111122223333:task-definition/TestTaskFamilyName:*' ) ,
209
+ networkMode : ecs . NetworkMode . BRIDGE ,
210
+ securityGroups : undefined ,
211
+ subnets : vpc . selectSubnets ( { subnetType : ec2 . SubnetType . PRIVATE_WITH_EGRESS } ) ,
212
+ launchTarget : new tasks . EcsFargateLaunchTarget ( ) ,
213
+ } ) . toStateJson ( ) ,
214
+ ) . toThrow ( / A ' n e t w o r k M o d e ' o f ' A W S _ V P C ' i s r e q u i r e d t o u s e ' v p c S u b n e t s ' a n d ' s e c u r i t y G r o u p ' . R e c e i v e d : b r i d g e ./ ) ;
201
215
} ) ;
202
216
203
217
test ( 'Cannot supply securityGroups when networkMode is not AWS_VPC' , ( ) => {
204
218
expect ( ( ) =>
205
219
new tasks . EcsRunTask ( stack , 'task' , {
206
220
cluster,
207
221
taskDefinitionInput : sfn . TaskInput . fromText ( 'arn:aws:ecs:us-east-1:111122223333:task-definition/TestTaskFamilyName:*' ) ,
208
- networkMode : undefined ,
209
222
securityGroups : [ new ec2 . SecurityGroup ( stack , 'SecurityGroup1' , {
210
223
allowAllOutbound : true ,
211
224
description : 'Test Security Group' ,
@@ -215,7 +228,7 @@ test('Cannot supply securityGroups when networkMode is not AWS_VPC', () => {
215
228
subnets : undefined ,
216
229
launchTarget : new tasks . EcsFargateLaunchTarget ( ) ,
217
230
} ) . toStateJson ( ) ,
218
- ) . toThrow ( / A ' n e t w o r k M o d e ' o f ' A W S _ V P C ' i s r e q u i r e d t o u s e ' v p c S u b n e t s ' a n d ' s e c u r i t y G r o u p ' . R e c e i v e d : u n d e f i n e d ./ ) ;
231
+ ) . toThrow ( / A ' n e t w o r k M o d e ' o f ' A W S _ V P C ' i s r e q u i r e d t o u s e ' v p c S u b n e t s ' a n d ' s e c u r i t y G r o u p ' . ' n e t w o r k M o d e ' i s n o t d e f i n e d ./ ) ;
219
232
} ) ;
220
233
221
234
test ( 'Running a task with container override and container has explicitly set a container name' , ( ) => {
@@ -604,6 +617,12 @@ test('Running a Fargate Task - using JSONata', () => {
604
617
605
618
test ( 'Running a Fargate Task using taskDefinitionInput' , ( ) => {
606
619
const taskDefinitionInput = sfn . TaskInput . fromText ( 'arn:aws:ecs:us-east-1:111122223333:task-definition/TestTaskFamilyName:1' ) ;
620
+ const taskRole = new iam . Role ( stack , 'TaskRole' , {
621
+ assumedBy : new iam . ServicePrincipal ( 'ecs-tasks.amazonaws.com' ) ,
622
+ } ) ;
623
+ const taskExecutionRole = new iam . Role ( stack , 'ExecutionRole' , {
624
+ assumedBy : new iam . ServicePrincipal ( 'ecs-tasks.amazonaws.com' ) ,
625
+ } ) ;
607
626
608
627
// WHEN
609
628
const runTask = new tasks . EcsRunTask ( stack , 'RunFargate' , {
@@ -615,6 +634,8 @@ test('Running a Fargate Task using taskDefinitionInput', () => {
615
634
launchTarget : new tasks . EcsFargateLaunchTarget ( {
616
635
platformVersion : ecs . FargatePlatformVersion . VERSION1_4 ,
617
636
} ) ,
637
+ taskRole,
638
+ taskExecutionRole,
618
639
} ) ;
619
640
620
641
new sfn . StateMachine ( stack , 'SM' , {
@@ -669,6 +690,19 @@ test('Running a Fargate Task using taskDefinitionInput', () => {
669
690
Effect : 'Allow' ,
670
691
Resource : '*' ,
671
692
} ,
693
+ {
694
+ Action : 'iam:PassRole' ,
695
+ Condition : {
696
+ StringEquals : {
697
+ 'iam:PassedToService' : 'ecs-tasks.amazonaws.com' ,
698
+ } ,
699
+ } ,
700
+ Effect : 'Allow' ,
701
+ Resource : [
702
+ { 'Fn::GetAtt' : [ 'TaskRole30FC0FBB' , 'Arn' ] } ,
703
+ { 'Fn::GetAtt' : [ 'ExecutionRole605A040B' , 'Arn' ] } ,
704
+ ] ,
705
+ } ,
672
706
{
673
707
Action : [ 'events:PutTargets' , 'events:PutRule' , 'events:DescribeRule' ] ,
674
708
Effect : 'Allow' ,
@@ -750,6 +784,59 @@ test('Running a Fargate Task using JSONata for taskDefinitionInput', () => {
750
784
} ,
751
785
Type : 'Task' ,
752
786
} ) ;
787
+
788
+ Template . fromStack ( stack ) . hasResourceProperties ( 'AWS::IAM::Policy' , {
789
+ PolicyDocument : {
790
+ Statement : [
791
+ {
792
+ Action : 'ecs:RunTask' ,
793
+ Condition : {
794
+ ArnLike : {
795
+ 'ecs:cluster' : { 'Fn::GetAtt' : [ 'ClusterEB0386A7' , 'Arn' ] } ,
796
+ } ,
797
+ } ,
798
+ Effect : 'Allow' ,
799
+ Resource : '*' ,
800
+ } ,
801
+ {
802
+ Action : [ 'ecs:StopTask' , 'ecs:DescribeTasks' ] ,
803
+ Effect : 'Allow' ,
804
+ Resource : '*' ,
805
+ } ,
806
+ {
807
+ Action : 'iam:PassRole' ,
808
+ Condition : {
809
+ StringEquals : {
810
+ 'iam:PassedToService' : 'ecs-tasks.amazonaws.com' ,
811
+ } ,
812
+ } ,
813
+ Effect : 'Allow' ,
814
+ Resource : [
815
+ { 'Fn::GetAtt' : [ 'TaskRole30FC0FBB' , 'Arn' ] } ,
816
+ { 'Fn::GetAtt' : [ 'ExecutionRole605A040B' , 'Arn' ] } ,
817
+ ] ,
818
+ } ,
819
+ {
820
+ Action : [ 'events:PutTargets' , 'events:PutRule' , 'events:DescribeRule' ] ,
821
+ Effect : 'Allow' ,
822
+ Resource : {
823
+ 'Fn::Join' : [
824
+ '' ,
825
+ [
826
+ 'arn:' ,
827
+ { Ref : 'AWS::Partition' } ,
828
+ ':events:' ,
829
+ { Ref : 'AWS::Region' } ,
830
+ ':' ,
831
+ { Ref : 'AWS::AccountId' } ,
832
+ ':rule/StepFunctionsGetEventsForECSTaskRule' ,
833
+ ] ,
834
+ ] ,
835
+ } ,
836
+ } ,
837
+ ] ,
838
+ } ,
839
+ } ) ;
753
840
} ) ;
754
841
755
842
test ( 'Running an EC2 Task with bridge network' , ( ) => {
@@ -1013,6 +1100,56 @@ test('Running an EC2 Task with bridge network using JSONata taskDefinitionInput'
1013
1100
} ,
1014
1101
Type : 'Task' ,
1015
1102
} ) ;
1103
+
1104
+ Template . fromStack ( stack ) . hasResourceProperties ( 'AWS::IAM::Policy' , {
1105
+ PolicyDocument : {
1106
+ Statement : [
1107
+ {
1108
+ Action : 'ecs:RunTask' ,
1109
+ Condition : {
1110
+ ArnLike : {
1111
+ 'ecs:cluster' : { 'Fn::GetAtt' : [ 'ClusterEB0386A7' , 'Arn' ] } ,
1112
+ } ,
1113
+ } ,
1114
+ Effect : 'Allow' ,
1115
+ Resource : '*' ,
1116
+ } ,
1117
+ {
1118
+ Action : [ 'ecs:StopTask' , 'ecs:DescribeTasks' ] ,
1119
+ Effect : 'Allow' ,
1120
+ Resource : '*' ,
1121
+ } ,
1122
+ {
1123
+ Action : 'iam:PassRole' ,
1124
+ Condition : {
1125
+ StringEquals : {
1126
+ 'iam:PassedToService' : 'ecs-tasks.amazonaws.com' ,
1127
+ } ,
1128
+ } ,
1129
+ Effect : 'Allow' ,
1130
+ Resource : { 'Fn::GetAtt' : [ 'TaskRole30FC0FBB' , 'Arn' ] } ,
1131
+ } ,
1132
+ {
1133
+ Action : [ 'events:PutTargets' , 'events:PutRule' , 'events:DescribeRule' ] ,
1134
+ Effect : 'Allow' ,
1135
+ Resource : {
1136
+ 'Fn::Join' : [
1137
+ '' ,
1138
+ [
1139
+ 'arn:' ,
1140
+ { Ref : 'AWS::Partition' } ,
1141
+ ':events:' ,
1142
+ { Ref : 'AWS::Region' } ,
1143
+ ':' ,
1144
+ { Ref : 'AWS::AccountId' } ,
1145
+ ':rule/StepFunctionsGetEventsForECSTaskRule' ,
1146
+ ] ,
1147
+ ] ,
1148
+ } ,
1149
+ } ,
1150
+ ] ,
1151
+ } ,
1152
+ } ) ;
1016
1153
} ) ;
1017
1154
1018
1155
test ( 'Running an EC2 Task with placement strategies' , ( ) => {
0 commit comments