DynamoDB Local に GSI を作ろうとしてハマった話(PowerShellとJSONの罠)

症状(出たエラー)

DynamoDB の --global-secondary-indexes に JSON を直接渡したら、こんなエラー:

Error parsing parameter '--global-secondary-indexes': Invalid JSON: Expecting property name enclosed in double quotes
JSON received: [{IndexName:OwnerUpdated,KeySchema:[{AttributeName:ownerSub,KeyType:HASH},{AttributeName:updatedAt,KeyType:RANGE}],Projection:{ProjectionType:ALL},ProvisionedThroughput:{ReadCapacityUnits:5,WriteCapacityUnits:5}}]

ポイントは 「JSON received: …」の中でキーにダブルクォートが付いてない こと。
= CLI に届いた時点で JSON が壊れている

何が間違っていたのか?

PowerShell 上で JSON のクォートが崩れていた
典型的には次のようなパターンです:

  • 外側も内側も ダブルクォートで囲ってしまう
  • **スマートクォート(“ ” ‘ ’)**が混ざる(ブログやメールからのコピペで発生)
  • バックスティック(`)のエスケープが不完全で、結果的に ダブルクォートが削除される
  • JSON を YAML/JS 風に(キーをクォートせずに)書いてしまう
    • 例: {IndexName:OwnerUpdated,...}JSON では NG必ず "IndexName":"OwnerUpdated" のようにダブルクォートが必要

PowerShell は 文字列のクォートやエスケープ規則が Bash と違うため、
「Bash では通る一行」が PowerShell では簡単に壊れた JSON になるのが根本原因です。

[解決策] file:// 方式

JSON をファイルに書き出してから参照する。PowerShell依存のクォート問題を回避できます。

Set-Content -Path gsi.json -Value '[{"IndexName":"OwnerUpdated","KeySchema":[{"AttributeName":"ownerSub","KeyType":"HASH"},{"AttributeName":"updatedAt","KeyType":"RANGE"}],"Projection":{"ProjectionType":"ALL"},"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":5}}]'
aws dynamodb create-table --endpoint-url http://localhost:8000 --table-name easyclip-projects-v1 --attribute-definitions AttributeName=projectId,AttributeType=S AttributeName=ownerSub,AttributeType=S AttributeName=updatedAt,AttributeType=S --key-schema AttributeName=projectId,KeyType=HASH --global-secondary-indexes file://gsi.json --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

再発防止チェックリスト

  • JSONのキーと文字列はすべてダブルクォート"IndexName" / "OwnerUpdated"
  • 外側はシングルクォート、JSONの中はダブルクォート(PowerShellの一行直書き時)
  • 全角クォートやスマートクォートが混じっていない
  • 迷ったら file:// 方式 に逃がす
  • PowerShell で複雑になったら ConvertTo-Json を使う

付録:検証コマンド

aws dynamodb list-tables –endpoint-url http://localhost:8000

コメント

タイトルとURLをコピーしました