Skip to main content
skill CX Codex

aws-sdk-js-v3-usage — Claude Code skill: what it does, how to install

Guides coding agents on AWS SDK for JavaScript v3 architecture, imports, and streams. It enforces modern modular patterns instead of legacy v2 code.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add aws/agent-toolkit-for-aws --skill aws-sdk-js-v3-usage -a claude-code
Open on GitHub

What aws-sdk-js-v3-usage does

The skill directs coding assistants toward the modular @aws-sdk/* architecture. It prioritizes bare-bones clients over aggregated classes to minimize bundle sizes. Root package imports are strictly enforced. It also bans emojis across all generated code and comments.

Stream handling receives special focus because unread response streams keep sockets open and trigger socket exhaustion. The instructions require immediate consumption via transformToString() or explicit stream cancellation. Sockets cannot sit idle.

For DynamoDB, the skill configures @aws-sdk/lib-dynamodb to process native JavaScript objects. Mutating client.config post-instantiation will break your application because fields resolve into async functions.

What it helps with

  • migrate legacy AWS SDK v2 calls to v3 modular commands
  • prevent socket exhaustion when streaming S3 object bodies
  • map DynamoDB items to native JavaScript types via DocumentClient
  • handle API pagination with async paginator helpers

Example prompts for the agent

  • Fetch an S3 object using GetObjectCommand and read its body as a string
  • Query DynamoDB items with DynamoDBDocumentClient using native JavaScript objects
  • Set up an S3 client with a custom maxSockets pool for parallel uploads

How to install aws-sdk-js-v3-usage

1Skills CLI (Vercel)

npx skills add aws/agent-toolkit-for-aws --skill aws-sdk-js-v3-usage -a claude-code

2Manually: put the files in place

~/.claude/skills/aws-sdk-js-v3-usage/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/aws-sdk-js-v3-usage/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about aws-sdk-js-v3-usage

How to install aws-sdk-js-v3-usage in Claude Code?

Run npx skills add aws/agent-toolkit-for-aws --skill aws-sdk-js-v3-usage -a claude-code.

What does aws-sdk-js-v3-usage do?

It provides patterns for AWS SDK for JavaScript v3, covering client initialization, pagination, credentials, middleware, and stream handling.

Why does the skill disallow modifying client.config?

In SDK v3, client.config contains resolved values rather than plain inputs. For example, the region property becomes an async function, so mutating it corrupts client operations.

Source text

SKILL.md · Apache-2.0
---
name: aws-sdk-js-v3-usage
description: |
  AWS SDK for JavaScript v3 development patterns. Use when writing JavaScript or TypeScript code that uses AWS services via @aws-sdk/* packages (aws-sdk-js-v3), or when asked about schemas, runtime validation, serialization, or code generation in the context of the JS/TS AWS SDK.
---

> Do not use emojis in any code, comments, or output when this skill is active.

# AWS SDK for JavaScript v3

## Package Structure

- `@aws-sdk/client-*` — one per service, generated by [smithy-typescript](https://github.com/awslabs/smithy-typescript); one-to-one with AWS services and operations
- `@aws-sdk/lib-*` — higher-level helpers (e.g. `lib-dynamodb`, `lib-storage`)
- `@aws-sdk/*` (no prefix) — utility packages (mostly internal; don't import deep paths)

Always import from the package root:

```js
import { S3Client } from "@aws-sdk/client-s3"; // correct
// NOT: import { S3Client } from "@aws-sdk/client-s3/dist-cjs/S3Client"
```

## Two Client Styles

**Bare-bones** (preferred — smaller bundle):

```js
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
const client = new S3Client({ region: "us-east-1" });
const output = await client.send(new GetObjectCommand({ Bucket: "b", Key: "k" }));
```

**Aggregated** (v2-style but NOT v2, larger bundle):

```js
import { S3 } from "@aws-sdk/client-s3";
const client = new S3({ region: "us-east-1" });
const output = await client.getObject({ Bucket: "b", Key: "k" });
```

## Client Configuration

No global config in v3 — pass config to each client. `region` is always required; set it explicitly or via `AWS_REGION` env var.

```js
const config = { region: "us-east-1", maxAttempts: 5 };
const s3 = new S3Client(config);
const dynamo = new DynamoDBClient(config);
```

**Do not read or mutate `client.config` after instantiation** — it is a resolved form (e.g. `region` becomes an async function). See `references/effective-practices.md`.

For HTTP handler (`NodeHttpHandler` from `@smithy/node-http-handler`), retry strategy, endpoint details, logging, FIPS, dual-stack, protocol selection, and S3-specific options → see `references/clients.md`.

## Credentials

All providers from `@aws-sdk/credential-providers`. Credentials are lazy and cached per client until ~5 min before expiry.

```js
// Default chain (env → ini → IMDS/ECS) — use in most Node.js apps
const client = new S3Client({ credentials: fromNodeProviderChain() });

// Assume role (NOTE: fromTemporaryCredentials is correct for STS AssumeRole)
const client = new S3Client({
  credentials: fromTemporaryCredentials({ params: { RoleArn: "arn:aws:iam::123456789012:role/MyRole" } }),
});

// Named profile
const client = new S3Client({ profile: "my-profile" });
```

Share credentials and socket pool across multi-region clients:

```js
const east = new S3Client({ region: "us-east-1" });
const { credentials, requestHandler } = east.config;
const west = new S3Client({ region: "us-west-2", credentials, requestHandler });
```

For all providers (Cognito, SSO, web identity, custom chains, STS region priority) → see `references/credentials.md`.

## Streams (e.g. S3 GetObject Body)

**Always read or discard streaming responses** — unread streams leave sockets open (socket exhaustion):

```js
const { Body } = await client.send(new GetObjectCommand({ Bucket: "b", Key: "k" }));
const str = await Body.transformToString();       // read as string
const bytes = await Body.transformToByteArray();  // read as Uint8Array
// or discard:
await (Body.destroy?.() ?? Body.cancel?.());
```

Streams can only be read once.

## Paginators

Use `paginate*` functions instead of manual token handling:

```js
import { DynamoDBClient, paginateListTables } from "@aws-sdk/client-dynamodb";

const client = new DynamoDBClient({});

const tableNames = [];
for await (const page of paginateListTables({ client }, {})) {
  // page contains a single paginated output.
  tableNames.push(...page.TableNames);
}
```

## DynamoDB DocumentClient

Use `@aws-sdk/lib-dynamodb` to work with native JS types instead of AttributeValues:

```js
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, GetCommand, PutCommand } from "@aws-sdk/lib-dynamodb";

const client = DynamoDBDocumentClient.from(new DynamoDBClient({}));
await client.send(new PutCommand({ TableName: "T", Item: { id: "1", name: "Alice" } }));
const { Item } = await client.send(new GetCommand({ TableName: "T", Key: { id: "1" } }));
```

For marshall options, large numbers (NumberValue), pagination, and aggregated client → see `references/dynamodb.md`.

## S3: Presigned URLs, Multipart Upload, Waiters

```js
// Presigned GET URL
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
const url = await getSignedUrl(client, new GetObjectCommand({ Bucket: "b", Key: "k" }), { expiresIn: 3600 });

// Multipart upload (large files / streams)
import { Upload } from "@aws-sdk/lib-storage";
const upload = new Upload({ client, params: { Bucket: "b", Key: "k", Body: stream } });
await upload.done();

// Waiters
import { waitUntilObjectExists } from "@aws-sdk/client-s3";
await waitUntilObjectExists({ client, maxWaitTime: 120 }, { Bucket: "b", Key: "k" });
```

For presigned POST, signed headers, waiter options → see `references/s3.md`.

## Error Handling

```js
import { S3ServiceException } from "@aws-sdk/client-s3";

try {
  await client.send(new GetObjectCommand({ Bucket: "b", Key: "k" }));
} catch (e) {
  if (e?.$metadata) {
    // SDK service error — has $metadata.httpStatusCode, e.name, e.$response
    console.error(e.name, e.$metadata.httpStatusCode);
  }
}
```

Check `e.name` or `instanceof` for specific error types. See `references/error-handling.md` for full patterns.

For **runtime validation, serialization to non-default formats, or questions about what schemas are** in jsv3 → see `references/schemas.md`.

## Performance: Parallel Workloads

```js
// Configure maxSockets to match your parallel batch size
const client = new S3Client({
  requestHandler: { httpsAgent: { maxSockets: 50 } },
  cacheMiddleware: true, // skip if using custom middleware
});
```

**Streaming deadlock warning**: with limited sockets, don't `await` the request and stream body separately — chain them. See `references/performance.md`.

## Middleware

Add custom logic to all commands on a client:

```js
client.middlewareStack.add(
  (next, context) => async (args) => {
    console.log(context.commandName, args.input);
    const result = await next(args);
    return result;
  },
  { name: "MyMiddleware", step: "build", override: true }
);
```

Steps (in order): `initialize` → `serialize` → `build` → `finalizeRequest` → `deserialize`

## Abort Controller

```js
const { AbortController } = require("@aws-sdk/abort-controller");
const { S3Client, CreateBucketCommand } = require("@aws-sdk/client-s3");

const abortController = new AbortController();
const client = new S3Client(clientParams);

const requestPromise = client.send(new CreateBucketCommand(commandParams), {
  abortSignal: abortController.signal,
});

// The request will not be created if abortSignal is already aborted.
// The request will be destroyed if abortSignal is aborted before response is returned.
abortController.abort();

// This will fail with "AbortError" as abortSignal is aborted.
await requestPromise;
```

## Lambda Best Practices

Initialize clients **outside** the handler (container reuse), make API calls **inside**. For one-time async setup, use a lazy init flag inside the handler:

```js
import { S3Client } from "@aws-sdk/client-s3";

const client = new S3Client({}); // outside — reused across invocations

let ready = false;
export const handler = async (event) => {
  if (!ready) { await prepare(); ready = true; } // lazy one-time setup inside handler
  // ... API calls here
};
```

See `references/lambda.md` for Lambda layers and versioning.

## Node.js Version Requirements

- v3.968.0+ requires Node.js >= 20
- v3.723.0+ requires Node.js >= 18

## TypeScript

Response fields are typed as `T | undefined` by default. Use `AssertiveClient` from `@smithy/types` to remove `| undefined`, or `NodeJsClient` / `BrowserClient` to narrow streaming blob types. See `references/typescript.md`.

## SigV4a (S3 Multi-Region Access Points)

S3 MRAP and certain other features require SigV4a. You must install and side-effect-import exactly one of:

- `@aws-sdk/signature-v4-crt` — Node.js only, better performance
- `@aws-sdk/signature-v4a` — Node.js + browsers, pure JS

```js
import "@aws-sdk/signature-v4a"; // side-effect only — no exported values needed
```

See `references/sigv4a.md` for full details and MRAP ARN format.

© aws · Apache-2.0 · aws/agent-toolkit-for-aws

Similar skills

Everything for Cloud: AWS, Azure, GCP →

From the same set133

aws-billing-and-cost-management Analyzes AWS spending, discovers savings opportunities, and sets up budgets. Helps evaluate Savings Plans, detect cost anomalies, and right-size infrastructure. CX Codex +1 9,000installs aws-cloudformation Takes CloudFormation templates from authoring to failed-stack post-mortem: local validation, cfn-guard checks, account-aware pre-deploy checks and root-cause tracing. CX Codex +1 8,800installs amazon-bedrock Assists with Amazon Bedrock development, covering Converse API calls, Knowledge Bases RAG, Guardrails, and migrations to AgentCore Harness. CX Codex +1 8,500installs aws-messaging-and-streaming Tells the agent which AWS service moves your data: a queue, an event bus or a log. Useful before you commit to SQS or Kinesis. CX Codex +1 8,100installs aws-sdk-python-usage Guides agents writing Python code with boto3 and botocore. It enforces official patterns for client versus resource choice, error handling, paginators, and session reuse. CX Codex +1 7,800installs securing-s3-buckets A skill that walks the agent through five S3 workflows: creating a secured bucket, auditing an existing one, fixing findings, configuring encryption and enabling monitoring. CX Codex +1 6,900installs connecting-to-data-source Builds and tests an AWS Glue connection to Oracle, PostgreSQL, Redshift, Snowflake or BigQuery, so a job does not discover the wiring is wrong at runtime. CX Codex +1 6,800installs creating-secrets-using-best-practices Walks the agent through creating an AWS Secrets Manager secret with a dedicated KMS key, a tight IAM policy and rotation. Useful when the secret is headed for production. CX Codex +1 6,700installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor