🍉

kintone-rest-api-client を使ってkintoneアプリを自動更新する

2023/05/31に公開

はじめに

以前書いた記事「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アプリのレコードを操作をしています。

index.mts
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のフィールドコードを指定しています。

image.png

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アプリに登録されている全レコードを取得します。
2. 削除されたレコードの「name」がkintoneのフィールドコード「name」と一致するレコードの「id」を「kintoneIds」に格納します。
3. kintoneの「アプリID」が1、フィールドコード「ids」の値が「kintoneIds」と一致するレコードを削除しています。

参考:@kintone/rest-api-client

コラボスタイル Developers

Discussion