From 362479d9086002774c19ab8d55904c3106df6299 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Fri, 11 Aug 2023 22:57:57 +0000 Subject: [PATCH 01/12] add snapstart in L2 construnct --- .../aws-cdk-lib/aws-lambda/lib/function.ts | 40 +++++++++++++++++++ packages/aws-cdk-lib/aws-lambda/lib/index.ts | 1 + .../aws-lambda/lib/snapstart-management.ts | 7 ++++ .../aws-lambda/test/function.test.ts | 35 ++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index daef328fc8f50..d036a95858c11 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -29,6 +29,7 @@ import * as sns from '../../aws-sns'; import * as sqs from '../../aws-sqs'; import { Annotations, ArnFormat, CfnResource, Duration, FeatureFlags, Fn, IAspect, Lazy, Names, Size, Stack, Token } from '../../core'; import { LAMBDA_RECOGNIZE_LAYER_VERSION } from '../../cx-api'; +import { SnapStartConfig } from './snapstart-management' /** * X-Ray Tracing Modes (https://docs.aws.amazon.com/lambda/latest/dg/API_TracingConfig.html) @@ -225,6 +226,14 @@ export interface FunctionOptions extends EventInvokeConfigOptions { */ readonly tracing?: Tracing; + /** + * Enable SnapStart for Lambda Function. + * SnapStart is currently supported only for Java 11, 17 runtime + * + * @default - No snapstart + */ + readonly snapStart?: SnapStartConfig; + /** * Enable profiling. * @see https://docs.aws.amazon.com/codeguru/latest/profiler-ug/setting-up-lambda.html @@ -832,6 +841,7 @@ export class Function extends FunctionBase { codeSigningConfigArn: props.codeSigningConfig?.codeSigningConfigArn, architectures: this._architecture ? [this._architecture.name] : undefined, runtimeManagementConfig: props.runtimeManagementMode?.runtimeManagementConfig, + snapStart: this.configureSnapStart(props), }); if ((props.tracing !== undefined) || (props.adotInstrumentation !== undefined)) { @@ -1283,6 +1293,36 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett }; } + private configureSnapStart(props: FunctionProps): CfnFunction.SnapStartProperty | undefined { + if (!props.snapStart){ + return undefined; + } + + if (props.snapStart != SnapStartConfig.ON_PUBLISHED_VERSIONS){ + throw new Error('SnapStart is currently supported only published versions'); + } + + if (props.runtime != Runtime.JAVA_11 && props.runtime != Runtime.JAVA_17 ) { + throw new Error('SnapStart is currently supported only Java 11/Java 17 runtime'); + } + + if (props.architecture == Architecture.ARM_64){ + throw new Error('SnapStart is currently not supported on Arm_64'); + } + + // seems no provision concurrency in props? can't check it here + + if (props.filesystem){ + throw new Error('SnapStart is currently does not supported using EFS'); + } + + if (props.ephemeralStorageSize && props.ephemeralStorageSize?.toMebibytes() > 512){ + throw new Error('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); + } + + return SnapStartConfig.ON_PUBLISHED_VERSIONS; + } + private isQueue(deadLetterQueue: sqs.IQueue | sns.ITopic): deadLetterQueue is sqs.IQueue { return (deadLetterQueue).queueArn !== undefined; } diff --git a/packages/aws-cdk-lib/aws-lambda/lib/index.ts b/packages/aws-cdk-lib/aws-lambda/lib/index.ts index 0c8294f3f923f..4068d86b23714 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/index.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/index.ts @@ -25,6 +25,7 @@ export * from './architecture'; export * from './function-url'; export * from './runtime-management'; export * from './params-and-secrets-layers'; +export * from './snapstart-management' // AWS::Lambda CloudFormation Resources: export * from './lambda.generated'; diff --git a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts new file mode 100644 index 0000000000000..5046e633f7a38 --- /dev/null +++ b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts @@ -0,0 +1,7 @@ + +export class SnapStartConfig { + + public static readonly ON_PUBLISHED_VERSIONS = { applyOn: 'PublishedVersions' }; + + +} diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 83d25a6c13155..4ebd13af82473 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -3246,6 +3246,41 @@ test('set SnapStart to desired value', () => { }); }); + +test('function using SnapStart', () => { + const stack = new cdk.Stack(); + //WHEN + new lambda.Function(stack, 'MyLambda', { + code: lambda.Code.fromAsset('test/handler.zip'), + handler: 'example.Handler::handleRequest', + runtime: lambda.Runtime.JAVA_11, + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + }); + + //THEN + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { + Properties: + { + Handler: 'example.Handler::handleRequest', + Runtime: 'java11', + SnapStart: { + ApplyOn: 'PublishedVersions', + }, + }, + }); +}); + +test('runtime validation for snapStart', () => { + const stack = new cdk.Stack(); + + expect(() => new lambda.Function(stack, 'MyLambda', { + code: new lambda.InlineCode('foo'), + handler: 'bar', + runtime: lambda.Runtime.NODEJS_14_X, + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + })).toThrowError('SnapStart is currently supported only Java 11/Java 17 runtime'); +}); + function newTestLambda(scope: constructs.Construct) { return new lambda.Function(scope, 'MyLambda', { code: new lambda.InlineCode('foo'), From 400a97b0ff5d3fee587ec6627453b4482f6594e6 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Fri, 11 Aug 2023 23:58:42 +0000 Subject: [PATCH 02/12] fix type --- .../aws-lambda/lib/snapstart-management.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts index 5046e633f7a38..153b61eb102f7 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts @@ -1,7 +1,13 @@ - +import { CfnFunction } from './lambda.generated'; export class SnapStartConfig { - - public static readonly ON_PUBLISHED_VERSIONS = { applyOn: 'PublishedVersions' }; - - + + public static readonly ON_PUBLISHED_VERSIONS= new SnapStartConfig('PublishedVersions'); + + readonly snapConfig: CfnFunction.SnapStartProperty; + + protected constructor(public readonly applyValue: string) { + this.snapConfig = { + applyOn: applyValue, + }; + } } From 75960e3f1f3e7f55608d13aa5ab2a35c43ce52f8 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Fri, 11 Aug 2023 23:59:04 +0000 Subject: [PATCH 03/12] fix test err --- packages/aws-cdk-lib/aws-lambda/lib/function.ts | 2 +- packages/aws-cdk-lib/aws-lambda/test/function.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index d036a95858c11..aea95c76b3d67 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -1320,7 +1320,7 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett throw new Error('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); } - return SnapStartConfig.ON_PUBLISHED_VERSIONS; + return SnapStartConfig.ON_PUBLISHED_VERSIONS.snapConfig; } private isQueue(deadLetterQueue: sqs.IQueue | sns.ITopic): deadLetterQueue is sqs.IQueue { diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 4ebd13af82473..9fc11e538764a 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -3251,7 +3251,7 @@ test('function using SnapStart', () => { const stack = new cdk.Stack(); //WHEN new lambda.Function(stack, 'MyLambda', { - code: lambda.Code.fromAsset('test/handler.zip'), + code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), handler: 'example.Handler::handleRequest', runtime: lambda.Runtime.JAVA_11, snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, From 19cc5041d56fcf8ff521d6c04d6fb6c44bbf1ed5 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Mon, 14 Aug 2023 23:37:59 +0000 Subject: [PATCH 04/12] add test, doc, comment --- packages/aws-cdk-lib/aws-lambda/README.md | 17 +++++++++++++++++ packages/aws-cdk-lib/aws-lambda/lib/function.ts | 7 ++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-lambda/README.md b/packages/aws-cdk-lib/aws-lambda/README.md index 30b5839687637..2f81c1a6f56dd 100644 --- a/packages/aws-cdk-lib/aws-lambda/README.md +++ b/packages/aws-cdk-lib/aws-lambda/README.md @@ -902,6 +902,23 @@ const fn = new lambda.Function(this, 'MyFunction', { See [the AWS documentation](https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html) managing concurrency. +## Lambda with SnapStart + +SnapStart is currently supported only on Java 11/Java 17 runtime. SnapStart does not support provisioned concurrency, the arm64 architecture, Amazon Elastic File System (Amazon EFS), or ephemeral storage greater than 512 MB. After you enable Lambda SnapStart for a particular Lambda function, publishing a new version of the function will trigger an optimization process. + +See [the AWS documentation](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) to learn more about AWS Lambda SnapStart + +```ts +const fn = new lambda.Function(this, 'MyFunction', { + code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), + runtime: lambda.Runtime.JAVA_11, + handler: 'example.Handler::handleRequest', + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + }); + +const version = fn.currentVersion; +``` + ## AutoScaling You can use Application AutoScaling to automatically configure the provisioned concurrency for your functions. AutoScaling can be set to track utilization or be based on a schedule. To configure AutoScaling on a function alias: diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index aea95c76b3d67..f8dfd8455a512 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -1294,10 +1294,15 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett } private configureSnapStart(props: FunctionProps): CfnFunction.SnapStartProperty | undefined { + // return/exit if no snapStart included if (!props.snapStart){ return undefined; } + // SnapStart does not support provisioned concurrency, arm64 architecture, + // Amazon Elastic File System (Amazon EFS), or ephemeral storage greater than 512 MB. + // SnapStart supports the Java 11 and Java 17 (java11 and java17) managed runtimes. + // See https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html if (props.snapStart != SnapStartConfig.ON_PUBLISHED_VERSIONS){ throw new Error('SnapStart is currently supported only published versions'); } @@ -1320,7 +1325,7 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett throw new Error('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); } - return SnapStartConfig.ON_PUBLISHED_VERSIONS.snapConfig; + return props.snapStart.snapStartConfig; } private isQueue(deadLetterQueue: sqs.IQueue | sns.ITopic): deadLetterQueue is sqs.IQueue { From 5ff6bd16be2087c6b1524ad9c6d733ec21eee4ba Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Mon, 14 Aug 2023 23:38:30 +0000 Subject: [PATCH 05/12] add test --- .../aws-lambda/lib/snapstart-management.ts | 7 +- .../aws-lambda/test/function.test.ts | 172 +++++++++++------- 2 files changed, 115 insertions(+), 64 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts index 153b61eb102f7..6eb284a8fcaf2 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts @@ -1,12 +1,13 @@ import { CfnFunction } from './lambda.generated'; export class SnapStartConfig { - + // Enable SnapStart on published lambda versions, this is the only available option available + // see https://docs.aws.amazon.com/lambda/latest/dg/API_SnapStart.html public static readonly ON_PUBLISHED_VERSIONS= new SnapStartConfig('PublishedVersions'); - readonly snapConfig: CfnFunction.SnapStartProperty; + readonly snapStartConfig: CfnFunction.SnapStartProperty; protected constructor(public readonly applyValue: string) { - this.snapConfig = { + this.snapStartConfig = { applyOn: applyValue, }; } diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 9fc11e538764a..b2f69b6ce9eda 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -2979,6 +2979,115 @@ describe('function', () => { }); }); + describe('SnapStart', () => { + test('set SnapStart to desired value', () => { + const stack = new cdk.Stack(); + new lambda.CfnFunction(stack, 'MyLambda', { + code: { + zipFile: 'java11-test-function.zip', + }, + functionName: 'MyCDK-SnapStart-Function', + handler: 'example.Handler::handleRequest', + role: 'testRole', + runtime: 'java11', + snapStart: { applyOn: 'PublishedVersions' }, + }); + + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { + Properties: + { + Code: { ZipFile: 'java11-test-function.zip' }, + Handler: 'example.Handler::handleRequest', + Runtime: 'java11', + SnapStart: { + ApplyOn: 'PublishedVersions', + }, + }, + }); + }); + + + test('function using SnapStart', () => { + const stack = new cdk.Stack(); + //WHEN + new lambda.Function(stack, 'MyLambda', { + code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), + handler: 'example.Handler::handleRequest', + runtime: lambda.Runtime.JAVA_11, + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + }); + + //THEN + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { + Properties: + { + Handler: 'example.Handler::handleRequest', + Runtime: 'java11', + SnapStart: { + ApplyOn: 'PublishedVersions', + }, + }, + }); + }); + + test('runtime validation for snapStart', () => { + const stack = new cdk.Stack(); + + expect(() => new lambda.Function(stack, 'MyLambda', { + code: new lambda.InlineCode('foo'), + handler: 'bar', + runtime: lambda.Runtime.NODEJS_14_X, + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + })).toThrowError('SnapStart is currently supported only Java 11/Java 17 runtime'); + }); + + test('arm64 validation for snapStart', () => { + const stack = new cdk.Stack(); + + expect(() => new lambda.Function(stack, 'MyLambda', { + code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), + handler: 'example.Handler::handleRequest', + runtime: lambda.Runtime.JAVA_11, + architecture: lambda.Architecture.ARM_64, + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + })).toThrowError('SnapStart is currently not supported on Arm_64'); + }); + + test('EFS validation for snapStart', () => { + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'Vpc', { + maxAzs: 3, + natGateways: 1, + }); + + const fs = new efs.FileSystem(stack, 'Efs', { + vpc, + }); + const accessPoint = fs.addAccessPoint('AccessPoint'); + + expect(() => new lambda.Function(stack, 'MyLambda', { + vpc, + code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), + handler: 'example.Handler::handleRequest', + runtime: lambda.Runtime.JAVA_11, + filesystem: lambda.FileSystem.fromEfsAccessPoint(accessPoint, '/mnt/msg'), + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + })).toThrowError('SnapStart is currently does not supported using EFS'); + }); + + test('arm64 validation for snapStart', () => { + const stack = new cdk.Stack(); + + expect(() => new lambda.Function(stack, 'MyLambda', { + code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), + handler: 'example.Handler::handleRequest', + runtime: lambda.Runtime.JAVA_11, + ephemeralStorageSize: Size.mebibytes(1024), + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + })).toThrowError('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); + }); + }); + test('called twice for the same service principal but with different conditions', () => { // GIVEN const stack = new cdk.Stack(); @@ -3139,6 +3248,8 @@ describe('function', () => { }), ).toThrow(/ADOT Lambda layer can't be configured with container image package type/); }); + + }); test('throws if ephemeral storage size is out of bound', () => { @@ -3220,67 +3331,6 @@ test('function using a reserved environment variable', () => { })).toThrow(/AWS_REGION environment variable is reserved/); }); -test('set SnapStart to desired value', () => { - const stack = new cdk.Stack(); - new lambda.CfnFunction(stack, 'MyLambda', { - code: { - zipFile: 'java11-test-function.zip', - }, - functionName: 'MyCDK-SnapStart-Function', - handler: 'example.Handler::handleRequest', - role: 'testRole', - runtime: 'java11', - snapStart: { applyOn: 'PublishedVersions' }, - }); - - Template.fromStack(stack).hasResource('AWS::Lambda::Function', { - Properties: - { - Code: { ZipFile: 'java11-test-function.zip' }, - Handler: 'example.Handler::handleRequest', - Runtime: 'java11', - SnapStart: { - ApplyOn: 'PublishedVersions', - }, - }, - }); -}); - - -test('function using SnapStart', () => { - const stack = new cdk.Stack(); - //WHEN - new lambda.Function(stack, 'MyLambda', { - code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), - handler: 'example.Handler::handleRequest', - runtime: lambda.Runtime.JAVA_11, - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, - }); - - //THEN - Template.fromStack(stack).hasResource('AWS::Lambda::Function', { - Properties: - { - Handler: 'example.Handler::handleRequest', - Runtime: 'java11', - SnapStart: { - ApplyOn: 'PublishedVersions', - }, - }, - }); -}); - -test('runtime validation for snapStart', () => { - const stack = new cdk.Stack(); - - expect(() => new lambda.Function(stack, 'MyLambda', { - code: new lambda.InlineCode('foo'), - handler: 'bar', - runtime: lambda.Runtime.NODEJS_14_X, - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, - })).toThrowError('SnapStart is currently supported only Java 11/Java 17 runtime'); -}); - function newTestLambda(scope: constructs.Construct) { return new lambda.Function(scope, 'MyLambda', { code: new lambda.InlineCode('foo'), From 7c7ad7cadaaaaf940e818be4878ecdcb40b85fd9 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Tue, 15 Aug 2023 00:39:15 +0000 Subject: [PATCH 06/12] address few problem per Renato's feedback --- packages/aws-cdk-lib/aws-lambda/lib/function.ts | 15 +++++++-------- packages/aws-cdk-lib/aws-lambda/lib/index.ts | 2 +- ...napstart-management.ts => snapstart-config.ts} | 0 .../aws-cdk-lib/aws-lambda/test/function.test.ts | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) rename packages/aws-cdk-lib/aws-lambda/lib/{snapstart-management.ts => snapstart-config.ts} (100%) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index f8dfd8455a512..4d07188e9ee6a 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -29,7 +29,7 @@ import * as sns from '../../aws-sns'; import * as sqs from '../../aws-sqs'; import { Annotations, ArnFormat, CfnResource, Duration, FeatureFlags, Fn, IAspect, Lazy, Names, Size, Stack, Token } from '../../core'; import { LAMBDA_RECOGNIZE_LAYER_VERSION } from '../../cx-api'; -import { SnapStartConfig } from './snapstart-management' +import { SnapStartConfig } from './snapstart-config' /** * X-Ray Tracing Modes (https://docs.aws.amazon.com/lambda/latest/dg/API_TracingConfig.html) @@ -1299,26 +1299,25 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett return undefined; } - // SnapStart does not support provisioned concurrency, arm64 architecture, - // Amazon Elastic File System (Amazon EFS), or ephemeral storage greater than 512 MB. + // SnapStart does not support arm64 architecture, Amazon Elastic File System (Amazon EFS), or ephemeral storage greater than 512 MB. + // SnapStart doesn't support provisioned concurrency either, but that's configured at the version level, + // so it can't be checked at function set up time // SnapStart supports the Java 11 and Java 17 (java11 and java17) managed runtimes. // See https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html if (props.snapStart != SnapStartConfig.ON_PUBLISHED_VERSIONS){ - throw new Error('SnapStart is currently supported only published versions'); + throw new Error('SnapStart currently only support published versions'); } if (props.runtime != Runtime.JAVA_11 && props.runtime != Runtime.JAVA_17 ) { - throw new Error('SnapStart is currently supported only Java 11/Java 17 runtime'); + throw new Error('SnapStart currently only support Java 11/Java 17 runtime'); } if (props.architecture == Architecture.ARM_64){ throw new Error('SnapStart is currently not supported on Arm_64'); } - // seems no provision concurrency in props? can't check it here - if (props.filesystem){ - throw new Error('SnapStart is currently does not supported using EFS'); + throw new Error('SnapStart is currently not supported using EFS'); } if (props.ephemeralStorageSize && props.ephemeralStorageSize?.toMebibytes() > 512){ diff --git a/packages/aws-cdk-lib/aws-lambda/lib/index.ts b/packages/aws-cdk-lib/aws-lambda/lib/index.ts index 4068d86b23714..d42aa1ed74c15 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/index.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/index.ts @@ -25,7 +25,7 @@ export * from './architecture'; export * from './function-url'; export * from './runtime-management'; export * from './params-and-secrets-layers'; -export * from './snapstart-management' +export * from './snapstart-config' // AWS::Lambda CloudFormation Resources: export * from './lambda.generated'; diff --git a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-config.ts similarity index 100% rename from packages/aws-cdk-lib/aws-lambda/lib/snapstart-management.ts rename to packages/aws-cdk-lib/aws-lambda/lib/snapstart-config.ts diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index b2f69b6ce9eda..224d9628fb3fd 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -3038,7 +3038,7 @@ describe('function', () => { handler: 'bar', runtime: lambda.Runtime.NODEJS_14_X, snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, - })).toThrowError('SnapStart is currently supported only Java 11/Java 17 runtime'); + })).toThrowError('SnapStart currently only support Java 11/Java 17 runtime'); }); test('arm64 validation for snapStart', () => { @@ -3072,7 +3072,7 @@ describe('function', () => { runtime: lambda.Runtime.JAVA_11, filesystem: lambda.FileSystem.fromEfsAccessPoint(accessPoint, '/mnt/msg'), snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, - })).toThrowError('SnapStart is currently does not supported using EFS'); + })).toThrowError('SnapStart is currently not supported using EFS'); }); test('arm64 validation for snapStart', () => { From 0d57360ff51624042220d5835fb7821bb5ef5061 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Tue, 15 Aug 2023 22:04:42 +0000 Subject: [PATCH 07/12] add integration test and snapshot. the original handler.zip file is corrupted so added a new one --- .../aws-lambda/test/handler-snapstart.zip | Bin 0 -> 236 bytes ...04591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip | Bin 0 -> 236 bytes .../aws-cdk-lambda-1.assets.json | 19 +- .../aws-cdk-lambda-1.template.json | 69 +++++- .../test/integ.lambda.js.snapshot/cdk.out | 2 +- .../test/integ.lambda.js.snapshot/integ.json | 2 +- .../integ.lambda.js.snapshot/manifest.json | 37 +-- .../test/integ.lambda.js.snapshot/tree.json | 211 +++++++++++++++--- .../test/aws-lambda/test/integ.lambda.ts | 9 + .../aws-cdk-lib/aws-lambda/lib/function.ts | 20 +- packages/aws-cdk-lib/aws-lambda/lib/index.ts | 2 +- .../aws-lambda/test/function.test.ts | 27 +-- 12 files changed, 312 insertions(+), 86 deletions(-) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/handler-snapstart.zip create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/asset.a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/handler-snapstart.zip b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/handler-snapstart.zip new file mode 100644 index 0000000000000000000000000000000000000000..eae53ec32da7ae41f34ca2ad18e5d75b4057561c GIT binary patch literal 236 zcmWIWW@Zs#U|`^2II{Ya&kY}@YBwOyA1ornkeQc~TA^1^85+XLz--X&A1&JLA6;6( z&A`Z_y{T7&`kL^=Qf literal 0 HcmV?d00001 diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/asset.a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/asset.a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip new file mode 100644 index 0000000000000000000000000000000000000000..eae53ec32da7ae41f34ca2ad18e5d75b4057561c GIT binary patch literal 236 zcmWIWW@Zs#U|`^2II{Ya&kY}@YBwOyA1ornkeQc~TA^1^85+XLz--X&A1&JLA6;6( z&A`Z_y{T7&`kL^=Qf literal 0 HcmV?d00001 diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.assets.json index 8d61d22779029..a09c57ed5a023 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.assets.json @@ -1,7 +1,20 @@ { - "version": "21.0.0", + "version": "33.0.0", "files": { - "811c02a1b423ba875c9e41bef2453805f9bd51c7419b5e04664f0e386b7fb4d0": { + "a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f": { + "source": { + "path": "asset.a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "931b3e911bae7029fea07c3a55bc0b5bd8a87b82655f47d331322d9b0245b56f": { "source": { "path": "aws-cdk-lambda-1.template.json", "packaging": "file" @@ -9,7 +22,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "811c02a1b423ba875c9e41bef2453805f9bd51c7419b5e04664f0e386b7fb4d0.json", + "objectKey": "931b3e911bae7029fea07c3a55bc0b5bd8a87b82655f47d331322d9b0245b56f.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.template.json index 1ca9aa3bc8e44..93570c0aadf3a 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/aws-cdk-lambda-1.template.json @@ -58,14 +58,14 @@ "Code": { "ZipFile": "foo" }, + "Description": "version-hash:1786de9fc1bc4cb2fd5b64d612628c6f", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn" ] }, - "Description": "version-hash:1786de9fc1bc4cb2fd5b64d612628c6f", - "Handler": "index.handler", "Runtime": "nodejs14.x" }, "DependsOn": [ @@ -122,13 +122,13 @@ "Type": "AWS::Lambda::Url", "Properties": { "AuthType": "NONE", + "Qualifier": "prod", "TargetFunctionArn": { "Fn::GetAtt": [ "MyLambdaCCE802FB", "Arn" ] - }, - "Qualifier": "prod" + } }, "DependsOn": [ "Alias325C5727" @@ -141,9 +141,66 @@ "FunctionName": { "Ref": "Alias325C5727" }, - "Principal": "*", - "FunctionUrlAuthType": "NONE" + "FunctionUrlAuthType": "NONE", + "Principal": "*" } + }, + "MySnapStartLambdaServiceRoleE0F04324": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "MySnapStartLambda8F562E6E": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip" + }, + "Description": "version-hash:cb4acf3f2fee0dc7ef3d57cc9e3c231f", + "Handler": "example.Handler::handleRequest", + "Role": { + "Fn::GetAtt": [ + "MySnapStartLambdaServiceRoleE0F04324", + "Arn" + ] + }, + "Runtime": "java11", + "SnapStart": { + "ApplyOn": "PublishedVersions" + } + }, + "DependsOn": [ + "MySnapStartLambdaServiceRoleE0F04324" + ] } }, "Parameters": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/cdk.out index 8ecc185e9dbee..560dae10d018f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"21.0.0"} \ No newline at end of file +{"version":"33.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/integ.json index 42adb4c4c7fb2..46bf806e87a36 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "33.0.0", "testCases": { "integ.lambda": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/manifest.json index 47584f5ea926a..8452aef7e9ad7 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/manifest.json @@ -1,12 +1,6 @@ { - "version": "21.0.0", + "version": "33.0.0", "artifacts": { - "Tree": { - "type": "cdk:tree", - "properties": { - "file": "tree.json" - } - }, "aws-cdk-lambda-1.assets": { "type": "cdk:asset-manifest", "properties": { @@ -23,7 +17,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/811c02a1b423ba875c9e41bef2453805f9bd51c7419b5e04664f0e386b7fb4d0.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/931b3e911bae7029fea07c3a55bc0b5bd8a87b82655f47d331322d9b0245b56f.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -93,29 +87,38 @@ "data": "Aliasinvokefunctionurl4CA9917B" } ], - "/aws-cdk-lambda-1/BootstrapVersion": [ + "/aws-cdk-lambda-1/MySnapStartLambda/ServiceRole/Resource": [ { "type": "aws:cdk:logicalId", - "data": "BootstrapVersion" + "data": "MySnapStartLambdaServiceRoleE0F04324" } ], - "/aws-cdk-lambda-1/CheckBootstrapVersion": [ + "/aws-cdk-lambda-1/MySnapStartLambda/Resource": [ { "type": "aws:cdk:logicalId", - "data": "CheckBootstrapVersion" + "data": "MySnapStartLambda8F562E6E" + } + ], + "/aws-cdk-lambda-1/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" } ], - "MyLambdaCurrentVersionE7A382CC1786de9fc1bc4cb2fd5b64d612628c6f": [ + "/aws-cdk-lambda-1/CheckBootstrapVersion": [ { "type": "aws:cdk:logicalId", - "data": "MyLambdaCurrentVersionE7A382CC1786de9fc1bc4cb2fd5b64d612628c6f", - "trace": [ - "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" - ] + "data": "CheckBootstrapVersion" } ] }, "displayName": "aws-cdk-lambda-1" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/tree.json index 3a46a0555fa18..9bcc9f0f2795b 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.js.snapshot/tree.json @@ -4,14 +4,6 @@ "id": "App", "path": "", "children": { - "Tree": { - "id": "Tree", - "path": "Tree", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.85" - } - }, "aws-cdk-lambda-1": { "id": "aws-cdk-lambda-1", "path": "aws-cdk-lambda-1", @@ -24,6 +16,14 @@ "id": "ServiceRole", "path": "aws-cdk-lambda-1/MyLambda/ServiceRole", "children": { + "ImportServiceRole": { + "id": "ImportServiceRole", + "path": "aws-cdk-lambda-1/MyLambda/ServiceRole/ImportServiceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, "Resource": { "id": "Resource", "path": "aws-cdk-lambda-1/MyLambda/ServiceRole/Resource", @@ -59,7 +59,7 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnRole", + "fqn": "aws-cdk-lib.aws_iam.CfnRole", "version": "0.0.0" } }, @@ -92,19 +92,19 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnPolicy", + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Policy", + "fqn": "aws-cdk-lib.aws_iam.Policy", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Role", + "fqn": "aws-cdk-lib.aws_iam.Role", "version": "0.0.0" } }, @@ -117,18 +117,18 @@ "code": { "zipFile": "foo" }, + "handler": "index.handler", "role": { "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn" ] }, - "handler": "index.handler", "runtime": "nodejs14.x" } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnFunction", + "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", "version": "0.0.0" } }, @@ -152,13 +152,13 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnUrl", + "fqn": "aws-cdk-lib.aws_lambda.CfnUrl", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.FunctionUrl", + "fqn": "aws-cdk-lib.aws_lambda.FunctionUrl", "version": "0.0.0" } }, @@ -178,19 +178,19 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnVersion", + "fqn": "aws-cdk-lib.aws_lambda.CfnVersion", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.Version", + "fqn": "aws-cdk-lib.aws_lambda.Version", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.Function", + "fqn": "aws-cdk-lib.aws_lambda.Function", "version": "0.0.0" } }, @@ -217,7 +217,7 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnAlias", + "fqn": "aws-cdk-lib.aws_lambda.CfnAlias", "version": "0.0.0" } }, @@ -225,7 +225,7 @@ "id": "ScalingRole", "path": "aws-cdk-lambda-1/Alias/ScalingRole", "constructInfo": { - "fqn": "@aws-cdk/core.Resource", + "fqn": "aws-cdk-lib.Resource", "version": "0.0.0" } }, @@ -243,7 +243,7 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnPermission", + "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", "version": "0.0.0" } }, @@ -258,23 +258,23 @@ "aws:cdk:cloudformation:type": "AWS::Lambda::Url", "aws:cdk:cloudformation:props": { "authType": "NONE", + "qualifier": "prod", "targetFunctionArn": { "Fn::GetAtt": [ "MyLambdaCCE802FB", "Arn" ] - }, - "qualifier": "prod" + } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnUrl", + "fqn": "aws-cdk-lib.aws_lambda.CfnUrl", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.FunctionUrl", + "fqn": "aws-cdk-lib.aws_lambda.FunctionUrl", "version": "0.0.0" } }, @@ -288,30 +288,177 @@ "functionName": { "Ref": "Alias325C5727" }, - "principal": "*", - "functionUrlAuthType": "NONE" + "functionUrlAuthType": "NONE", + "principal": "*" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Alias", + "version": "0.0.0" + } + }, + "MySnapStartLambda": { + "id": "MySnapStartLambda", + "path": "aws-cdk-lambda-1/MySnapStartLambda", + "children": { + "ServiceRole": { + "id": "ServiceRole", + "path": "aws-cdk-lambda-1/MySnapStartLambda/ServiceRole", + "children": { + "ImportServiceRole": { + "id": "ImportServiceRole", + "path": "aws-cdk-lambda-1/MySnapStartLambda/ServiceRole/ImportServiceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-lambda-1/MySnapStartLambda/ServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "managedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "Code": { + "id": "Code", + "path": "aws-cdk-lambda-1/MySnapStartLambda/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "aws-cdk-lambda-1/MySnapStartLambda/Code/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "0.0.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "aws-cdk-lambda-1/MySnapStartLambda/Code/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "0.0.0" + } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnPermission", + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-lambda-1/MySnapStartLambda/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip" + }, + "handler": "example.Handler::handleRequest", + "role": { + "Fn::GetAtt": [ + "MySnapStartLambdaServiceRoleE0F04324", + "Arn" + ] + }, + "runtime": "java11", + "snapStart": { + "applyOn": "PublishedVersions" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.Alias", + "fqn": "aws-cdk-lib.aws_lambda.Function", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "aws-cdk-lambda-1/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "aws-cdk-lambda-1/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/core.Stack", + "fqn": "aws-cdk-lib.Stack", "version": "0.0.0" } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.2.69" + } } }, "constructInfo": { - "fqn": "@aws-cdk/core.App", + "fqn": "aws-cdk-lib.App", "version": "0.0.0" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts index 5e441fd1f6228..17e960b8cf3c5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts @@ -2,6 +2,7 @@ import * as iam from 'aws-cdk-lib/aws-iam'; import * as cdk from 'aws-cdk-lib'; import { LAMBDA_RECOGNIZE_LAYER_VERSION } from 'aws-cdk-lib/cx-api'; import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as path from 'path'; const app = new cdk.App(); @@ -36,4 +37,12 @@ alias.addFunctionUrl({ // to validate the changed function hash. cdk.Aspects.of(stack).add(new lambda.FunctionVersionUpgrade(LAMBDA_RECOGNIZE_LAYER_VERSION)); + +new lambda.Function(stack, 'MySnapStartLambda', { + code: lambda.Code.fromAsset(path.join(__dirname, 'handler-snapstart.zip')), + handler: 'example.Handler::handleRequest', + runtime: lambda.Runtime.JAVA_11, + snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, +}); + app.synth(); diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index 4d07188e9ee6a..37e16a7215aa7 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -18,6 +18,7 @@ import { LogRetentionRetryOptions } from './log-retention'; import { ParamsAndSecretsLayerVersion } from './params-and-secrets-layers'; import { Runtime, RuntimeFamily } from './runtime'; import { RuntimeManagementMode } from './runtime-management'; +import { SnapStartConfig } from './snapstart-config'; import { addAlias } from './util'; import * as cloudwatch from '../../aws-cloudwatch'; import { IProfilingGroup, ProfilingGroup, ComputePlatform } from '../../aws-codeguruprofiler'; @@ -29,7 +30,6 @@ import * as sns from '../../aws-sns'; import * as sqs from '../../aws-sqs'; import { Annotations, ArnFormat, CfnResource, Duration, FeatureFlags, Fn, IAspect, Lazy, Names, Size, Stack, Token } from '../../core'; import { LAMBDA_RECOGNIZE_LAYER_VERSION } from '../../cx-api'; -import { SnapStartConfig } from './snapstart-config' /** * X-Ray Tracing Modes (https://docs.aws.amazon.com/lambda/latest/dg/API_TracingConfig.html) @@ -232,7 +232,7 @@ export interface FunctionOptions extends EventInvokeConfigOptions { * * @default - No snapstart */ - readonly snapStart?: SnapStartConfig; + readonly snapStart?: SnapStartConfig; /** * Enable profiling. @@ -1295,32 +1295,32 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett private configureSnapStart(props: FunctionProps): CfnFunction.SnapStartProperty | undefined { // return/exit if no snapStart included - if (!props.snapStart){ + if (!props.snapStart) { return undefined; } // SnapStart does not support arm64 architecture, Amazon Elastic File System (Amazon EFS), or ephemeral storage greater than 512 MB. - // SnapStart doesn't support provisioned concurrency either, but that's configured at the version level, + // SnapStart doesn't support provisioned concurrency either, but that's configured at the version level, // so it can't be checked at function set up time // SnapStart supports the Java 11 and Java 17 (java11 and java17) managed runtimes. // See https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html - if (props.snapStart != SnapStartConfig.ON_PUBLISHED_VERSIONS){ + if (props.snapStart != SnapStartConfig.ON_PUBLISHED_VERSIONS) { throw new Error('SnapStart currently only support published versions'); } if (props.runtime != Runtime.JAVA_11 && props.runtime != Runtime.JAVA_17 ) { throw new Error('SnapStart currently only support Java 11/Java 17 runtime'); } - - if (props.architecture == Architecture.ARM_64){ + + if (props.architecture == Architecture.ARM_64) { throw new Error('SnapStart is currently not supported on Arm_64'); } - if (props.filesystem){ + if (props.filesystem) { throw new Error('SnapStart is currently not supported using EFS'); } - - if (props.ephemeralStorageSize && props.ephemeralStorageSize?.toMebibytes() > 512){ + + if (props.ephemeralStorageSize && props.ephemeralStorageSize?.toMebibytes() > 512) { throw new Error('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); } diff --git a/packages/aws-cdk-lib/aws-lambda/lib/index.ts b/packages/aws-cdk-lib/aws-lambda/lib/index.ts index d42aa1ed74c15..918c48ffe0ca5 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/index.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/index.ts @@ -25,7 +25,7 @@ export * from './architecture'; export * from './function-url'; export * from './runtime-management'; export * from './params-and-secrets-layers'; -export * from './snapstart-config' +export * from './snapstart-config'; // AWS::Lambda CloudFormation Resources: export * from './lambda.generated'; diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 224d9628fb3fd..7ed97403f5ac4 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -2992,7 +2992,7 @@ describe('function', () => { runtime: 'java11', snapStart: { applyOn: 'PublishedVersions' }, }); - + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { Properties: { @@ -3005,8 +3005,7 @@ describe('function', () => { }, }); }); - - + test('function using SnapStart', () => { const stack = new cdk.Stack(); //WHEN @@ -3016,7 +3015,7 @@ describe('function', () => { runtime: lambda.Runtime.JAVA_11, snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, }); - + //THEN Template.fromStack(stack).hasResource('AWS::Lambda::Function', { Properties: @@ -3029,10 +3028,10 @@ describe('function', () => { }, }); }); - + test('runtime validation for snapStart', () => { const stack = new cdk.Stack(); - + expect(() => new lambda.Function(stack, 'MyLambda', { code: new lambda.InlineCode('foo'), handler: 'bar', @@ -3040,10 +3039,10 @@ describe('function', () => { snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart currently only support Java 11/Java 17 runtime'); }); - + test('arm64 validation for snapStart', () => { const stack = new cdk.Stack(); - + expect(() => new lambda.Function(stack, 'MyLambda', { code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), handler: 'example.Handler::handleRequest', @@ -3052,19 +3051,19 @@ describe('function', () => { snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart is currently not supported on Arm_64'); }); - + test('EFS validation for snapStart', () => { const stack = new cdk.Stack(); const vpc = new ec2.Vpc(stack, 'Vpc', { maxAzs: 3, natGateways: 1, }); - + const fs = new efs.FileSystem(stack, 'Efs', { vpc, }); const accessPoint = fs.addAccessPoint('AccessPoint'); - + expect(() => new lambda.Function(stack, 'MyLambda', { vpc, code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), @@ -3074,10 +3073,10 @@ describe('function', () => { snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart is currently not supported using EFS'); }); - + test('arm64 validation for snapStart', () => { const stack = new cdk.Stack(); - + expect(() => new lambda.Function(stack, 'MyLambda', { code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), handler: 'example.Handler::handleRequest', @@ -3248,8 +3247,6 @@ describe('function', () => { }), ).toThrow(/ADOT Lambda layer can't be configured with container image package type/); }); - - }); test('throws if ephemeral storage size is out of bound', () => { From 1714849040e095da7cc86ebf1ea83245a2afd982 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Tue, 15 Aug 2023 22:32:29 +0000 Subject: [PATCH 08/12] fix lint --- .../framework-integ/test/aws-lambda/test/integ.lambda.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts index 17e960b8cf3c5..65906310c8227 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts @@ -37,7 +37,6 @@ alias.addFunctionUrl({ // to validate the changed function hash. cdk.Aspects.of(stack).add(new lambda.FunctionVersionUpgrade(LAMBDA_RECOGNIZE_LAYER_VERSION)); - new lambda.Function(stack, 'MySnapStartLambda', { code: lambda.Code.fromAsset(path.join(__dirname, 'handler-snapstart.zip')), handler: 'example.Handler::handleRequest', From 427878ebdd06f234060f01a2d8dc5c1c7937b588 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Wed, 16 Aug 2023 21:17:36 +0000 Subject: [PATCH 09/12] refactor to abstract&render --- .../test/aws-lambda/test/integ.lambda.ts | 2 +- .../aws-cdk-lib/aws-lambda/lib/function.ts | 8 +++---- .../aws-lambda/lib/snapstart-config.ts | 24 ++++++++++++------- .../aws-lambda/test/function.test.ts | 10 ++++---- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts index 65906310c8227..ef00f1b706b26 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.lambda.ts @@ -41,7 +41,7 @@ new lambda.Function(stack, 'MySnapStartLambda', { code: lambda.Code.fromAsset(path.join(__dirname, 'handler-snapstart.zip')), handler: 'example.Handler::handleRequest', runtime: lambda.Runtime.JAVA_11, - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, }); app.synth(); diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index 37e16a7215aa7..2cfb9133ee928 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -18,7 +18,7 @@ import { LogRetentionRetryOptions } from './log-retention'; import { ParamsAndSecretsLayerVersion } from './params-and-secrets-layers'; import { Runtime, RuntimeFamily } from './runtime'; import { RuntimeManagementMode } from './runtime-management'; -import { SnapStartConfig } from './snapstart-config'; +import { SnapStartConf } from './snapstart-config'; import { addAlias } from './util'; import * as cloudwatch from '../../aws-cloudwatch'; import { IProfilingGroup, ProfilingGroup, ComputePlatform } from '../../aws-codeguruprofiler'; @@ -232,7 +232,7 @@ export interface FunctionOptions extends EventInvokeConfigOptions { * * @default - No snapstart */ - readonly snapStart?: SnapStartConfig; + readonly snapStart?: SnapStartConf; /** * Enable profiling. @@ -1304,7 +1304,7 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett // so it can't be checked at function set up time // SnapStart supports the Java 11 and Java 17 (java11 and java17) managed runtimes. // See https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html - if (props.snapStart != SnapStartConfig.ON_PUBLISHED_VERSIONS) { + if (props.snapStart != SnapStartConf.ON_PUBLISHED_VERSIONS) { throw new Error('SnapStart currently only support published versions'); } @@ -1324,7 +1324,7 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett throw new Error('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); } - return props.snapStart.snapStartConfig; + return props.snapStart._render(); } private isQueue(deadLetterQueue: sqs.IQueue | sns.ITopic): deadLetterQueue is sqs.IQueue { diff --git a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-config.ts b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-config.ts index 6eb284a8fcaf2..7f7dfdcaa5520 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/snapstart-config.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/snapstart-config.ts @@ -1,14 +1,22 @@ import { CfnFunction } from './lambda.generated'; -export class SnapStartConfig { + +export abstract class SnapStartConf { // Enable SnapStart on published lambda versions, this is the only available option available // see https://docs.aws.amazon.com/lambda/latest/dg/API_SnapStart.html - public static readonly ON_PUBLISHED_VERSIONS= new SnapStartConfig('PublishedVersions'); - - readonly snapStartConfig: CfnFunction.SnapStartProperty; + public static readonly ON_PUBLISHED_VERSIONS = SnapStartConf.applyOn('PublishedVersions'); - protected constructor(public readonly applyValue: string) { - this.snapStartConfig = { - applyOn: applyValue, + private static applyOn(applyValue: string): SnapStartConf { + return new class extends SnapStartConf { + public _render() { + return { + applyOn: applyValue, + } satisfies CfnFunction.SnapStartProperty; + } }; } -} + + /** + * @internal + */ + public abstract _render(): any; +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 7ed97403f5ac4..e98df8514c0b5 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -3013,7 +3013,7 @@ describe('function', () => { code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), handler: 'example.Handler::handleRequest', runtime: lambda.Runtime.JAVA_11, - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, }); //THEN @@ -3036,7 +3036,7 @@ describe('function', () => { code: new lambda.InlineCode('foo'), handler: 'bar', runtime: lambda.Runtime.NODEJS_14_X, - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart currently only support Java 11/Java 17 runtime'); }); @@ -3048,7 +3048,7 @@ describe('function', () => { handler: 'example.Handler::handleRequest', runtime: lambda.Runtime.JAVA_11, architecture: lambda.Architecture.ARM_64, - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart is currently not supported on Arm_64'); }); @@ -3070,7 +3070,7 @@ describe('function', () => { handler: 'example.Handler::handleRequest', runtime: lambda.Runtime.JAVA_11, filesystem: lambda.FileSystem.fromEfsAccessPoint(accessPoint, '/mnt/msg'), - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart is currently not supported using EFS'); }); @@ -3082,7 +3082,7 @@ describe('function', () => { handler: 'example.Handler::handleRequest', runtime: lambda.Runtime.JAVA_11, ephemeralStorageSize: Size.mebibytes(1024), - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, })).toThrowError('SnapStart is currently not supported using more than 512 MiB Ephemeral Storage'); }); }); From 863acbcbc3ee0ec8f8c2bbd8874b130137d06694 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Wed, 16 Aug 2023 22:23:13 +0000 Subject: [PATCH 10/12] fix readme --- packages/aws-cdk-lib/aws-lambda/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-lambda/README.md b/packages/aws-cdk-lib/aws-lambda/README.md index 2f81c1a6f56dd..9ca02df90c743 100644 --- a/packages/aws-cdk-lib/aws-lambda/README.md +++ b/packages/aws-cdk-lib/aws-lambda/README.md @@ -913,7 +913,7 @@ const fn = new lambda.Function(this, 'MyFunction', { code: lambda.Code.fromAsset(path.join(__dirname, 'handler.zip')), runtime: lambda.Runtime.JAVA_11, handler: 'example.Handler::handleRequest', - snapStart: lambda.SnapStartConfig.ON_PUBLISHED_VERSIONS, + snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, }); const version = fn.currentVersion; From e1ce197e7d1f4fb500ece635dfc5235aa86d50dc Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Thu, 24 Aug 2023 17:49:02 +0000 Subject: [PATCH 11/12] add snapstart runtime check, add warning --- packages/aws-cdk-lib/aws-lambda/lib/function.ts | 5 +++-- packages/aws-cdk-lib/aws-lambda/lib/runtime.ts | 14 ++++++++++++++ .../aws-cdk-lib/aws-lambda/test/function.test.ts | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index 6933bfd515d0f..12c8f7f51d87b 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -1316,9 +1316,10 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett if (props.snapStart != SnapStartConf.ON_PUBLISHED_VERSIONS) { throw new Error('SnapStart currently only support published versions'); } + Annotations.of(this).addWarning('SnapStart only support published Lambda versions. Ignore if function already have published versions'); - if (props.runtime != Runtime.JAVA_11 && props.runtime != Runtime.JAVA_17 ) { - throw new Error('SnapStart currently only support Java 11/Java 17 runtime'); + if (!props.runtime.supportsSnapStart ) { + throw new Error(`SnapStart currently not supported by runtime ${props.runtime.name}`); } if (props.architecture == Architecture.ARM_64) { diff --git a/packages/aws-cdk-lib/aws-lambda/lib/runtime.ts b/packages/aws-cdk-lib/aws-lambda/lib/runtime.ts index 4782d8bfcc045..20029521b52a1 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/runtime.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/runtime.ts @@ -24,6 +24,12 @@ export interface LambdaRuntimeProps { * @default false */ readonly supportsCodeGuruProfiling?: boolean; + + /** + * Whether this runtime supports SnapStart. + * @default false + */ + readonly supportsSnapStart?: boolean; } export enum RuntimeFamily { @@ -179,6 +185,7 @@ export class Runtime { */ public static readonly JAVA_11 = new Runtime('java11', RuntimeFamily.JAVA, { supportsCodeGuruProfiling: true, + supportsSnapStart: true, }); /** @@ -186,6 +193,7 @@ export class Runtime { */ public static readonly JAVA_17 = new Runtime('java17', RuntimeFamily.JAVA, { supportsCodeGuruProfiling: true, + supportsSnapStart: true, }); /** @@ -269,6 +277,11 @@ export class Runtime { */ public readonly supportsCodeGuruProfiling: boolean; + /** + * Whether this runtime supports snapstart. + */ + public readonly supportsSnapStart: boolean; + /** * The runtime family. */ @@ -300,6 +313,7 @@ export class Runtime { this.bundlingDockerImage = DockerImage.fromRegistry(imageName); this.bundlingImage = this.bundlingDockerImage; this.supportsCodeGuruProfiling = props.supportsCodeGuruProfiling ?? false; + this.supportsSnapStart = props.supportsSnapStart ?? false; Runtime.ALL.push(this); } diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 4c6ae35193a4e..435b535d334bf 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -3037,7 +3037,7 @@ describe('function', () => { handler: 'bar', runtime: lambda.Runtime.NODEJS_14_X, snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS, - })).toThrowError('SnapStart currently only support Java 11/Java 17 runtime'); + })).toThrowError('SnapStart currently not supported by runtime nodejs14.x'); }); test('arm64 validation for snapStart', () => { From 8bad263e36faf38c87ae75af233ebcb4cf2c5ee2 Mon Sep 17 00:00:00 2001 From: RogerZhang Date: Thu, 24 Aug 2023 19:52:06 +0000 Subject: [PATCH 12/12] remove unnecessary snapstart value check --- packages/aws-cdk-lib/aws-lambda/lib/function.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function.ts b/packages/aws-cdk-lib/aws-lambda/lib/function.ts index 12c8f7f51d87b..8b16fcac06697 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function.ts @@ -1313,10 +1313,7 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett // so it can't be checked at function set up time // SnapStart supports the Java 11 and Java 17 (java11 and java17) managed runtimes. // See https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html - if (props.snapStart != SnapStartConf.ON_PUBLISHED_VERSIONS) { - throw new Error('SnapStart currently only support published versions'); - } - Annotations.of(this).addWarning('SnapStart only support published Lambda versions. Ignore if function already have published versions'); + Annotations.of(this).addWarningV2('@aws-cdk/aws-lambda:snapStartRequirePublish', 'SnapStart only support published Lambda versions. Ignore if function already have published versions'); if (!props.runtime.supportsSnapStart ) { throw new Error(`SnapStart currently not supported by runtime ${props.runtime.name}`);