Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(lambda): add SnapStart support for arm64 functions #30898

Merged
merged 6 commits into from
Jul 19, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,66 @@
"DependsOn": [
"MySnapStartLambdaServiceRoleE0F04324"
]
},
"MySnapStartLambdaArmServiceRole731A8472": {
"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"
]
]
}
]
}
},
"MySnapStartLambdaArmEDD3F420": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Architectures": [
"arm64"
],
"Code": {
"S3Bucket": {
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
},
"S3Key": "a37d3ef54c18e7738fe5dc008504591bd3b1f14c6a09ee91eac6d55f7ca5ba5f.zip"
},
"Description": "version-hash:522e22f485651f1644be7e317c07836f",
"Handler": "example.Handler::handleRequest",
"Role": {
"Fn::GetAtt": [
"MySnapStartLambdaArmServiceRole731A8472",
"Arn"
]
},
"Runtime": "java21",
"SnapStart": {
"ApplyOn": "PublishedVersions"
}
},
"DependsOn": [
"MySnapStartLambdaArmServiceRole731A8472"
]
}
},
"Parameters": {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,12 @@ new lambda.Function(stack, 'MySnapStartLambda', {
snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS,
});

new lambda.Function(stack, 'MySnapStartLambdaArm', {
code: lambda.Code.fromAsset(path.join(__dirname, 'handler-snapstart.zip')),
handler: 'example.Handler::handleRequest',
runtime: lambda.Runtime.JAVA_21,
architecture: lambda.Architecture.ARM_64,
snapStart: lambda.SnapStartConf.ON_PUBLISHED_VERSIONS,
});

app.synth();
2 changes: 1 addition & 1 deletion packages/aws-cdk-lib/aws-lambda/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -967,7 +967,7 @@ 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.
SnapStart is currently supported only on Java 11 and later [Java managed runtimes](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html). SnapStart does not support provisioned concurrency, 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

Expand Down
6 changes: 1 addition & 5 deletions packages/aws-cdk-lib/aws-lambda/lib/function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1554,7 +1554,7 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett
return undefined;
}

// SnapStart does not support arm64 architecture, Amazon Elastic File System (Amazon EFS), or ephemeral storage greater than 512 MB.
// SnapStart does not support 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.
Expand All @@ -1565,10 +1565,6 @@ Environment variables can be marked for removal when used in Lambda@Edge by sett
throw new Error(`SnapStart currently not supported by runtime ${props.runtime.name}`);
}

if (props.architecture == Architecture.ARM_64) {
throw new Error('SnapStart is currently not supported on Arm_64');
}

if (props.filesystem) {
throw new Error('SnapStart is currently not supported using EFS');
}
Expand Down
23 changes: 18 additions & 5 deletions packages/aws-cdk-lib/aws-lambda/test/function.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3429,16 +3429,29 @@ describe('function', () => {
})).toThrowError('SnapStart currently not supported by runtime nodejs18.x');
});

test('arm64 validation for snapStart', () => {
test('arm64 function using snapStart', () => {
const stack = new cdk.Stack();

expect(() => new lambda.Function(stack, 'MyLambda', {
//WHEN
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.SnapStartConf.ON_PUBLISHED_VERSIONS,
})).toThrowError('SnapStart is currently not supported on Arm_64');
});

//THEN
Template.fromStack(stack).hasResource('AWS::Lambda::Function', {
Properties:
{
Handler: 'example.Handler::handleRequest',
Runtime: 'java11',
Architectures: ['arm64'],
SnapStart: {
ApplyOn: 'PublishedVersions',
},
},
});
});

test('EFS validation for snapStart', () => {
Expand All @@ -3463,7 +3476,7 @@ describe('function', () => {
})).toThrowError('SnapStart is currently not supported using EFS');
});

test('arm64 validation for snapStart', () => {
test('ephemeral storage limit validation for snapStart', () => {
const stack = new cdk.Stack();

expect(() => new lambda.Function(stack, 'MyLambda', {
Expand Down