DynamoDB DocumentClientで 'The provided key element does not match the schema' エラーが出る

Node.jsでDocumentClientを使ってテーブルから指定したPK・SKの組み合わせのレコードを削除するスクリプトを書いた。 しかし The provided key element does not match the schema 例外が上がってうまく動かない。

const AWS = require('aws-sdk');
const documentClient = new AWS.DynamoDB.DocumentClient();

const deleteUser = async (email, user_id) => {
  console.log('deleting user');
  var params = {
    TableName: 'UserData',
    Key: {
      email: email,
      user_id: user_id
    }
  };
  await documentClient.delete(params).promise();
};

deleteUser('someone@example.com', 100);

なぜか。

色々試したが、原因はスキーマが合っていなかったからだった。 ソートキーの user_id はString型だった... なので、以下のように修正した。

+      user_id: (String)user_id
-      user_id: user_id

テーブルのスキームに合わせてキャストしてあげないとAWS SDKが文字列型にいい感じに変換してくれてしまうので、 予期しない動きをするのである。

動的型付けのNode.jsやPHPに慣れていると、見落としがちだ。