Lambda(Node.js)からDynamoDBのテーブルを更新する

求人

Lambda(Node.js)からDynamoDBのテーブルを更新します。

AWS.DynamoDB.DocumentClient()#updateメソッドで更新することができます。このメソッドはAWS.DynamoDB()#updateItemメソッドに委譲するので、指定するパーティションキー(かつ、ソートキー)のデータがあれば更新し、データがなければインサートします。(アップサート)

第一引数にパラメータを入れます。パラメータは以下のとおりです。

TableName テーブル名を指定します
Key パーティションキー、ソートキーを指定します
UpdateExpression 更新する構文を記述します(省略可)
ConditionExpression 更新条件を指定します(省略可)
ExpressionAttributeNames 属性(列名)のバインド変数を指定します(省略可)
ExpressionAttributeValues バインド変数の値を指定します(省略可)

テーブル名とキーのみ必須です。以下、記述例です。

以下がテーブルです。パーティションキーがid,ソートキーがsortkey,nameという属性があります。

Lambda(Node.js)からDynamoDBのテーブルを更新する

ConditionExpressionを指定していませんが、これを指定するとアップサートができなくなります。アップデートのみになります。

上記コードをLambda関数で作成し、テストします。

結果、sampleテーブルは以下のように更新されていることがわかります。

Lambda(Node.js)からDynamoDBのテーブルを更新する

次にソートキーを「2」に変更し、データがない場合、インサートされるかを試します。

これをLambda関数で作成し、テストします。

結果、sampleテーブルは以下のように登録されていることがわかります。

Lambda(Node.js)からDynamoDBのテーブルを更新する

Map型の属性を更新する

DynamoDBの属性にはMap型と言うのがあります。DynamoDBのデータを見るとMapと表示されています。

データは、パーティションキーがリンクになっているので、その部分をクリックします。

Lambda(Node.js)からDynamoDBのテーブルを更新する

クリックすると以下のような画面が表示されます。

Lambda(Node.js)からDynamoDBのテーブルを更新する

map_dataという属性がMap型になっています。Map型の中身は以下です。

このマップを更新するには、上記コードのExpressionAttributeValuesを以下のようにオブジェクトに変えてあげれば更新することができます。ちなみにマップの一つの要素だけを更新することも可能です。

UpdateExpressionに直書きして更新したい場合、以下のように記述してみましたが、エラーになりました。

エラー:Invalid UpdateExpression: Syntax error; token: “{“, near: “= {“”

素直にバインド変数を使った方が良いと思われます。

属性名が予約語の場合、バインド変数を使う

DynamoDBには予約語が異常に多いです。

DynamoDBの予約語

属性名を予約後にしてしまった場合、UpdateExpresssionにそのまま属性名(予約語)を記述するとエラーとなります。

エラー:ValidationException: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: datetime

この為にあるのかな?と思うくらいですが、これを回避するためにExpressionAttributeNamesを使用します。

以下、変更箇所です。

これでLambdaを実行すると、予約語のdatetimeであっても更新することが確認できます。

パーティションキー、ソートキーは更新できない

RDBでは一応PKは更新可能ですが、PKは更新すべきではありません。

DynamoDBではそもそもパーティションキーとソートキーは更新することができません。

もちろん未指定に更新することもNGです。

エラーメッセージは以下のように出ます。

参考サイト

ConditionExpression

ConditionExpressionを指定すると、インサートはできなくなります。

updateの引数には以下のように指定したオブジェクトを渡します。

この時、ConditionExpressionの条件に合致しない場合、「code: ‘ConditionalCheckFailedException’」のエラーがでます。

関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
Python3.6,Djangoを勉強中です,Javaは少し飽きてしまってます–;
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくば、我に七難八苦を与えたまえ」です^^

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA