🤨
[AWS SAM]デプロイ時'extraneous key [LocalSecondaryIndex] is not permitted'
はじめに
AWS SAMでデプロイ時に、以下の2つのエラーに小一時間悩まれされたので備忘ります。
エラーになるyaml
エラーになるyamlです。原因分かりますか?
Resources:
TodoTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: todo
AttributeDefinitions:
- AttributeName: userid
AttributeType: S
- AttributeName: todoid
AttributeType: S
KeySchema:
- AttributeName: userid
KeyType: HASH
- AttributeName: todoid
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: "3"
WriteCapacityUnits: "3"
LocalSecondaryIndex:
- IndexName: KeywordIndex
KeySchema:
- AttributeName: userid
KeyType: HASH
- AttributeName: search_word
KeyType: RANGE
Projection:
ProjectionType: ALL
。。。そうですね。
プロパティ名が間違えてましたね。すいませんでした。『いんでっくす』ではなく、『いんでっくしいず』でした。
これで一個目のエラーは解消しました。
誤
LocalSecondaryIndex:
- IndexName: KeywordIndex
正
LocalSecondaryIndexes:
- IndexName: KeywordIndex
言い訳ですが、CloudFormationのユーザーガイドのメニューは『LocalSecondaryIndex』なんですよね。
!
2つ目のエラーの解消
あとは、2つ目のエラーですが、
An attribute referenced in a KeySchema element is not defined in AttributeDefinitions
→「KeySchema要素で参照される属性が AttributeDefinitions で定義されていません」ですね。
Resources:
TodoTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: todo
AttributeDefinitions:
- AttributeName: userid
AttributeType: S
- AttributeName: todoid
AttributeType: S # ← 「AttributeDefinitions で定義されていません」
KeySchema:
- AttributeName: userid
KeyType: HASH
- AttributeName: todoid
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: "3"
WriteCapacityUnits: "3"
LocalSecondaryIndex:
- IndexName: KeywordIndex
KeySchema:
- AttributeName: userid
KeyType: HASH
- AttributeName: search_word # → 「KeySchema要素で参照される属性が」
KeyType: RANGE
Projection:
ProjectionType: ALL
確かに。定義が漏れてましたね。
追加したyamlがこちらです。
Resources:
TodoTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: todo
AttributeDefinitions:
- AttributeName: userid
AttributeType: S
- AttributeName: todoid
AttributeType: S
- AttributeName: search_word# # ← AttributeDefinitionsに定義追加
AttributeType: S
KeySchema:
- AttributeName: userid
KeyType: HASH
- AttributeName: todoid
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: "3"
WriteCapacityUnits: "3"
LocalSecondaryIndexes:
- IndexName: KeywordIndex
KeySchema:
- AttributeName: userid
KeyType: HASH
- AttributeName: search_word # → KeySchema要素で参照される属性を
KeyType: RANGE
Projection:
ProjectionType: ALL
これで、無事にデプロイが完了してテーブル作成することができました。
$ aws dynamodb describe-table --table-name=todo
TABLE 2023-06-28T21:31:45.954000+09:00 False 0 arn:aws:dynamodb:ap-northeast-1:259206299999:table/todo 53fc42b9-ae8e-4b04-beec-d6229677af4b todo 0 ACTIVE
ATTRIBUTEDEFINITIONS search_word S
ATTRIBUTEDEFINITIONS todoid S
ATTRIBUTEDEFINITIONS userid S
KEYSCHEMA userid HASH
KEYSCHEMA todoid RANGE
LOCALSECONDARYINDEXES arn:aws:dynamodb:ap-northeast-1:259206299999:table/todo/index/KeywordIndex KeywordIndex 0 0
KEYSCHEMA userid HASH
KEYSCHEMA search_word RANGE
PROJECTION ALL
PROVISIONEDTHROUGHPUT 0 3 3
まとめ
ちゃんと書いたつもりなのにデプロイ失敗すると焦りますよね。
思い通りにいかなくても、1つ1つエラー内容を確認して冷静に解決していきたいなと思います。
Discussion