Getting started with the AWS JS SDK v3 included in the Node runtime
It's time to forget the v2
Bundled SDK
The NodeJs 18 Lamba runtime comes with the usual updates to the language and the standard library. But this time, it also brings one huge improvement: the v3 JS SDK is packaged instead of the old v2.
Before this release, there was a dilemma: since the v2 was included, it was tempting to use that for simple functions. There is always the option to add a
package.json
, install the v3 SDK, then use that from the local node_modules
. But for a code that spans a few lines only, that process required
considerable extra work.
Now that the v3 is bundled, there is no more dilemma: most functions that only interact with AWS services don't need the npm
infrastructure and can be
inlined.
Included packages
Since the v3 SDK is modular and it spans hundreds of packages, it's not obvious which ones are actually installed. Fortunately, the runtime is published as a Docker image and we can inspect it:
docker run --rm -it --entrypoint "npm" --workdir "/var/runtime" amazon/aws-lambda-nodejs:18 ls
At the time of writing, 419 packages were installed in the runtime:
@aws-sdk
@aws-sdk/abort-controller@3.188.
@aws-sdk/body-checksum-node@3.188.
@aws-sdk/chunked-stream-reader-node@3.188.
@aws-sdk/client-accessanalyzer@3.188.
...
@aws-sdk/client-xray@3.188.
@aws-sdk/cloudfront-signer@3.188.
@aws-sdk/config-resolver@3.188.
@aws-sdk/credential-provider-node@3.188.
...
@aws-sdk/credential-providers@3.188.
@aws-sdk/endpoint-cache@3.188.
@aws-sdk/eventstream-codec@3.188.
...
@aws-sdk/eventstream-serde-universal@3.188.
@aws-sdk/hash-node@3.188.
@aws-sdk/hash-stream-node@3.188.
@aws-sdk/invalid-dependency@3.188.
@aws-sdk/is-array-buffer@3.188.
@aws-sdk/lib-dynamodb@3.188.
@aws-sdk/lib-storage@3.188.
@aws-sdk/md5-js@3.188.
@aws-sdk/middleware-apply-body-checksum@3.188.
...
@aws-sdk/middleware-user-agent@3.188.
@aws-sdk/node_modules
@aws-sdk/node-config-provider@3.188.
@aws-sdk/node-http-handler@3.188.
@aws-sdk/polly-request-presigner@3.188.
@aws-sdk/property-provider@3.188.
@aws-sdk/protocol-http@3.188.
@aws-sdk/querystring-builder@3.188.
@aws-sdk/querystring-parser@3.188.
@aws-sdk/rds-signer@3.188.
@aws-sdk/s3-presigned-post@3.188.
@aws-sdk/s3-request-presigner@3.188.
@aws-sdk/service-client-documentation-generator@3.188.
@aws-sdk/service-error-classification@3.188.
@aws-sdk/sha256-tree-hash@3.188.
@aws-sdk/shared-ini-file-loader@3.188.
@aws-sdk/signature-v4-crt@3.188.
@aws-sdk/signature-v4-multi-region@3.188.
@aws-sdk/signature-v4@3.188.
@aws-sdk/smithy-client@3.188.
@aws-sdk/token-providers@3.188.
@aws-sdk/types@3.188.
@aws-sdk/url-parser@3.188.
@aws-sdk/util-arn-parser@3.188.
...
@aws-sdk/util-waiter@3.188.
@aws-sdk/xhr-http-handler@3.188.
@aws-sdk/xml-builder@3.188.
This is a great deal of packages and contains all clients, most utils, and a bunch of ancillary services.
Integrating with AppSync
What I needed was to invoke a mutation in an AppSync API. That includes quite a lot of low-level details related to signing the request. Fortunately, I had everything in the bundle:
import { SignatureV4 } from "@aws-sdk/signature-v4";
import { HttpRequest } from "@aws-sdk/protocol-http";
import { defaultProvider } from "@aws-sdk/credential-provider-node";
import {URL} from "url";
import {Hash} from "@aws-sdk/hash-node";
The @aws-crypo/sha256-js
package is not available, but apparently it can be replaced with Hash.bind(null, "sha256")
, which is included.
Using these packages, the entirely function code could be inlined:
A single file with all the code and no external dependencies.