diff --git a/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts b/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts index fe17ce6cb2317..1861098e1395b 100644 --- a/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts +++ b/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts @@ -647,7 +647,7 @@ export class TaskDefinition extends TaskDefinitionBase { /** * Returns the container that match the provided containerName. */ - private findContainer(containerName: string): ContainerDefinition | undefined { + public findContainer(containerName: string): ContainerDefinition | undefined { return this.containers.find(c => c.containerName === containerName); } diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/lib/ecs/run-task.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/lib/ecs/run-task.ts index b53b7cbab9dcf..496decc60c851 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/lib/ecs/run-task.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/lib/ecs/run-task.ts @@ -262,7 +262,7 @@ export class EcsRunTask extends sfn.TaskStateBase implements ec2.IConnectable { for (const override of this.props.containerOverrides ?? []) { const name = override.containerDefinition.containerName; if (!cdk.Token.isUnresolved(name)) { - const cont = this.props.taskDefinition.node.tryFindChild(name); + const cont = this.props.taskDefinition.findContainer(name); if (!cont) { throw new Error(`Overrides mention container with name '${name}', but no such container in task definition`); } diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/ecs/run-tasks.test.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/test/ecs/run-tasks.test.ts index 947b5cb0c8986..8e93cdd6d0aab 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/ecs/run-tasks.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/ecs/run-tasks.test.ts @@ -48,6 +48,80 @@ test('Cannot create a Fargate task without a default container', () => { ).toThrowError(/must have at least one essential container/); }); +test('Cannot override container definitions when container is not in task definition', () => { + const taskDefinitionA = new ecs.TaskDefinition(stack, 'TaskDefinitionA', { + memoryMiB: '512', + cpu: '256', + compatibility: ecs.Compatibility.FARGATE, + }); + taskDefinitionA.addContainer('TheContainerA', { + image: ecs.ContainerImage.fromRegistry('foo/bar'), + memoryLimitMiB: 256, + }); + + const taskDefinitionB = new ecs.TaskDefinition(stack, 'TaskDefinitionB', { + memoryMiB: '512', + cpu: '256', + compatibility: ecs.Compatibility.FARGATE, + }); + const containerDefinitionB = taskDefinitionB.addContainer('TheContainerB', { + image: ecs.ContainerImage.fromRegistry('foo/bar'), + memoryLimitMiB: 256, + }); + + expect(() => + new tasks.EcsRunTask(stack, 'task', { + cluster, + taskDefinition: taskDefinitionA, + containerOverrides: [ + { + containerDefinition: containerDefinitionB, + environment: [{ name: 'SOME_KEY', value: sfn.JsonPath.stringAt('$.SomeKey') }], + }, + ], + launchTarget: new tasks.EcsFargateLaunchTarget(), + }).toStateJson(), + ).toThrowError(/no such container in task definition/); +}); + +test('Running a task with container override and container has explicitly set a container name', () => { + const taskDefinition = new ecs.TaskDefinition(stack, 'TD', { + memoryMiB: '512', + cpu: '256', + compatibility: ecs.Compatibility.FARGATE, + }); + const containerDefinition = taskDefinition.addContainer('TheContainer', { + containerName: 'ExplicitContainerName', + image: ecs.ContainerImage.fromRegistry('foo/bar'), + memoryLimitMiB: 256, + }); + + expect(stack.resolve( + new tasks.EcsRunTask(stack, 'task', { + cluster, + taskDefinition, + containerOverrides: [ + { + containerDefinition, + environment: [{ name: 'SOME_KEY', value: sfn.JsonPath.stringAt('$.SomeKey') }], + }, + ], + launchTarget: new tasks.EcsFargateLaunchTarget(), + }).toStateJson())).toHaveProperty('Parameters.Overrides', { + ContainerOverrides: [ + { + Environment: [ + { + Name: 'SOME_KEY', + 'Value.$': '$.SomeKey', + }, + ], + Name: 'ExplicitContainerName', + }, + ], + }); +}); + test('Running a Fargate Task', () => { const taskDefinition = new ecs.TaskDefinition(stack, 'TD', { memoryMiB: '512',