症状(出たエラー)
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
コメント