From e3f84e162c7bb1b988b7e073c13bc7b064505f57 Mon Sep 17 00:00:00 2001 From: Daniel Grant <1670902+djgrant@users.noreply.github.com> Date: Sun, 16 Feb 2025 22:00:17 +0000 Subject: [PATCH 1/3] Support alternative runtimes --- examples/lambda-external/external/lambda.py | 8 ++++ examples/lambda-external/infra/api.ts | 7 ++- examples/lambda-external/infra/lambda.ts | 10 +++++ .../aws.iac/src/resources/lambda/lambda.ts | 45 ++++++------------- packages/aws/src/lambda/lambda.ts | 24 +++++++++- 5 files changed, 59 insertions(+), 35 deletions(-) create mode 100644 examples/lambda-external/external/lambda.py 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..3cd525d 100644 --- a/packages/aws.iac/src/resources/lambda/lambda.ts +++ b/packages/aws.iac/src/resources/lambda/lambda.ts @@ -187,42 +187,23 @@ const lambdaFunctionSchema = lambdaFunction.defineSchema({ }, Runtime: { valueType: z.enum([ - "dotnet6", - "dotnetcore1.0", - "dotnetcore2.0", - "dotnetcore2.1", - "dotnetcore3.1", - "go1.x", - "java11", - "java17", - "java21", - "java8", - "java8.al2", - "nodejs", - "nodejs10.x", - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", + "nodejs22.x", "nodejs20.x", - "nodejs4.3", - "nodejs4.3-edge", - "nodejs6.10", - "nodejs8.10", - "provided", - "provided.al2", - "provided.al2023", - "python2.7", - "python3.10", - "python3.11", + "nodejs18.x", + "python3.13", "python3.12", - "python3.6", - "python3.7", - "python3.8", + "python3.11", + "python3.10", "python3.9", - "ruby2.5", - "ruby2.7", + "java21", + "java17", + "java11", + "java8.al2", + "dotnet8", + "ruby3.3", "ruby3.2", + "provided.al2023", + "provided.al2", ]), propertyType: "param", presence: "optional", diff --git a/packages/aws/src/lambda/lambda.ts b/packages/aws/src/lambda/lambda.ts index ec1a174..5ce7e80 100644 --- a/packages/aws/src/lambda/lambda.ts +++ b/packages/aws/src/lambda/lambda.ts @@ -10,9 +10,28 @@ type LambdaConfig = { type: "file" | "zip"; path: string; }; + // todo: import type from aws.iac + runtime?: + | "nodejs22.x" + | "nodejs20.x" + | "nodejs18.x" + | "python3.13" + | "python3.12" + | "python3.11" + | "python3.10" + | "python3.9" + | "java21" + | "java17" + | "java11" + | "java8.al2" + | "dotnet8" + | "ruby3.3" + | "ruby3.2" + | "provided.al2023" + | "provided.al2"; }; -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 +82,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 +90,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, }, From f65de33640676885ab0043b483f3a03da127d04d Mon Sep 17 00:00:00 2001 From: Daniel Grant <1670902+djgrant@users.noreply.github.com> Date: Sun, 16 Feb 2025 22:01:25 +0000 Subject: [PATCH 2/3] Add changeset --- .changeset/hot-toys-fly.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/hot-toys-fly.md 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 From 911ca38a8014e9beb766040ba39fe45c788b459d Mon Sep 17 00:00:00 2001 From: Daniel Grant <1670902+djgrant@users.noreply.github.com> Date: Mon, 17 Feb 2025 12:46:49 +0000 Subject: [PATCH 3/3] Replace hard-coded type --- .../aws.iac/src/resources/lambda/lambda.ts | 53 ++++++++++++++----- packages/aws/src/lambda/lambda.ts | 20 +------ 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/packages/aws.iac/src/resources/lambda/lambda.ts b/packages/aws.iac/src/resources/lambda/lambda.ts index 3cd525d..241495b 100644 --- a/packages/aws.iac/src/resources/lambda/lambda.ts +++ b/packages/aws.iac/src/resources/lambda/lambda.ts @@ -187,23 +187,46 @@ const lambdaFunctionSchema = lambdaFunction.defineSchema({ }, Runtime: { valueType: z.enum([ - "nodejs22.x", - "nodejs20.x", + "dotnet6", + "dotnet8", + "dotnetcore1.0", + "dotnetcore2.0", + "dotnetcore2.1", + "dotnetcore3.1", + "go1.x", + "java11", + "java17", + "java21", + "java8", + "java8.al2", + "nodejs", + "nodejs10.x", + "nodejs12.x", + "nodejs14.x", + "nodejs16.x", "nodejs18.x", - "python3.13", - "python3.12", - "python3.11", + "nodejs20.x", + "nodejs22.x", + "nodejs4.3", + "nodejs4.3-edge", + "nodejs6.10", + "nodejs8.10", + "provided", + "provided.al2", + "provided.al2023", + "python2.7", "python3.10", + "python3.11", + "python3.12", + "python3.13", + "python3.6", + "python3.7", + "python3.8", "python3.9", - "java21", - "java17", - "java11", - "java8.al2", - "dotnet8", - "ruby3.3", + "ruby2.5", + "ruby2.7", "ruby3.2", - "provided.al2023", - "provided.al2", + "ruby3.3", ]), propertyType: "param", presence: "optional", @@ -362,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 5ce7e80..0b6cc3a 100644 --- a/packages/aws/src/lambda/lambda.ts +++ b/packages/aws/src/lambda/lambda.ts @@ -10,25 +10,7 @@ type LambdaConfig = { type: "file" | "zip"; path: string; }; - // todo: import type from aws.iac - runtime?: - | "nodejs22.x" - | "nodejs20.x" - | "nodejs18.x" - | "python3.13" - | "python3.12" - | "python3.11" - | "python3.10" - | "python3.9" - | "java21" - | "java17" - | "java11" - | "java8.al2" - | "dotnet8" - | "ruby3.3" - | "ruby3.2" - | "provided.al2023" - | "provided.al2"; + runtime?: aws.lambda.LambdaFunctionConfig["Runtime"]; }; export const lambda = (config: LambdaConfig): aws.AwsResourceGroup => {