DynamoDBのupdateItemのValidationException解消方法

  • 0
    Like
  • 0
    Comment

    AWSマネジメントコンソールでDynamoDBのテーブル作成する場合

    スクリーンショット 2017-02-21 18.20.12.png

    idはプライマリキーパーティションキーになっています。下記のソースをupdateItemすると

    let updateParam = {
                            "TableName" : "test",
                            "Key" : {
                                "id" : {"S" : "12345"}
                            },
                            "UpdateExpression" : "SET #name =:name",
                            "ExpressionAttributeNames" : {
                                "#name" : "name"
                            },
                            "ExpressionAttributeValues" : {
                                ":name" : {"S" : "Jane"}
                            }
                        };
    dynamodb.updateItem(updateParam, function(error, data) {
            if(error) {
                logger.error('error=' + util.inspect(error, false, null));
                if (error.retryable) {
                     //retry 
                     return;
                } else {
                    //todo
                    return;
                }
            } else {
                logger.info('update succeed');
            }
        });
    

    ValidationException

    下記のvalidationエラーが出ます。

    ValidationException: The provided key element does not match the schema
    

    原因

    AWSのドキュメントをみたら

    You can query only tables whose primary key is of hash-and-range type
    

    マネジメントコンソールから作成されたテーブルのプライマリキーはシンプル (パーティションキー) または複合 (パーティションキーとソートキー) になっています。UpdateItemはサポートされたプライマリキーはハッシュかハッシュ&レンジです。

    解決方法

    コマンドでテーブル作成、プライマリキーのtypeを指定することです。

    aws dynamodb create-table --table-name test --attribute-definitions '[{"AttributeName": "id", "AttributeType": "S"}]' --key-schema '[{"AttributeName": "id", "KeyType": "HASH"}]' --provisioned-throughput '{"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}'
    
    

    もう一回上記のnodeを実行したら、正常に更新できました。

    [2017-02-21 16:00:06.062] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.063] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.063] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.065] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.065] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.083] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.084] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.085] [INFO] [default] - update succeed
    [2017-02-21 16:00:06.087] [INFO] [default] - update succeed