Amazon Dynamodb
Designs, reviews, and debugs DynamoDB data layers from design axioms — enumerates access patterns, chooses partition/sort keys and GSIs, decides single-table vs. multi-table, configures Streams, Global Tables, TTL, vector indexes for similarity search, and zero-ETL integrations to OpenSearch/Redshift/SageMaker Lakehouse, and produces a defensible data-layer design with a monthly cost estimate and optional live validation. Applies whenever a user is designing, reviewing, or refactoring anything backed by DynamoDB — schemas, access patterns, GSIs, single- vs. multi-table choices, Streams consumers, transactional outboxes, Global Tables, zero-ETL pipelines, or storing embeddings and running semantic/vector similarity search with SearchVectors on items already in DynamoDB — even when they don't say "axioms" or "design review." Also applies when debugging hot partitions, throttling, unbounded Scans, LWW conflicts, or surprise bills on DynamoDB workloads.
- Skill ID
- aws/agent-toolkit-for-aws/amazon-dynamodb
- Publisher
- aws
- Repository
- agent-toolkit-for-aws
- Installs
- 0
- Files
- 15
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
aws/agent-toolkit-for-aws/amazon-dynamodbInstalls these files- SKILL.md
- references/cost-model-schema.md
- references/loop-state-schema.md
- references/performance-model-schema.md
- references/performance-report-format.md
- references/reference-architecture.md
- references/vector-search.md
- scripts/benchmark_lambda.py
- scripts/benchmark_model.py
- scripts/calculate_costs.py
- scripts/deploy_model.py
- scripts/find_skill_dir.sh
- scripts/generate_perf_report.py
- scripts/generate_teardown.py
- scripts/iterate_design.py
What this skill tells the agent
DynamoDB Axioms
This document is a set of design axioms for DynamoDB applications. It is intended to be read by an agent with no other context about the application and used to produce a defensible data-layer design.
Guardrail — where this skill's own files live (MCP vs local install)
This skill can be loaded two ways, and they resolve the skill's own bundled files from different places. Determine how the skill was loaded before reading a reference or running a script:
- Loaded through the AWS MCP `retrieve_skill` tool: The skill is not installed on the local filesystem. You MUST fetch each reference or script via
retrieve_skillwith thefileparameter (e.g.file="references/vector-search.md"orfile="scripts/calculate_costs.py"), and run the script from the returned content. Do NOTfile_readthese paths locally — they do not exist on disk. - Installed locally (e.g.
.kiro/skills/amazon-dynamodb/or~/.claude/skills/amazon-dynamodb/): Read and run files from the local skill directory using relative paths.
This distinction applies only to the skill's own packaged files. User data and session artifacts are always read from and written to the user's working directory. Never fetch or write customer data through retrieve_skill.
Separately from where these files live: this skill calls real AWS APIs when it validates a design, deploys a scratch table or benchmarks one. The AWS MCP server is recommended for those AWS interactions where it is available — it gives consistent credential handling and region resolution across hosts. It is not required: every script here uses boto3 and the AWS CLI against the ambient credential chain, so the skill works unchanged when no MCP server is present.
The ${SKILL_DIR} resolution below applies to the locally installed case: over MCP there is no directory to resolve, and the scripts this skill ships cannot be executed from a returned string — so a cost estimate or live validation requires the locally installed form.
Resolving the skill's own paths
This skill is host-agnostic — it runs under Claude Code, Kiro, Codex, Cursor, a plain terminal, or CI. Where it lives on disk depends on the host (~/.claude/skills/…, ~/.kiro/…, ~/.codex/…, ~/.cursor/…, a repo checkout, anywhere). The agent's working directory is the user's project, not the skill bundle, so relative paths like scripts/calculate_costs.py will not resolve. Throughout this document, ${SKILL_DIR} means the absolute path of the directory that contains this SKILL.md file (the skill root, which holds scripts/ and references/).
Resolve `${SKILL_DIR}` once per session, then reuse it. Pick the first method that works in your host:
- You already know it. You loaded SKILL.md from a path —
${SKILL_DIR}is the directory that file is in. This is the most reliable source; prefer it. - An environment variable. If
$DDB_SKILL_DIRis set, trust it. - The bundled resolver (host-neutral, no host assumptions). It searches the common install roots and verifies the hit against sentinel files, so it never returns the wrong directory silently:
# If you already know the path to the script, just run it directly:
# SKILL_DIR="$(sh /path/to/amazon-dynamodb/scripts/find_skill_dir.sh)"
# If you don't, this host-neutral one-liner searches the common roots
# (~/.claude, ~/.kiro, ~/.codex, ~/.cursor, ~/.config, ~/.local/share, $PWD):
SKILL_DIR="$(find "$HOME" "$PWD" -maxdepth 7 -type f -name SKILL.md -path '*amazon-dynamodb*' 2>/dev/null \
| head -1 | xargs -I{} dirname {})"
# Verify it before trusting it (sentinel check), then hand off to the resolver
# for its loud-on-failure diagnostics:
SKILL_DIR="$(sh "$SKILL_DIR/scripts/find_skill_dir.sh" 2>/dev/null || echo "$SKILL_DIR")"The resolver prints the verified skill root and exits 0, or prints nothing and exits non-zero with a fix-it message — so SKILL_DIR="$(sh …/find_skill_dir.sh)" is safe to trust when it succeeds. It is plain POSIX sh, so it behaves identically across hosts.
Once resolved, export it so every later command is a clean substitution and the scripts can also pick it up:
export DDB_SKILL_DIR="$SKILL_DIR"
python3 "$DDB_SKILL_DIR/scripts/calculate_costs.py" --model dynamodb_data_model.json --output cost_report.mdInternally the scripts locate their own siblings (other scripts, scripts/benchmark_lambda.py) relative to themselves, so you only ever need the root path — never each individual script path.
Rules:
- Always invoke scripts with an absolute path (the
$DDB_SKILL_DIR/…form). Do notcdinto the skill directory — the user's working directory must stay put so their artifacts (dynamodb_data_model.json,cost_report.md, …) land where they expect. - If none of the three methods resolves the directory, stop and ask the user where the skill is installed rather than guessing. A wrong
${SKILL_DIR}produces confusing "file not found" failures downstream; one clarifying question is cheaper.
The pipeline at a glance
The skill is one tool per stage. The default path touches no AWS: most work is stage 1 (a design you can discuss and refine conversationally). Stage 2 (cost) runs on request or when the design is being finalized — not reflexively every turn. Stages 3–6 are a distinctly opt-in, heavyweight fork that creates real AWS resources and incurs a real bill; enter it only on explicit user agreement. Each stage's detailed contract is in the section named in the last column.
| # | Stage | Command (after export DDB_SKILL_DIR=…) | Reads | Writes | AWS? | Section |
|---|---|---|---|---|---|---|
| 1 | Design | (no script — you produce the access-pattern list + schema) | — | (in-reply artifacts) | no | Artifacts to produce |
| 2 | Cost | python3 "$DDB_SKILL_DIR/scripts/calculate_costs.py" --model dynamodb_data_model.json --output cost_report.md | dynamodb_data_model.json | cost_report.md | no | Cost estimation |
| 3 | Deploy | python3 "$DDB_SKILL_DIR/scripts/deploy_model.py" --model dynamodb_data_model.json --config benchmark_config.json --manifest-out created_resources.json --yes-deploy | model + config | created_resources.json | yes | Live validation |
| 4 | Benchmark | python3 "$DDB_SKILL_DIR/scripts/benchmark_model.py" --model dynamodb_data_model.json --config benchmark_config.json --manifest created_resources.json --raw-out perf_raw.jsonl --summary-out perf_summary.json | model + config + manifest | perf_raw.jsonl, perf_summary.json | yes | Live validation |
| 5 | Report | python3 "$DDB_SKILL_DIR/scripts/generate_perf_report.py" --model dynamodb_data_model.json --summary perf_summary.json --output performance_report.md | model + summary | performance_report.md, design_findings.json | no | Live validation |
| 6 | Teardown | python3 "$DDB_SKILL_DIR/scripts/generate_teardown.py" --manifest created_resources.json --out teardown.sh → review → bash teardown.sh --confirm | manifest | teardown.sh | yes (on --confirm) | Live validation step 6 |
| — | Iterate | python3 "$DDB_SKILL_DIR/scripts/iterate_design.py" … (wraps 3→4→5→cost as one human-driven round) | model + config + loop-state + manifest | loop_state.json + the above | yes (gated) | Iterative design loop |
Who reads what. You (the agent) read the compact artifacts: cost_report.md, design_findings.json, loop_state.json. The user reads performance_report.md. Never read perf_raw.jsonl (large) — it only feeds stage 5.
Consent gates. Stage 3+ needs --yes-deploy; the benchmark refuses to spend over cost_guardrail_usd without --allow-spend; teardown needs the user's attested review and intent before you run bash teardown.sh --confirm. Details in Live validation.
More from aws
Use this skill in a project
Open any RiverX project, search the Skills panel for aws/agent-toolkit-for-aws/amazon-dynamodb, and install it in one click.
