Skip to content

Commit 0d156a8

Browse files
authored
fix(ecs): allow passing execution role to imported TaskDefinitions (#24987)
See #24984 for details. TLDR; there's not a way currently exposed to define the `executionRole` on an imported `TaskDefinition`. This change allows optionally passing an `executionRole`. Fixes issue #24984. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 2d4a60d commit 0d156a8

9 files changed

+68
-2
lines changed

packages/aws-cdk-lib/aws-ecs/lib/base/_imported-task-definition.ts

+10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ export interface ImportedTaskDefinitionProps {
3434
* @default Permissions cannot be granted to the imported task.
3535
*/
3636
readonly taskRole?: IRole;
37+
38+
/**
39+
* The IAM role that grants containers and Fargate agents permission to make AWS API calls on your behalf.
40+
*
41+
* Some tasks do not have an execution role.
42+
*
43+
* @default - undefined
44+
*/
45+
readonly executionRole?: IRole;
3746
}
3847

3948
/**
@@ -70,6 +79,7 @@ export class ImportedTaskDefinition extends Resource implements IEc2TaskDefiniti
7079

7180
this.compatibility = props.compatibility ?? Compatibility.EC2_AND_FARGATE;
7281
this.taskDefinitionArn = props.taskDefinitionArn;
82+
this.executionRole = props.executionRole;
7383
this._taskRole = props.taskRole;
7484
this._networkMode = props.networkMode;
7585
}

packages/aws-cdk-lib/aws-ecs/lib/base/task-definition.ts

+10
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,15 @@ export interface CommonTaskDefinitionAttributes {
250250
* @default Permissions cannot be granted to the imported task.
251251
*/
252252
readonly taskRole?: iam.IRole;
253+
254+
/**
255+
* The IAM role that grants containers and Fargate agents permission to make AWS API calls on your behalf.
256+
*
257+
* Some tasks do not have an execution role.
258+
*
259+
* @default - undefined
260+
*/
261+
readonly executionRole?: iam.IRole;
253262
}
254263

