From 4350381a553341e800980c984dbfcaab3e6c1e8a Mon Sep 17 00:00:00 2001 From: Pahud Hsieh Date: Thu, 28 Aug 2025 08:59:14 -0400 Subject: [PATCH 1/3] fix(aws-lambda): handle Runtime.ALL correctly in LayerVersion compatibleRuntimes --- packages/aws-cdk-lib/aws-lambda/lib/layers.ts | 4 ++- .../aws-lambda/test/layers.test.ts | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/layers.ts b/packages/aws-cdk-lib/aws-lambda/lib/layers.ts index c5c196380a4bf..b59446e4de4c7 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/layers.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/layers.ts @@ -208,7 +208,9 @@ export class LayerVersion extends LayerVersionBase { } const resource: CfnLayerVersion = new CfnLayerVersion(this, 'Resource', { - compatibleRuntimes: props.compatibleRuntimes && props.compatibleRuntimes.map(r => r.name), + compatibleRuntimes: (props.compatibleRuntimes === Runtime.ALL) + ? undefined + : props.compatibleRuntimes?.map(r => r.name), compatibleArchitectures: props.compatibleArchitectures?.map(a => a.name), content: { s3Bucket: code.s3Location.bucketName, diff --git a/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts b/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts index 47386596cebe2..945167d019ade 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts @@ -122,4 +122,31 @@ describe('layers', () => { CompatibleArchitectures: ['arm64'], }); }); + + test('Runtime.ALL is handled correctly by omitting compatibleRuntimes', () => { + // GIVEN + const stack = new cdk.Stack(); + const bucket = new s3.Bucket(stack, 'Bucket'); + const code = new lambda.S3Code(bucket, 'ObjectKey'); + + // WHEN + new lambda.LayerVersion(stack, 'LayerVersion', { + code, + compatibleRuntimes: lambda.Runtime.ALL, + }); + + // THEN - CompatibleRuntimes should be omitted from CloudFormation template + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::Lambda::LayerVersion', { + Content: { + S3Bucket: stack.resolve(bucket.bucketName), + S3Key: 'ObjectKey', + }, + }); + + // Verify that CompatibleRuntimes is NOT present in the template + const resources = template.findResources('AWS::Lambda::LayerVersion'); + const layerResource = Object.values(resources)[0]; + expect(layerResource.Properties).not.toHaveProperty('CompatibleRuntimes'); + }); }); From f52675abb821c778a9446263c285f581dd28eacc Mon Sep 17 00:00:00 2001 From: Pahud Hsieh Date: Thu, 28 Aug 2025 08:59:22 -0400 Subject: [PATCH 2/3] fix(aws-lambda): handle Runtime.ALL correctly in LayerVersion compatibleRuntimes --- packages/aws-cdk-lib/aws-lambda/lib/layers.ts | 2 +- .../aws-lambda/test/layers.test.ts | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/layers.ts b/packages/aws-cdk-lib/aws-lambda/lib/layers.ts index b59446e4de4c7..8ac347fbc61f4 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/layers.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/layers.ts @@ -74,7 +74,7 @@ export interface ILayerVersion extends IResource { /** * The runtimes compatible with this Layer. * - * @default Runtime.All + * @default - All supported runtimes. Setting this to Runtime.ALL is equivalent to leaving it undefined. */ readonly compatibleRuntimes?: Runtime[]; diff --git a/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts b/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts index 945167d019ade..2cccaa027ad0f 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts @@ -149,4 +149,31 @@ describe('layers', () => { const layerResource = Object.values(resources)[0]; expect(layerResource.Properties).not.toHaveProperty('CompatibleRuntimes'); }); + + test('undefined compatibleRuntimes is handled correctly by omitting compatibleRuntimes', () => { + // GIVEN + const stack = new cdk.Stack(); + const bucket = new s3.Bucket(stack, 'Bucket'); + const code = new lambda.S3Code(bucket, 'ObjectKey'); + + // WHEN + new lambda.LayerVersion(stack, 'LayerVersion', { + code, + // compatibleRuntimes is undefined (default behavior) + }); + + // THEN - CompatibleRuntimes should be omitted from CloudFormation template + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::Lambda::LayerVersion', { + Content: { + S3Bucket: stack.resolve(bucket.bucketName), + S3Key: 'ObjectKey', + }, + }); + + // Verify that CompatibleRuntimes is NOT present in the template + const resources = template.findResources('AWS::Lambda::LayerVersion'); + const layerResource = Object.values(resources)[0]; + expect(layerResource.Properties).not.toHaveProperty('CompatibleRuntimes'); + }); }); From dcffad93b98adafb874304ea511e2d0c2fd1a597 Mon Sep 17 00:00:00 2001 From: Pahud Hsieh Date: Thu, 11 Sep 2025 16:01:49 -0400 Subject: [PATCH 3/3] use test.each() --- .../aws-lambda/test/layers.test.ts | 34 +++---------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts b/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts index 2cccaa027ad0f..35946e669566c 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/layers.test.ts @@ -123,7 +123,10 @@ describe('layers', () => { }); }); - test('Runtime.ALL is handled correctly by omitting compatibleRuntimes', () => { + test.each([ + ['Runtime.ALL is handled correctly', { compatibleRuntimes: lambda.Runtime.ALL }], + ['undefined compatibleRuntimes is handled correctly', {}], + ])('%s by omitting compatibleRuntimes', (_, props) => { // GIVEN const stack = new cdk.Stack(); const bucket = new s3.Bucket(stack, 'Bucket'); @@ -132,34 +135,7 @@ describe('layers', () => { // WHEN new lambda.LayerVersion(stack, 'LayerVersion', { code, - compatibleRuntimes: lambda.Runtime.ALL, - }); - - // THEN - CompatibleRuntimes should be omitted from CloudFormation template - const template = Template.fromStack(stack); - template.hasResourceProperties('AWS::Lambda::LayerVersion', { - Content: { - S3Bucket: stack.resolve(bucket.bucketName), - S3Key: 'ObjectKey', - }, - }); - - // Verify that CompatibleRuntimes is NOT present in the template - const resources = template.findResources('AWS::Lambda::LayerVersion'); - const layerResource = Object.values(resources)[0]; - expect(layerResource.Properties).not.toHaveProperty('CompatibleRuntimes'); - }); - - test('undefined compatibleRuntimes is handled correctly by omitting compatibleRuntimes', () => { - // GIVEN - const stack = new cdk.Stack(); - const bucket = new s3.Bucket(stack, 'Bucket'); - const code = new lambda.S3Code(bucket, 'ObjectKey'); - - // WHEN - new lambda.LayerVersion(stack, 'LayerVersion', { - code, - // compatibleRuntimes is undefined (default behavior) + ...props, }); // THEN - CompatibleRuntimes should be omitted from CloudFormation template