🤨

[AWS SAM]デプロイ時'extraneous key [LocalSecondaryIndex] is not permitted'

2023/07/01に公開

はじめに


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