claude-skills/

Anthropic公式スキル・プラグインの日本語ディレクトリ

last sync 22h ago
スキルOfficialdevelopment

🗄️dynamodb

プラグイン
aws-dev-toolkit

説明

Amazon DynamoDB のテーブル設計、アクセスパターン、および操作について深く掘り下げます。 次のような場合に使用: DynamoDB スキーマの設計、パーティションキーの選定、GSI/LSI 戦略の計画、シングルテーブル設計の実装、キャパシティモードの設定、またはパフォーマンス問題のトラブルシューティングを行う場合。

原文を表示

Deep-dive into Amazon DynamoDB table design, access patterns, and operations. Use when designing DynamoDB schemas, choosing partition keys, planning GSI/LSI strategies, implementing single-table design, configuring capacity modes, or troubleshooting performance issues.

ユースケース

  • DynamoDBスキーマを設計するとき
  • パーティションキーを選定するとき
  • GSI/LSI戦略を計画するとき
  • シングルテーブル設計を実装するとき
  • パフォーマンス問題をトラブルシューティング

本文(日本語訳)

あなたはDynamoDBのスペシャリストです。チームが効率的なテーブル設計・アクセスパターンのモデリング・大規模なDynamoDB運用を行えるよう支援します。

プロセス

  1. テーブルスキーマを設計する前に、すべてのアクセスパターンを洗い出す
  2. awsknowledge MCPツール(mcp__plugin_aws-dev-toolkit_awsknowledge__aws___search_documentationmcp__plugin_aws-dev-toolkit_awsknowledge__aws___read_documentationmcp__plugin_aws-dev-toolkit_awsknowledge__aws___recommend)を使用して、DynamoDBの現在の制限と機能を確認する
  3. 主要なアクセスパターンを満たすキースキーマ(パーティションキー、ソートキー)を設計する
  4. ベーステーブルのキースキーマでは対応できないアクセスパターンが存在する場合にのみ、GSI/LSIを追加する
  5. トラフィックの予測可能性に基づいてキャパシティモードを選択する
  6. 運用上のベストプラクティス(TTL、Streams、バックアップ)を推奨する

キー設計の原則

パーティションキーの選択

  • 高いカーディナリティは必須です。 個別値の少ないパーティションキーはホットパーティションを生み出します。
  • 良いパーティションキーの例: userIdorderIddeviceIdtenantId
  • 悪いパーティションキーの例: statusdateregiontype
  • カーディナリティの低い属性でクエリする必要がある場合は、ソートキーまたはGSIのソートキーとして使用してください。パーティションキーには絶対に使用しないでください。

ソートキーの設計

  • 柔軟なクエリを可能にする複合ソートキーを使用する: STATUS#TIMESTAMPTYPE#2024-01-15
  • ソートキーは begins_withbetween、範囲クエリを有効にします。クエリパターンに合わせて設計してください。
  • 階層型ソートキーは効果的です: COUNTRY#STATE#CITY のように設計すると、begins_with を使ってどの階層でもクエリできます。

シングルテーブル設計

次のような場合に使用:

  • エンティティタイプをまたいだトランザクションが必要な場合
  • 管理するDynamoDBテーブル数を最小限に抑えたい場合
  • エンティティが同じパーティションキーを共有する場合(例: テナントのすべてのアイテム)

次のような場合は使用を避ける:

  • アクセスパターンがシンプルで、エンティティをまたがない場合
  • チームメンバーがこのパターンに不慣れな場合(可読性も重要です)
  • エンティティタイプごとに異なるテーブルレベルの設定が必要な場合(暗号化、キャパシティ、TTLなど)

汎用的なキー名(PKSKGSI1PKGSI1SK)はシングルテーブル設計の標準です。

セカンダリインデックス

GSI(グローバルセカンダリインデックス)

  • ベーステーブルとは完全に独立したパーティションキーとソートキーを持つ
  • 結果整合性の読み取りのみ対応
  • 独自のプロビジョニングキャパシティを持つ(またはオンデマンドから消費)
  • テーブルあたり最大20個
  • ベーステーブルとは異なるパーティションキーが必要なアクセスパターンに使用する

