Skip to content

Instantly share code, notes, and snippets.

@Fyko
Last active September 5, 2022 23:27
Show Gist options
  • Save Fyko/5b5d4595ebd5d6451eb1f3744a208de0 to your computer and use it in GitHub Desktop.
Save Fyko/5b5d4595ebd5d6451eb1f3744a208de0 to your computer and use it in GitHub Desktop.
Use an unspported Node.js version in AWS Lambda (fusebit/anynode) (serverless-stack)
#!/usr/bin/env node
import { App } from '@serverless-stack/resources';
import { request } from 'undici';
/** eg: `us-west-1`, `us-east-2` */
type AWSRegion = string;
/** eg: `18.4.0`, `16.14.0`, `14.17.0` */
type SemVersion = `${number}.${number}.${number}`;
/**
* Fetches the FuseBit AnyNode lambda layer for all functions.
* @param region AWS Region (eg: `us-west-1`, `us-east-2`)
* @param nodeVersion Node Version (eg: `16.14.0`, `14.17.0`) (@default: `18.4.0`)
* @returns AWS Lambda Layer ARN
* @example
* ```js
* await fetchNodeLayer(app.region)
* // => "arn:aws:lambda:us-west-1:072686360478:layer:node-18_4_0:1"
* ```
* @example
* ```js
* await fetchNodeLayer(app.region, '16.14.0')
* // => "arn:aws:lambda:us-west-1:072686360478:layer:node-16_14_0:1"
* ```
*/
async function fetchNodeLayer(region: AWSRegion, nodeVersion: SemVersion = '18.4.0') {
const res = await request('https://cdn.fusebit.io/everynode/layers.json');
// formatted like { 'region': { 'nodeVersion': 'layerArn' } }
const body = (await res.body.json()) as Record<AWSRegion, Record<SemVersion, string>>;
return body[region][nodeVersion];
}
export default async function main(app: App): Promise<void> {
const nodeLayerArn = await fetchNodeLayer(app.region);
// apply to all lambda functions
app.setDefaultFunctionProps({
layers: [nodeLayerArn],
});
//... business logic
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment