Bundling Lambda packages
Always bundle the @aws-sdk/* with your project eventhough the Lambda runtime already includes it by default (Note: nodejs16.x does not have AWS SDK v3 included).
This gives you full control of when to update the SDK to prevent unexpected errors from a bad SDK version, allows you to ensure that you are running the latest version with the most up to date fixes and features, and has been shown to decrease cold start times.
Compilers
typescript
npm i -D typescript
node_modules/.bin/tsc tsconfig.json
{
"compilerOptions": {
"baseUrl": "./",
"esModuleInterop": true,
"preserveConstEnums": true,
"strictNullChecks": true,
"allowJs": false,
"target": "es2021",
"typeRoots": ["node_modules/@types"],
"resolveJsonModule": true,
"moduleResolution": "node"
}
} Bundlers
esbuild
npm i -D esbuild
# --banner:js hack from https://github.com/evanw/esbuild/pull/2067
node_modules/.bin/esbuild index.js
--platform=node --format=esm --target=node18 --bundle --minify
--banner:js="import { createRequire } from 'module';const require = createRequire(import.meta.url);"
--legal-comments=external --sourcemap=external
--allow-overwrite --outfile=index.mjs
rollup
npm i -D rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs
node_modules/.bin/rollup --config rollup.config.mjs
import { nodeResolve } from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
const plugins = [nodeResolve({ preferBuiltins: true }), commonjs()]
export default (input) => ({
input: 'index.js',
output: {
file: 'index.bundle.rollup.mjs',
format: 'es' // cjs, es
},
plugins,
external: [
// AWS SDK
'@aws-sdk/client-apigatewaymanagementapi', // @middy/ws-response
'@aws-sdk/client-rds', // @middy/rds-signer
'@aws-sdk/client-s3', // @middy/s3-object-response
'@aws-sdk/client-secretsmanager', // @middy/sercrets-manager
'@aws-sdk/client-servicediscovery', // @middy/service-discovery
'@aws-sdk/client-ssm', // @middy/ssm
'@aws-sdk/client-sts' // @middy/sts
]
}) swc/pack
npm i -D @swc/cli @swc/core
node_modules/.bin/spack webpack
npm i -D webpack-cli webpack
node_modules/.bin/webpack webpack.config.mjs
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
export default {
mode: 'development',
entry: './index.js',
output: {
filename: 'index.bundle.webpack.mjs',
path: __dirname
},
experiments: {
outputModule: true
},
externals: [
// NodeJS modules
'events', // @middy/core
'https', // @middy/s3-object-response
'stream', // @middy/http-content-encoding @middy/s3-object-response
'util', // @middy/http-content-encoding
'zlib', // @middy/http-content-encoding
// AWS SDK
'@aws-sdk/client-apigatewaymanagementapi', // @middy/ws-response
'@aws-sdk/client-rds', // @middy/rds-signer
'@aws-sdk/client-s3', // @middy/s3-object-response
'@aws-sdk/client-secretsmanager', // @middy/sercrets-manager
'@aws-sdk/client-servicediscovery', // @middy/service-discovery
'@aws-sdk/client-ssm', // @middy/ssm
'@aws-sdk/client-sts' // @middy/sts
]
} Transpilers
babel
npm i -D @babel/cli @babel/core @babel/preset-env
node_modules/.bin/babel index.js --out-file index.transpile.babel.cjs babel.config.json
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "16"
}
}
]
]
} esbuild
npm i -D esbuild
node_modules/.bin/esbuild --platform=node --target=node16 --format=cjs index.js --outfile=index.cjs swc
npm i -D @swc/cli @swc/core
node_modules/.bin/swc index.js --out-file index.transpile.swc.cjs .swcrc
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"target": "es2021"
},
"module": {
"type": "commonjs"
}
}