From ae9595f045784202b3a6279ab7365999a49daec5 Mon Sep 17 00:00:00 2001 From: Dejan K Date: Tue, 11 Nov 2025 10:31:16 +0100 Subject: [PATCH 1/2] chore(runtime): migrate lambdas to nodejs22 --- lib/aws-semaphore-agent-stack.js | 7 ++++--- lib/dynamic-ssh-keys-updater.js | 5 +++-- lib/nodejs-runtime.js | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- test/aws-semaphore-agent.test.js | 10 +++++----- 6 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 lib/nodejs-runtime.js diff --git a/lib/aws-semaphore-agent-stack.js b/lib/aws-semaphore-agent-stack.js index b18968f..20a6b80 100644 --- a/lib/aws-semaphore-agent-stack.js +++ b/lib/aws-semaphore-agent-stack.js @@ -1,6 +1,7 @@ const packageInfo = require("../package.json"); const { hash } = require("./ami-hash"); const { DynamicSSHKeysUpdater } = require("./dynamic-ssh-keys-updater"); +const { nodeJs22Runtime } = require("./nodejs-runtime"); const { DependencyGroup } = require("constructs"); const { Stack, Duration, Fn, CustomResource } = require("aws-cdk-lib"); const { Provider } = require("aws-cdk-lib/custom-resources"); @@ -8,7 +9,7 @@ const { Rule, Schedule } = require("aws-cdk-lib/aws-events"); const { LambdaFunction } = require("aws-cdk-lib/aws-events-targets"); const { RetentionDays } = require("aws-cdk-lib/aws-logs"); const { StringParameter, ParameterTier } = require("aws-cdk-lib/aws-ssm"); -const { Function, Runtime, AssetCode } = require("aws-cdk-lib/aws-lambda"); +const { Function, AssetCode } = require("aws-cdk-lib/aws-lambda"); const { Policy, PolicyStatement, Role, ServicePrincipal, ManagedPolicy, Effect } = require("aws-cdk-lib/aws-iam"); const { CfnAutoScalingGroup } = require("aws-cdk-lib/aws-autoscaling"); const { Alias } = require("aws-cdk-lib/aws-kms"); @@ -261,7 +262,7 @@ class AwsSemaphoreAgentStack extends Stack { let opts = { description: `Dynamically scale Semaphore agents based on jobs demand`, - runtime: Runtime.NODEJS_18_X, + runtime: nodeJs22Runtime, timeout: Duration.seconds(60), code: new AssetCode('lambdas/agent-scaler'), handler: 'app.handler', @@ -547,7 +548,7 @@ class AwsSemaphoreAgentStack extends Stack { let suspenderFunction = new Function(this, 'azRebalanceSuspenderLambda', { description: "Suspend AZRebalance process for auto scaling group", - runtime: Runtime.NODEJS_18_X, + runtime: nodeJs22Runtime, code: new AssetCode("lambdas/az-rebalance-suspender"), handler: "app.handler", role: suspenderRole, diff --git a/lib/dynamic-ssh-keys-updater.js b/lib/dynamic-ssh-keys-updater.js index 825f4cd..5b07ecf 100644 --- a/lib/dynamic-ssh-keys-updater.js +++ b/lib/dynamic-ssh-keys-updater.js @@ -5,8 +5,9 @@ const { Rule, Schedule } = require("aws-cdk-lib/aws-events"); const { LambdaFunction } = require("aws-cdk-lib/aws-events-targets"); const { RetentionDays } = require("aws-cdk-lib/aws-logs"); const { StringParameter, ParameterTier } = require("aws-cdk-lib/aws-ssm"); -const { Function, Runtime, AssetCode } = require("aws-cdk-lib/aws-lambda"); +const { Function, AssetCode } = require("aws-cdk-lib/aws-lambda"); const { Policy, PolicyStatement, Role, ServicePrincipal, ManagedPolicy, Effect } = require("aws-cdk-lib/aws-iam"); +const { nodeJs22Runtime } = require("./nodejs-runtime"); class DynamicSSHKeysUpdater extends Construct { constructor(scope, id, props) { @@ -61,7 +62,7 @@ class DynamicSSHKeysUpdater extends Construct { let lambdaFunction = new Function(this, 'Lambda', { description: `Check if GitHub SSH public keys have changed.`, - runtime: Runtime.NODEJS_18_X, + runtime: nodeJs22Runtime, timeout: Duration.seconds(10), code: new AssetCode('lambdas/ssh-keys-updater'), handler: 'app.handler', diff --git a/lib/nodejs-runtime.js b/lib/nodejs-runtime.js new file mode 100644 index 0000000..81d3f20 --- /dev/null +++ b/lib/nodejs-runtime.js @@ -0,0 +1,10 @@ +const { Runtime, RuntimeFamily } = require('aws-cdk-lib/aws-lambda'); + +// CDK v2.164 does not expose NODEJS_22_X yet, so create a compatible Runtime when needed. +const nodeJs22Runtime = Runtime.NODEJS_22_X || new Runtime('nodejs22.x', RuntimeFamily.NODEJS, { + supportsInlineCode: true +}); + +module.exports = { + nodeJs22Runtime +}; diff --git a/package-lock.json b/package-lock.json index 0c49f06..9c8ec18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aws-semaphore-agent", - "version": "0.9.1", + "version": "0.9.2-rc1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aws-semaphore-agent", - "version": "0.9.1", + "version": "0.9.2-rc1", "dependencies": { "aws-cdk": "^2.164.1", "aws-cdk-lib": "^2.164.1", diff --git a/package.json b/package.json index d2b9da6..8804035 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aws-semaphore-agent", - "version": "0.9.1", + "version": "0.9.2-rc1", "bin": { "aws-semaphore-agent": "bin/aws-semaphore-agent.js" }, diff --git a/test/aws-semaphore-agent.test.js b/test/aws-semaphore-agent.test.js index 3021228..076757a 100644 --- a/test/aws-semaphore-agent.test.js +++ b/test/aws-semaphore-agent.test.js @@ -626,7 +626,7 @@ describe("auto scaling group", () => { template.hasResourceProperties("AWS::Lambda::Function", { Description: "Suspend AZRebalance process for auto scaling group", - Runtime: "nodejs18.x", + Runtime: "nodejs22.x", Code: Match.anyValue(), Handler: "app.handler", Role: Match.anyValue() @@ -650,7 +650,7 @@ describe("scaler lambda", () => { const template = createTemplate(basicArgumentStore()); template.hasResourceProperties("AWS::Lambda::Function", { Description: "Dynamically scale Semaphore agents based on jobs demand", - Runtime: "nodejs18.x", + Runtime: "nodejs22.x", Timeout: 60, Code: Match.anyValue(), Handler: "app.handler", @@ -704,7 +704,7 @@ describe("scaler lambda", () => { const template = createTemplate(argumentStore); template.hasResourceProperties("AWS::Lambda::Function", { Description: "Dynamically scale Semaphore agents based on jobs demand", - Runtime: "nodejs18.x", + Runtime: "nodejs22.x", Timeout: 60, Code: Match.anyValue(), Handler: "app.handler", @@ -729,7 +729,7 @@ describe("scaler lambda", () => { const template = createTemplate(argumentStore); template.hasResourceProperties("AWS::Lambda::Function", { Description: "Dynamically scale Semaphore agents based on jobs demand", - Runtime: "nodejs18.x", + Runtime: "nodejs22.x", Timeout: 60, Code: Match.anyValue(), Handler: "app.handler", @@ -843,7 +843,7 @@ describe("SSH keys updater lambda", () => { const template = createTemplate(basicArgumentStore()); template.hasResourceProperties("AWS::Lambda::Function", { Description: "Check if GitHub SSH public keys have changed.", - Runtime: "nodejs18.x", + Runtime: "nodejs22.x", Timeout: 10, Code: Match.anyValue(), Handler: "app.handler", From 1f0a6c85b9f272e37a9d2b3e8b4b903150c6814f Mon Sep 17 00:00:00 2001 From: Dejan K Date: Thu, 13 Nov 2025 13:27:54 +0100 Subject: [PATCH 2/2] chore: bump version to 0.9.2 for release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c8ec18..707d6d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aws-semaphore-agent", - "version": "0.9.2-rc1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aws-semaphore-agent", - "version": "0.9.2-rc1", + "version": "0.9.2", "dependencies": { "aws-cdk": "^2.164.1", "aws-cdk-lib": "^2.164.1", diff --git a/package.json b/package.json index 8804035..b7110f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aws-semaphore-agent", - "version": "0.9.2-rc1", + "version": "0.9.2", "bin": { "aws-semaphore-agent": "bin/aws-semaphore-agent.js" },