From b6af47b812055440517a9aabf7e7601ea3cb4cfc Mon Sep 17 00:00:00 2001 From: Alastair Watts Date: Tue, 2 Mar 2021 10:53:40 +0100 Subject: [PATCH 1/4] feat(ecs): ability to access tag parameter value of TagParameterContainerImage Allows you to use the tag elsewhere within the container definition (e.g. to inform monitoring services of the release version). fixes: #13202 --- .../lib/images/tag-parameter-container-image.ts | 16 ++++++++++++++++ .../images/tag-parameter-container-image.test.ts | 15 +++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts b/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts index b033e8783a514..41c18a8dfcf6d 100644 --- a/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts +++ b/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts @@ -49,4 +49,20 @@ export class TagParameterContainerImage extends ContainerImage { }, }); } + + /** + * Returns the value of the CloudFormation Parameter that represents the tag of the image + * in the ECR repository. + */ + public get tagParameterValue(): string { + return cdk.Lazy.string({ + produce: () => { + if (this.imageTagParameter) { + return this.imageTagParameter.writeAsString; + } else { + throw new Error('TagParameterContainerImage must be used in a container definition when using tagParameterValue'); + } + }, + }); + } } diff --git a/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts b/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts index d0fe101252e26..87f53045026ad 100644 --- a/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts +++ b/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts @@ -19,6 +19,21 @@ nodeunitShim({ SynthUtils.synthesize(stack); }, /TagParameterContainerImage must be used in a container definition when using tagParameterName/); + test.done(); + }, + 'throws an error when tagParameterValue() is used without binding the image'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const repository = new ecr.Repository(stack, 'Repository'); + const tagParameterContainerImage = new ecs.TagParameterContainerImage(repository); + new cdk.CfnOutput(stack, 'Output', { + value: tagParameterContainerImage.tagParameterValue, + }); + + test.throws(() => { + SynthUtils.synthesize(stack); + }, /TagParameterContainerImage must be used in a container definition when using tagParameterValue/); + test.done(); }, }, From e899790f79ad6d4906a9ea8f885ed66974b87dfd Mon Sep 17 00:00:00 2001 From: Alastair Watts Date: Tue, 2 Mar 2021 13:50:51 +0100 Subject: [PATCH 2/4] feat: add TagParameterContainerImage to ecs README --- packages/@aws-cdk/aws-ecs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/@aws-cdk/aws-ecs/README.md b/packages/@aws-cdk/aws-ecs/README.md index 438f63e14e009..69ec82513ba7e 100644 --- a/packages/@aws-cdk/aws-ecs/README.md +++ b/packages/@aws-cdk/aws-ecs/README.md @@ -287,6 +287,8 @@ obtained from either DockerHub or from ECR repositories, or built directly from image directly from a `Dockerfile` in your source directory. - `ecs.ContainerImage.fromDockerImageAsset(asset)`: uses an existing `@aws-cdk/aws-ecr-assets.DockerImageAsset` as a container image. +- `new ecs.TagParameterContainerImage(repository)`: use the given ECR repository as the image + but a CloudFormation parameter as the tag. ### Environment variables From 238ddc44c7b6612bfacee5650c270fb27f2dec55 Mon Sep 17 00:00:00 2001 From: Alastair Watts Date: Tue, 2 Mar 2021 13:53:51 +0100 Subject: [PATCH 3/4] feat: fix compilation --- .../aws-ecs/lib/images/tag-parameter-container-image.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts b/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts index 41c18a8dfcf6d..c6479f44b951b 100644 --- a/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts +++ b/packages/@aws-cdk/aws-ecs/lib/images/tag-parameter-container-image.ts @@ -58,7 +58,7 @@ export class TagParameterContainerImage extends ContainerImage { return cdk.Lazy.string({ produce: () => { if (this.imageTagParameter) { - return this.imageTagParameter.writeAsString; + return this.imageTagParameter.valueAsString; } else { throw new Error('TagParameterContainerImage must be used in a container definition when using tagParameterValue'); } From 8a5de24570439424ec21a9e489ee500213932fd3 Mon Sep 17 00:00:00 2001 From: Alastair Watts Date: Mon, 8 Mar 2021 09:37:45 +0100 Subject: [PATCH 4/4] feat: cleanup test --- .../aws-ecs/test/images/tag-parameter-container-image.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts b/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts index 87f53045026ad..d74ecb5335ac3 100644 --- a/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts +++ b/packages/@aws-cdk/aws-ecs/test/images/tag-parameter-container-image.test.ts @@ -21,6 +21,7 @@ nodeunitShim({ test.done(); }, + 'throws an error when tagParameterValue() is used without binding the image'(test: Test) { // GIVEN const stack = new cdk.Stack();