diff --git a/.changeset/hot-toys-fly.md b/.changeset/hot-toys-fly.md new file mode 100644 index 0000000..6df9d24 --- /dev/null +++ b/.changeset/hot-toys-fly.md @@ -0,0 +1,6 @@ +--- +"@notation/aws.iac": minor +"@notation/aws": minor +--- + +Support alternative runtimes diff --git a/examples/lambda-external/external/lambda.py b/examples/lambda-external/external/lambda.py new file mode 100644 index 0000000..5db0ba8 --- /dev/null +++ b/examples/lambda-external/external/lambda.py @@ -0,0 +1,8 @@ +import json + +def handler(event, context): + print("event", event) + return { + 'statusCode': 200, + 'body': json.dumps({'message': 'Hello, world!'}) + } diff --git a/examples/lambda-external/infra/api.ts b/examples/lambda-external/infra/api.ts index af9e02b..16acef8 100644 --- a/examples/lambda-external/infra/api.ts +++ b/examples/lambda-external/infra/api.ts @@ -1,8 +1,13 @@ import { api, router } from "@notation/aws/api-gateway"; -import { externalJsLambda, externalZipLambda } from "./lambda"; +import { + externalJsLambda, + externalZipLambda, + externalPyLambda, +} from "./lambda"; const helloApi = api({ name: "hello-api" }); const helloRouter = router(helloApi); helloRouter.get("/hello1", externalJsLambda); helloRouter.get("/hello2", externalZipLambda); +helloRouter.get("/hello3", externalPyLambda); diff --git a/examples/lambda-external/infra/lambda.ts b/examples/lambda-external/infra/lambda.ts index 039626a..aa1acac 100644 --- a/examples/lambda-external/infra/lambda.ts +++ b/examples/lambda-external/infra/lambda.ts @@ -17,3 +17,13 @@ export const externalZipLambda = lambda({ path: "external/lambda.zip", }, }); + +export const externalPyLambda = lambda({ + id: "external-py", + handler: "handler", + code: { + type: "file", + path: "external/lambda.py", + }, + runtime: "python3.12", +}); diff --git a/packages/aws.iac/src/resources/lambda/lambda.ts b/packages/aws.iac/src/resources/lambda/lambda.ts index 779a2bd..241495b 100644 --- a/packages/aws.iac/src/resources/lambda/lambda.ts +++ b/packages/aws.iac/src/resources/lambda/lambda.ts @@ -188,6 +188,7 @@ const lambdaFunctionSchema = lambdaFunction.defineSchema({ Runtime: { valueType: z.enum([ "dotnet6", + "dotnet8", "dotnetcore1.0", "dotnetcore2.0", "dotnetcore2.1", @@ -205,6 +206,7 @@ const lambdaFunctionSchema = lambdaFunction.defineSchema({ "nodejs16.x", "nodejs18.x", "nodejs20.x", + "nodejs22.x", "nodejs4.3", "nodejs4.3-edge", "nodejs6.10", @@ -216,6 +218,7 @@ const lambdaFunctionSchema = lambdaFunction.defineSchema({ "python3.10", "python3.11", "python3.12", + "python3.13", "python3.6", "python3.7", "python3.8", @@ -223,6 +226,7 @@ const lambdaFunctionSchema = lambdaFunction.defineSchema({ "ruby2.5", "ruby2.7", "ruby3.2", + "ruby3.3", ]), propertyType: "param", presence: "optional", @@ -381,3 +385,7 @@ export const LambdaFunction = lambdaFunctionSchema })); export type LambdaFunctionInstance = InstanceType; + +export type LambdaFunctionConfig = ConstructorParameters< + typeof LambdaFunction +>[0]["config"]; diff --git a/packages/aws/src/lambda/lambda.ts b/packages/aws/src/lambda/lambda.ts index ec1a174..0b6cc3a 100644 --- a/packages/aws/src/lambda/lambda.ts +++ b/packages/aws/src/lambda/lambda.ts @@ -10,9 +10,10 @@ type LambdaConfig = { type: "file" | "zip"; path: string; }; + runtime?: aws.lambda.LambdaFunctionConfig["Runtime"]; }; -export const lambda = (config: LambdaConfig) => { +export const lambda = (config: LambdaConfig): aws.AwsResourceGroup => { const functionGroup = new aws.AwsResourceGroup("Lambda", { config }); const filePath = config.code.path; @@ -63,6 +64,7 @@ export const lambda = (config: LambdaConfig) => { ); const fileName = path.parse(filePath).name; + const runtime = config.runtime || "nodejs22.x"; const lambdaResource = functionGroup.add( new aws.lambda.LambdaFunction({ @@ -70,7 +72,7 @@ export const lambda = (config: LambdaConfig) => { config: { FunctionName: lambdaId, Handler: `${fileName}.${config.handler}`, - Runtime: "nodejs18.x", + Runtime: runtime, // todo: make this configurable and remove it as a default ReservedConcurrentExecutions: 1, },