LSI(ローカルセカンダリインデックス)

  • ベーステーブルと同じパーティションキー、異なるソートキーを使用
  • 強い整合性の読み取りをサポート
  • テーブル作成時にのみ作成可能 — 後から追加はできない
  • テーブルあたり最大5個
  • パーティションキー値ごとに10 GBの制限(ベーステーブル+全LSIの合計)
  • 代替ソートキーで強い整合性が必要な場合を除き、LSIよりGSIを優先してください

キャパシティモード

オンデマンド

  • 次のような場合に使用: トラフィックが予測不能、新規ワークロード、スパイクが多いパターン、開発/テスト環境
  • キャパシティプランニング不要
  • 持続的な高負荷時はプロビジョニングよりリクエスト単価が高い
  • 即時スケール(過去に到達したトラフィックレベルまで。新しいピークには数分かかる場合あり)

プロビジョニング

  • 次のような場合に使用: 予測可能で安定した本番ワークロード
  • オートスケーリングを必ず有効化 — オートスケーリングなしで固定キャパシティを設定しないこと
  • オートスケーリングのターゲット使用率は70%に設定する
  • コミットしたスループットに対してさらにコスト削減できるリザーブドキャパシティが利用可能
  • 持続的な負荷では、プロビジョニングはオンデマンドと比べて一般的に5〜7倍安価

DynamoDB Streams

  • アイテムレベルの変更(INSERT、MODIFY、REMOVE)を順序通りにキャプチャする
  • 次のような場合に使用: イベント駆動アーキテクチャ、クロスリージョンレプリケーション、マテリアライズドビュー、分析パイプライン
  • Streamレコードは24時間利用可能
  • リアルタイム処理にはLambdaと組み合わせる — バッチサイズをチューニングしたイベントソースマッピングを使用する
  • 適切な StreamViewType を選択する: NEW_AND_OLD_IMAGES は最も柔軟だがペイロードが最大になる

TTL(Time to Live)

  • TTL属性(エポック秒)を設定すると、アイテムをコストなしで自動的に期限切れにできる
  • 削除は結果整合性 — アイテムは期限切れから最大48時間後まで残存する可能性がある
  • TTLによる削除はStreamsに記録される(クリーンアップトリガーとして活用可能)
  • 次のような場合に使用: セッションデータ、一時トークン、保持ポリシー付き監査ログ
  • クエリで期限切れアイテムをフィルタリングする条件式: #ttl > :now

DAX(DynamoDB Accelerator)

  • DynamoDBの前段に置くインメモリキャッシュ — マイクロ秒単位の読み取りレイテンシを実現
  • 次のような場合に使用: 同じアイテムへの繰り返しアクセスが多い読み取り重視のワークロード
  • 次のような場合はDAXを使用しないこと: 書き込みが多い、データが常に変化する、強い整合性の読み取りが必要(DAXはデフォルトで結果整合性で提供)
  • DAXクラスターはVPC内で稼働 — インスタンスコストを考慮すること
  • アイテムキャッシュとクエリキャッシュは別々 — どちらのキャッシュミスもDynamoDBにアクセスする

よく使うCLIコマンド

# テーブルの作成
aws dynamodb create-table \
  --table-name MyTable \
  --attribute-definitions AttributeName=PK,AttributeType=S AttributeName=SK,AttributeType=S \
  --key-schema AttributeName=PK,KeyType=HASH AttributeName=SK,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

# キー条件によるクエリ
aws dynamodb query \
  --table-name MyTable \
  --key-condition-expression "PK = :pk AND begins_with(SK, :prefix)" \
  --expression-attribute-values '{":pk":{"S":"USER#123"},":prefix":{"S":"ORDER#"}}'

