はじめに
以前書いた記事「DynamoDB StreamをトリガーにLambdaを実行する処理をCDKで書いてみた」の、Lambdaの処理でkintone-rest-api-clientを利用しています。
kintone-rest-api-clientとは
kintone-rest-api-clientは、KintoneプラットフォームのためのREST APIクライアントライブラリです。このライブラリは、Pythonで書かれており、Kintone REST APIを呼び出すための簡単な方法を提供します。
kintone-rest-api-clientを使用すると、Kintoneアプリケーションを操作するPythonスクリプトを簡単に作成することができます。たとえば、kintone-rest-api-clientを使用して、データレコードの作成、更新、削除、検索などを行うことができます。また、kintone-rest-api-clientは、Kintoneの認証情報を簡単に設定できるため、安全なアプリケーションの開発が可能です。
やりたいこと(イメージ図)
DynamoDBのデータに変更があった場合(追加、編集、削除)に、その変更内容をLambdaで受け取り、kintone-rest-api-clientを利用してkintoneアプリに自動で反映する処理を実装しました。
データの関連付け
DynamoDBのレコードの項目「name」とkintoneのフィールドコード「name」でデータを関連付けしています。
kintone REST API Clientを使うための準備
下記のコマンドラインを入力して実行します。
npm install @kintone/rest-api-client
これでインストールがはじまり、kintone REST API Clientが利用できるようになります。
Lambdaの処理
配列として受け取ったイベントをforで一つ一つ処理をしています。
変更の種類に応じて、kintoneアプリのレコードを操作をしています。
import { KintoneRestAPIClient } from "@kintone/rest-api-client";
export const handler = async (event) => {
const client = new KintoneRestAPIClient({
baseUrl: baseUrl,
// パスワード認証
auth: { username: username, password: password },
});
for (const record of event.Records) {
if (record.eventName === "INSERT" || record.eventName === "MODIFY") {
//レコードがアップサートされた時の処理
const newItem = record.NewImage;
await client.record
.upsertRecord({
app: 1,
updateKey: {
field: "name",
value: newItem.name,
},
record: {
Key: {
value: newItem.test_key,
},
},
})
.then((resp) => {
console.log(resp);
})
.catch((err) => {
console.log(err);
});
} else if (record.eventName === "REMOVE") {
//レコードが削除された時の処理
const deletedItem = record.OldImage;
//kintoneアプリに登録されている全レコードを取得
const kintoneAllRecords = await client.record.getAllRecords({
app: 1,
});
const kintoneIds = [];
kintoneAllRecords.forEach((r) => {
//削除されたレコードのnameがkintoneアプリのnameと一致する場合
if (deletedItem.name === r.name.value) {
kintoneIds.push(r.$id.value);
}
});
//対象のレコードを削除
await client.record.deleteRecords({
app: 1,
ids: kintoneIds,
});
} else {
}
}
};
kintone-rest-api-clientを利用したレコードのアップサート
await client.record
.upsertRecord({
app: 1,
updateKey: {
field: "name",
value: newItem.name,
},
record: {
Key: {
value: newItem.test_key,
},
},
})
kintoneの「アプリID」が1、更新のキーに利用するフィールドコード「name」の値が「newItem.name」と一致する場合、フィールドコード「Key」の値が「newItem.test_key」にアップデートされます。
該当するレコードがなければインサートされます。
kintoneのフィールドコードを指定しています。
kintone-rest-api-clientを利用したレコードの削除
//レコードが削除された時の処理
const deletedItem = record.OldImage;
//kintoneアプリに登録されている全レコードを取得
const kintoneAllRecords = await client.record.getAllRecords({
app: 1,
});
const kintoneIds = [];
kintoneAllRecords.forEach((r) => {
//削除されたレコードのnameがkintoneアプリのnameと一致する場合
if (deletedItem.name === r.name.value) {
kintoneIds.push(r.$id.value);
}
});
//対象のレコードを削除
await client.record.deleteRecords({
app: 1,
ids: kintoneIds,
});
1.kintoneアプリに登録されている全レコードを取得します。
- 削除されたレコードの「name」がkintoneのフィールドコード「name」と一致するレコードの「id」を「kintoneIds」に格納します。
- kintoneの「アプリID」が1、フィールドコード「ids」の値が「kintoneIds」と一致するレコードを削除しています。