From 4458b410ec45253ce630f4cc6fff30f63e72b197 Mon Sep 17 00:00:00 2001 From: Robert Rathsack Date: Thu, 10 Jul 2025 15:25:58 +0200 Subject: [PATCH 1/2] Make lambda node.js runtime configurable --- README.md | 1 + src/cdk/create-lambda-function.ts | 5 ++++- src/parse-stack-config.ts | 4 ++++ src/utils/lambda-runtime.test.ts | 12 ++++++++++++ src/utils/lambda-runtime.ts | 23 +++++++++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/utils/lambda-runtime.test.ts create mode 100644 src/utils/lambda-runtime.ts diff --git a/README.md b/README.md index 2d868b2..de55d4a 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ export default () => ({ // optional memorySize: 1769, // default: `128` MB + lambdaRuntime: `22.x`, // default `20.x` timeoutInSeconds: 3, // default: `28` seconds (this is the maximum timeout) environment: { FOO: `bar` }, requestParameters: { foo: {}, bar: { cacheKey: true, required: true } }, diff --git a/src/cdk/create-lambda-function.ts b/src/cdk/create-lambda-function.ts index 6896aad..88624f1 100644 --- a/src/cdk/create-lambda-function.ts +++ b/src/cdk/create-lambda-function.ts @@ -4,6 +4,7 @@ import type { Stack } from 'aws-cdk-lib'; import { getDomainName } from '../utils/get-domain-name.js'; import { getHash } from '../utils/get-hash.js'; import { getNormalizedName } from '../utils/get-normalized-name.js'; +import { mapLambdaRuntime } from '../utils/lambda-runtime.js'; import { Duration, aws_ec2, aws_efs, aws_iam, aws_lambda, aws_logs } from 'aws-cdk-lib'; import { basename, dirname, extname, join } from 'path'; @@ -84,6 +85,8 @@ export function createLambdaFunction( } : undefined; + const runtime = mapLambdaRuntime(route.lambdaRuntime); + const fn = new aws_lambda.Function(stack, `Function${getHash(uniqueFunctionName)}`, { functionName: uniqueFunctionName, code: aws_lambda.Code.fromAsset(dirname(path)), @@ -92,7 +95,7 @@ export function createLambdaFunction( memorySize, environment, timeout: Duration.seconds(timeoutInSeconds), - runtime: aws_lambda.Runtime.NODEJS_20_X, + runtime, tracing: aws_lambda.Tracing.PASS_THROUGH, insightsVersion: monitoring === true || monitoring?.lambdaInsightsEnabled diff --git a/src/parse-stack-config.ts b/src/parse-stack-config.ts index d3b2b1e..a19368f 100644 --- a/src/parse-stack-config.ts +++ b/src/parse-stack-config.ts @@ -31,6 +31,9 @@ export type LambdaRoute = Omit, 'onSynthesize export type S3Route = z.TypeOf; +const LambdaRuntimeSchema = z.enum([`20.x`, `22.x`, `LATEST`]).optional(); +export type LambdaRuntime = z.TypeOf; + const LambdaRouteSchema = z.object({ type: z.literal(`function`), httpMethod: z.enum([`DELETE`, `GET`, `HEAD`, `PATCH`, `POST`, `PUT`]), @@ -38,6 +41,7 @@ const LambdaRouteSchema = z.object({ path: z.string(), functionName: z.string(), memorySize: z.number().optional(), + lambdaRuntime: LambdaRuntimeSchema, timeoutInSeconds: z.number().int().min(0).max(28).optional(), environment: z.record(z.string()).optional(), requestParameters: z diff --git a/src/utils/lambda-runtime.test.ts b/src/utils/lambda-runtime.test.ts new file mode 100644 index 0000000..99b4317 --- /dev/null +++ b/src/utils/lambda-runtime.test.ts @@ -0,0 +1,12 @@ +import { mapLambdaRuntime } from './lambda-runtime.js'; +import { describe, expect, test } from '@jest/globals'; +import { aws_lambda } from 'aws-cdk-lib'; + +describe(`lambda runtime utils`, () => { + test(`map runtime`, () => { + expect(mapLambdaRuntime(undefined)).toEqual(aws_lambda.Runtime.NODEJS_20_X); + expect(mapLambdaRuntime(`20.x`)).toEqual(aws_lambda.Runtime.NODEJS_20_X); + expect(mapLambdaRuntime(`22.x`)).toEqual(aws_lambda.Runtime.NODEJS_22_X); + expect(mapLambdaRuntime(`LATEST`)).toEqual(aws_lambda.Runtime.NODEJS_LATEST); + }); +}); diff --git a/src/utils/lambda-runtime.ts b/src/utils/lambda-runtime.ts new file mode 100644 index 0000000..e5b02af --- /dev/null +++ b/src/utils/lambda-runtime.ts @@ -0,0 +1,23 @@ +import type { LambdaRuntime } from '../parse-stack-config.js'; + +import { aws_lambda } from 'aws-cdk-lib'; + +/** + * Maps the lambda runtime config enum to CDK equivalents. + * + * @param lambdaRuntime the lambda config string or undefined + * @returns the CDK runtime constant. + */ +export function mapLambdaRuntime(lambdaRuntime: LambdaRuntime): aws_lambda.Runtime { + if (!lambdaRuntime) { + return aws_lambda.Runtime.NODEJS_20_X; + } + switch (lambdaRuntime) { + case `20.x`: + return aws_lambda.Runtime.NODEJS_20_X; + case `22.x`: + return aws_lambda.Runtime.NODEJS_22_X; + case `LATEST`: + return aws_lambda.Runtime.NODEJS_LATEST; + } +} From b8bf785dc86d3e9ed8e60069ae532b4fa3f4eebb Mon Sep 17 00:00:00 2001 From: Robert Rathsack Date: Fri, 25 Jul 2025 09:31:59 +0200 Subject: [PATCH 2/2] Use Node.js 22 for authorizer lambda --- src/cdk/create-request-authorizer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cdk/create-request-authorizer.ts b/src/cdk/create-request-authorizer.ts index dd2b447..c4e339c 100644 --- a/src/cdk/create-request-authorizer.ts +++ b/src/cdk/create-request-authorizer.ts @@ -32,7 +32,7 @@ export function createRequestAuthorizer( USERNAME: authentication.username, PASSWORD: authentication.password, }, - runtime: aws_lambda.Runtime.NODEJS_18_X, + runtime: aws_lambda.Runtime.NODEJS_22_X, tracing: aws_lambda.Tracing.PASS_THROUGH, logRetention: aws_logs.RetentionDays.TWO_WEEKS, }),