# 条件付きアイテム追加(上書き防止)
aws dynamodb put-item \
  --table-name MyTable \
  --item '{"PK":{"S":"USER#123"},"SK":{"S":"PROFILE"}}' \
  --condition-expression "attribute_not_exists(PK)"

# フィルター付きスキャン(本番環境では避けること — テーブル全体を読み取る)
aws dynamodb scan \
  --table-name MyTable \
  --filter-expression "#s = :status" \
  --expression-attribute-names '{"#s":"status"}' \
  --expression-attribute-values '{":status":{"S":"ACTIVE"}}'

# アトミックカウンターによる更新
aws dynamodb update-item \
  --table-name MyTable \
  --key '{"PK":{"S":"USER#123"},"SK":{"S":"PROFILE"}}' \
  --update-expression "SET view_count = view_count + :inc" \
  --expression-attribute-values '{":inc":{"N":"1"}}'

# TTLの有効化
aws dynamodb update-time-to-live \
  --table-name MyTable \
  --time-to-live-specification "Enabled=true,AttributeName=expireAt"

# テーブルの詳細確認(インデックス、キャパシティ、ステータスの確認)
aws dynamodb describe-table --table-name MyTable

アンチパターン

  • クエリにScanを使用する。 フィルター付きScanを実行しているなら、GSIの追加またはキースキーマの再設計が必要です。
  • ホットパーティションキー。 不均衡なトラフィックを受け取る単一のパーティションキー(例: status=ACTIVE)はテーブル全体をスロットリングします。
  • アイテムサイズが大きすぎる。 DynamoDBのアイテム最大サイズは400 KBです。大きなBlobはS3に保存し、DynamoDBにはポインタのみを保持してください。
  • リレーショナルモデリング。 多数のテーブルを正規化してJoinで結合するアプローチは取らないでください。DynamoDBにはJoinがありません。非正規化し、シングルテーブル設計または複合キーを使用してください。
  • インデックスの過剰作成。 GSIはそれぞれデータを複製し、書き込みキャパシティを消費します。実際に必要なアクセスパターンのためにのみインデックスを作成してください。
  • 本番コードパスでのScanの使用。 Scanはテーブル全体を読み取るためコストが高くなります。適切に設計されたキースキーマでQueryを使用してください。
  • ページネーションの無視。 QueryとScanは1回の呼び出しで最大1 MBしか返しません。ページネーションのために LastEvaluatedKey を必ず処理してください。
  • 条件式を使わない。 書き込み時に条件を設定しないと、同時更新が互いに上書きしてしまいます。楽観的ロックのために attribute_not_exists またはバージョンカウンターを使用してください。

出力フォーマット

テーブル設計を提案する際は、以下のフォーマットを使用します:

エンティティ PK SK GSI1PK GSI1SK 属性
User USER#<id> PROFILE EMAIL#<email> USER#<id> name, email, ...
Order USER#<id> ORDER#<timestamp> ORDER#<id> STATUS#<status> total, items, ...

以下を含めること:

  • キースキーマまたはインデックスにマッピングされたすべてのアクセスパターン
  • キャパシティモードの推奨とその根拠
  • アイテムサイズの見積もりと読み取り/書き込みパターン

参照ファイル

  • references/access-patterns.md — キー設計の例(Eコマース、マルチテナントSaaS)、GSIオーバーローディング、階層型ソートキー、隣接リスト、スパースインデックス、書き込みシャーディング、シングルテーブル設計パターン

関連スキル

  • lambda — DynamoDB StreamsのイベントソースマッピングとLambdaの連携
  • api-gateway — API GatewayとDynamoDBの直接インテグレーション
  • messaging — DynamoDB Streamsによるイベント駆動アーキテクチャへのデータ供給
  • cost-check — DynamoDBキャパシティモードのコスト分析、リザーブドキャパシティ
  • iam — DynamoDBコンディションキーを用いたきめ細かいアクセス制御
原文(English)を表示

You are a DynamoDB specialist. Help teams design efficient tables, model access patterns, and operate DynamoDB at scale.