255264
/**
@@ -317,6 +326,7 @@ export class TaskDefinition extends TaskDefinitionBase {
317326
compatibility: attrs.compatibility,
318327
networkMode: attrs.networkMode,
319328
taskRole: attrs.taskRole,
329+
executionRole: attrs.executionRole,
320330
});
321331
}
322332

packages/aws-cdk-lib/aws-ecs/lib/ec2/ec2-task-definition.ts

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export class Ec2TaskDefinition extends TaskDefinition implements IEc2TaskDefinit
106106
compatibility: Compatibility.EC2,
107107
networkMode: attrs.networkMode,
108108
taskRole: attrs.taskRole,
109+
executionRole: attrs.executionRole,
109110
});
110111
}
111112

packages/aws-cdk-lib/aws-ecs/lib/external/external-task-definition.ts

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export class ExternalTaskDefinition extends TaskDefinition implements IExternalT
6666
compatibility: Compatibility.EXTERNAL,
6767
networkMode: attrs.networkMode,
6868
taskRole: attrs.taskRole,
69+
executionRole: attrs.executionRole,
6970
});
7071
}
7172

packages/aws-cdk-lib/aws-ecs/lib/fargate/fargate-task-definition.ts

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export class FargateTaskDefinition extends TaskDefinition implements IFargateTas
120120
compatibility: Compatibility.FARGATE,
121121
networkMode: attrs.networkMode,
122122
taskRole: attrs.taskRole,
123+
executionRole: attrs.executionRole,
123124
});
124125
}
125126

packages/aws-cdk-lib/aws-ecs/test/ec2/ec2-task-definition.test.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1201,12 +1201,16 @@ describe('ec2 task definition', () => {
12011201
const expectTaskRole = new iam.Role(stack, 'TaskRole', {
12021202
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
12031203
});
1204+
const expectExecutionRole = new iam.Role(stack, 'ExecutionRole', {
1205+
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
1206+
});
12041207

12051208
// WHEN
12061209
const taskDefinition = ecs.Ec2TaskDefinition.fromEc2TaskDefinitionAttributes(stack, 'TD_ID', {
12071210
taskDefinitionArn: expectTaskDefinitionArn,
12081211
networkMode: expectNetworkMode,
12091212
taskRole: expectTaskRole,
1213+
executionRole: expectExecutionRole,
12101214
});
12111215

12121216
// THEN
@@ -1216,6 +1220,7 @@ describe('ec2 task definition', () => {
12161220
expect(taskDefinition.isFargateCompatible).toBeFalsy();
12171221
expect(taskDefinition.networkMode).toBe(expectNetworkMode);
12181222
expect(taskDefinition.taskRole).toBe(expectTaskRole);
1223+
expect(taskDefinition.executionRole).toEqual(expectExecutionRole);
12191224
});
12201225

12211226
test('returns an Ec2 TaskDefinition that will throw an error when trying to access its yet to defined networkMode', () => {

packages/aws-cdk-lib/aws-ecs/test/external/external-task-definition.test.ts

+29
Original file line numberDiff line numberDiff line change
@@ -617,4 +617,33 @@ describe('external task definition', () => {
617617
deviceType: 'eia2.medium',
618618
})).toThrow('Cannot use inference accelerators on tasks that run on External service');
619619
});
620+
621+
test('can import an External Task Definition using attributes', () => {
622+
// GIVEN
623+
const stack = new cdk.Stack();
624+
const expectTaskDefinitionArn = 'TD_ARN';
625+
const expectCompatibility = ecs.Compatibility.EXTERNAL;
626+
const expectNetworkMode = ecs.NetworkMode.AWS_VPC;
627+
const expectTaskRole = new iam.Role(stack, 'TaskRole', {
628+
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
629+
});
630+
const expectExecutionRole = new iam.Role(stack, 'ExecutionRole', {
631+
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
632+
});
633+
634+
// WHEN
635+
const taskDefinition = ecs.ExternalTaskDefinition.fromExternalTaskDefinitionAttributes(stack, 'TD_ID', {
636+
taskDefinitionArn: expectTaskDefinitionArn,
637+
networkMode: expectNetworkMode,
638+
taskRole: expectTaskRole,
639+
executionRole: expectExecutionRole,
640+
});
641+
642+
// THEN
643+
expect(taskDefinition.taskDefinitionArn).toEqual(expectTaskDefinitionArn);
644+
expect(taskDefinition.compatibility).toEqual(expectCompatibility);
645+
expect(taskDefinition.executionRole).toEqual(expectExecutionRole);
646+
expect(taskDefinition.networkMode).toEqual(expectNetworkMode);
647+
expect(taskDefinition.taskRole).toEqual(expectTaskRole);
648+
});
620649
});

packages/aws-cdk-lib/aws-ecs/test/fargate/fargate-task-definition.test.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,16 @@ describe('fargate task definition', () => {
190190
const expectTaskRole = new iam.Role(stack, 'TaskRole', {
191191
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
192192
});
193+
const expectExecutionRole = new iam.Role(stack, 'ExecutionRole', {
194+
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
195+
});
193196

194197
// WHEN
195198
const taskDefinition = ecs.FargateTaskDefinition.fromFargateTaskDefinitionAttributes(stack, 'TD_ID', {
196199
taskDefinitionArn: expectTaskDefinitionArn,
197200
networkMode: expectNetworkMode,
198201
taskRole: expectTaskRole,
202+
executionRole: expectExecutionRole,
199203
});
200204

201205
// THEN
@@ -205,6 +209,7 @@ describe('fargate task definition', () => {
205209
expect(taskDefinition.isEc2Compatible).toEqual(false);
206210
expect(taskDefinition.networkMode).toEqual(expectNetworkMode);
207211
expect(taskDefinition.taskRole).toEqual(expectTaskRole);
212+
expect(taskDefinition.executionRole).toEqual(expectExecutionRole);
208213

209214

210215
});
@@ -380,4 +385,4 @@ describe('fargate task definition', () => {
380385
});
381386

382387
});
383-
});
388+
});

packages/aws-cdk-lib/aws-ecs/test/task-definition.test.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -303,19 +303,23 @@ describe('task definition', () => {
303303
const expectTaskRole = new iam.Role(stack, 'TaskRole', {
304304
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
305305
});
306+
const expectExecutionRole = new iam.Role(stack, 'ExecutionRole', {
307+
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
308+
});
306309

307310
// WHEN
308311
const taskDefinition = ecs.TaskDefinition.fromTaskDefinitionAttributes(stack, 'TD_ID', {
309312
taskDefinitionArn: expectTaskDefinitionArn,
310313
compatibility: expectCompatibility,
311314
networkMode: expectNetworkMode,
312315
taskRole: expectTaskRole,
316+
executionRole: expectExecutionRole,
313317
});
314318

315319
// THEN
316320
expect(taskDefinition.taskDefinitionArn).toEqual(expectTaskDefinitionArn);
317321
expect(taskDefinition.compatibility).toEqual(expectCompatibility);
318-
expect(taskDefinition.executionRole).toEqual(undefined);
322+
expect(taskDefinition.executionRole).toEqual(expectExecutionRole);
319323
expect(taskDefinition.networkMode).toEqual(expectNetworkMode);
320324
expect(taskDefinition.taskRole).toEqual(expectTaskRole);
321325

0 commit comments

Comments
 (0)