【AWS】サーバーレスオフラインでDynamoDBのデータを更新する
AWS

【AWS】サーバーレスオフラインでDynamoDBのデータを更新する

作成日:2022年01月01日
更新日:2022年01月01日

前回は、サーバーレスオフラインで DynamoDB のデータを削除しました。

aws-serverless-dynamodb-delete

【AWS】サーバーレスオフラインでDynamoDBのデータを削除する

今回は、DynamoDB のデータを更新します。

まずは、更新するためのハンドラーを作成します。

api フォルダに、update-note.js を作成します。

create-note.js からコードを流用しましょう。

js
const AWS = require("aws-sdk");
AWS.config.update({ region: "us-west-2" });
const { v4: uuidv4 } = require("uuid");
const moment = require("moment");
const dynamodb = new AWS.DynamoDB.DocumentClient();
const tableName = process.env.NOTES_TABLE;
exports.handler = async (event) => {
try {
let item = JSON.parse(event.body).Item;
item.user_id = event.headers.user_id;
item.user_name = event.headers.user_name;
item.note_id = uuidv4();
item.timestamp = moment().unix();
await dynamodb
.put({
TableName: tableName,
Item: item,
})
.promise();
return {
statudCode: 200,
headers: { "Access-Control-Allow-Origin": "*" },
body: JSON.stringify(item),
};
} catch (err) {
console.log("Error:", err);
return {
statusCode: err.statusCode ? err.statusCode : 500,
headers: { "Access-Control-Allow-Origin": "*" },
body: JSON.stringify({
error: err.name ? err.name : "Exception",
message: err.message ? err.message : "Unknown error",
}),
};
}
};

item.note_iditem.timestampの部分は、必要ないので削除します。

uuidmomentのインポートも削除しましょう。

js
const AWS = require("aws-sdk");
AWS.config.update({ region: "us-west-2" });
const dynamodb = new AWS.DynamoDB.DocumentClient();
const tableName = process.env.NOTES_TABLE;
exports.handler = async (event) => {
try {
let item = JSON.parse(event.body).Item;
item.user_id = event.headers.user_id;
item.user_name = event.headers.user_name;
await dynamodb
.put({
TableName: tableName,
Item: item,
})
.promise();
return {
statudCode: 200,
headers: { "Access-Control-Allow-Origin": "*" },
body: JSON.stringify(item),
};
} catch (err) {
console.log("Error:", err);
return {
statusCode: err.statusCode ? err.statusCode : 500,
headers: { "Access-Control-Allow-Origin": "*" },
body: JSON.stringify({
error: err.name ? err.name : "Exception",
message: err.message ? err.message : "Unknown error",
}),
};
}
};

note_idと一致するデータの内容を更新するようにします。

dynamodbputに、条件付き書き込みを追加する場合、ConditionExpressionを設定します。

ConditionExpression#note_id = :note_idを指定します。

ExpressionAttributeNames#note_idの名前をnote_idへ置換します。

ExpressionAttributeValuesで条件付き書き込みの値を定義します。

js
await dynamodb
.put({
TableName: tableName,
Item: item,
ConditionExpression: "#note_id = :note_id",
ExpressionAttributeNames: {
"#note_id": "note_id",
},
ExpressionAttributeValues: {
":note_id": item.note_id,
},
})
.promise();

ハンドラーの作成が完了したので、YAML を設定します。

serverless.yml を開きます。

functionsupdate-noteを作成します。

methodは、patchとします。

yaml
update-note:
handler: api/update-note.handler
description: PATCH /note
events:
- http:
path: note
method: patch
cors:
origin: "*"
headers: ${self:custom.allowedHeaders}

一通り完成したので、テストしてみましょう。

ターミナルでプロジェクトのディレクトリに移動し、serverless offline を実行します。

ポストマンを開いて、URL と Headers を設定します。

メソッドは、PATCH としましょう。

image2

Body に更新を指定したいデータをデータ一覧からコピーします。

image3

PATCH メソッドの Body に貼り付けます。

この時、Item も指定するようにします。

また、title を更新したい内容に書き換えましょう。

image4

『Send』ボタンをクリックすると

image5

成功したようです。

試しにデータを取得してみると、

image6

データの title が更新されていました。

© 2024あずきぱんウェブスタジオ