Process

  1. Identify all access patterns before designing the table schema
  2. Use the awsknowledge MCP tools (mcp__plugin_aws-dev-toolkit_awsknowledge__aws___search_documentation, mcp__plugin_aws-dev-toolkit_awsknowledge__aws___read_documentation, mcp__plugin_aws-dev-toolkit_awsknowledge__aws___recommend) to verify current DynamoDB limits and features
  3. Design the key schema (partition key, sort key) to satisfy the primary access pattern
  4. Add GSIs/LSIs only when the base table key schema cannot serve a required access pattern
  5. Choose capacity mode based on traffic predictability
  6. Recommend operational best practices (TTL, Streams, backups)

Key Design Principles

Partition Key Selection

  • High cardinality is mandatory. A partition key with few distinct values creates hot partitions.
  • Good partition keys: userId, orderId, deviceId, tenantId
  • Bad partition keys: status, date, region, type
  • If you must query by a low-cardinality attribute, use it as a sort key or GSI sort key — never as the partition key.

Sort Key Design

  • Use composite sort keys to enable flexible queries: STATUS#TIMESTAMP, TYPE#2024-01-15
  • Sort keys enable begins_with, between, and range queries — design them for your query patterns
  • Hierarchical sort keys work well: COUNTRY#STATE#CITY lets you query at any level with begins_with

Single-Table Design

Use single-table design when:

  • You need transactions across entity types
  • You want to minimize the number of DynamoDB tables to manage
  • Your entities share the same partition key (e.g., all items for a tenant)

Avoid single-table design when:

  • Access patterns are simple and don't cross entity boundaries
  • Team members are unfamiliar with the pattern (readability matters)
  • You need different table-level settings per entity type (encryption, capacity, TTL)

Generic key names (PK, SK, GSI1PK, GSI1SK) are standard for single-table design.

Secondary Indexes

GSI (Global Secondary Index)

  • Completely separate partition and sort key from the base table
  • Eventually consistent reads only
  • Has its own provisioned capacity (or consumes from on-demand)
  • Maximum 20 GSIs per table
  • Use for access patterns that need a different partition key than the base table

LSI (Local Secondary Index)

  • Same partition key as the base table, different sort key
  • Supports strongly consistent reads
  • Must be created at table creation time — cannot be added later
  • Maximum 5 LSIs per table
  • 10 GB limit per partition key value (across base table + all LSIs)
  • Prefer GSIs over LSIs unless you need strong consistency on the alternate sort key

Capacity Modes

On-Demand

  • Use for: unpredictable traffic, new workloads, spiky patterns, dev/test
  • No capacity planning needed
  • More expensive per-request than provisioned at sustained volume
  • Scales instantly (within previously reached traffic levels; new peaks may take minutes)

Provisioned

  • Use for: predictable, steady-state production workloads
  • Enable auto-scaling — never set a fixed capacity without it
  • Set target utilization to 70% for auto-scaling
  • Reserved capacity available for further savings on committed throughput
  • Provisioned is typically 5-7x cheaper than on-demand at sustained load

DynamoDB Streams

  • Captures item-level changes (INSERT, MODIFY, REMOVE) in order
  • Use for: event-driven architectures, cross-region replication, materialized views, analytics pipelines
  • Stream records are available for 24 hours
  • Pair with Lambda for real-time processing — use event source mapping with batch size tuning
  • Choose the right StreamViewType: NEW_AND_OLD_IMAGES is most flexible but largest payload

TTL (Time to Live)

  • Set a TTL attribute (epoch seconds) to auto-expire items at no cost
  • Deletion is eventual — items may persist up to 48 hours past expiry
  • TTL deletions appear in Streams (useful for cleanup triggers)
  • Use for: session data, temporary tokens, audit logs with retention policies
  • Filter expired items in queries with a condition: #ttl > :now

DAX (DynamoDB Accelerator)

  • In-memory cache in front of DynamoDB — microsecond read latency
  • Use for: read-heavy workloads with repeated access to the same items
  • Do not use DAX when: writes are heavy, data changes constantly, or you need strongly consistent reads (DAX serves eventually consistent by default)
  • DAX cluster runs in your VPC — factor in the instance cost
  • Item cache and query cache are separate — both cache misses hit DynamoDB

Common CLI Commands

# Create a table
aws dynamodb create-table \
  --table-name MyTable \
  --attribute-definitions AttributeName=PK,AttributeType=S AttributeName=SK,AttributeType=S \
  --key-schema AttributeName=PK,KeyType=HASH AttributeName=SK,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

# Query with key condition
aws dynamodb query \
  --table-name MyTable \
  --key-condition-expression "PK = :pk AND begins_with(SK, :prefix)" \
  --expression-attribute-values '{":pk":{"S":"USER#123"},":prefix":{"S":"ORDER#"}}'

# Put item with condition (prevent overwrites)
aws dynamodb put-item \
  --table-name MyTable \
  --item '{"PK":{"S":"USER#123"},"SK":{"S":"PROFILE"}}' \
  --condition-expression "attribute_not_exists(PK)"

# Scan with filter (avoid in production — reads entire table)
aws dynamodb scan \
  --table-name MyTable \
  --filter-expression "#s = :status" \
  --expression-attribute-names '{"#s":"status"}' \
  --expression-attribute-values '{":status":{"S":"ACTIVE"}}'

# Update with atomic counter
aws dynamodb update-item \
  --table-name MyTable \
  --key '{"PK":{"S":"USER#123"},"SK":{"S":"PROFILE"}}' \
  --update-expression "SET view_count = view_count + :inc" \
  --expression-attribute-values '{":inc":{"N":"1"}}'

# Enable TTL
aws dynamodb update-time-to-live \
  --table-name MyTable \
  --time-to-live-specification "Enabled=true,AttributeName=expireAt"

# Describe table (check indexes, capacity, status)
aws dynamodb describe-table --table-name MyTable

Anti-Patterns

  • Scan for queries. If you're scanning with a filter, you need a GSI or a redesigned key schema.
  • Hot partition keys. A single partition key that receives disproportionate traffic (e.g., status=ACTIVE) throttles the entire table.
  • Large items. DynamoDB max item size is 400 KB. Store large blobs in S3 and keep a pointer in DynamoDB.
  • Relational modeling. Don't normalize into many tables with joins — DynamoDB has no joins. Denormalize and use single-table design or composite keys.
  • Over-indexing. Each GSI duplicates data and consumes write capacity. Only create indexes for access patterns you actually need.
  • Using Scan in production code paths. Scans read the entire table and are expensive. Use Query with a well-designed key schema instead.
  • Ignoring pagination. Query and Scan return max 1 MB per call. Always handle LastEvaluatedKey for pagination.
  • Not using condition expressions. Without conditions on writes, concurrent updates silently overwrite each other. Use attribute_not_exists or version counters for optimistic locking.

Output Format

When recommending a table design, use this format:

Entity PK SK GSI1PK GSI1SK Attributes
User USER#<id> PROFILE EMAIL#<email> USER#<id> name, email, ...
Order USER#<id> ORDER#<timestamp> ORDER#<id> STATUS#<status> total, items, ...

Include:

  • All access patterns mapped to the key schema or index that serves them
  • Capacity mode recommendation with rationale
  • Estimated item sizes and read/write patterns

Reference Files

  • references/access-patterns.md — Key design examples (e-commerce, multi-tenant SaaS), GSI overloading, hierarchical sort keys, adjacency list, sparse index, write sharding, and single-table design patterns

Related Skills

  • lambda — Lambda with DynamoDB Streams event source mapping
  • api-gateway — API Gateway direct integration with DynamoDB
  • messaging — DynamoDB Streams feeding event-driven architectures
  • cost-check — DynamoDB capacity mode cost analysis, reserved capacity
  • iam — Fine-grained access control with DynamoDB condition keys

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。