カテゴリー内の他の記事

Lambdaの定期実行とNode.js SDKを使って別ドメインのアプリとデータを同期する

フォローする

(著者:サイボウズ 中里 直人)

Index

はじめに

kintoneでは別ドメインのアプリのレコードと同期したい際、定期実行ができなかったり別ドメインに対してkintone APIを実行するのが複雑で少し難しいです。
過去にはcli-kintoneを使った同期方法が紹介されています。
今回は、AWS Lambdaの定期実行とNode.js SDK(kintone API SDK(β) for Node.js)を用いて、2つのドメイン間でデータを同期する方法をご紹介します。

概要

____.jpg

ドメインAの「作成日時が今日のレコード」をドメインBに追加、また「更新日時が今日のレコード」をドメインBに更新する処理を、定期実行で1日1回実行します。

事前準備

kintone

ドメインAとドメインBに同じ設定のアプリを作成する必要があります。

アプリテンプレートを利用すると簡単に設定できます。
下記のヘルプを確認しながら作成してください。

https://jp.cybozu.help/k/ja/admin/app_admin/template.html

また、更新処理を実行するために、キーとする重複禁止のフィールドを1つ設定してください。
今回の記事では、数値フィールドを使用しています。フィールドコードは「数値」です。

Lambda

AWSのアカウントが必要です。下記のAWS公式ドキュメントからアカウントを作成してください。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/setup.html

Node.js

Node.jsが実行できる環境を準備してください。
バージョンは8.0.0以上をインストールしてください。

https://nodejs.org/ja/

コマンドラインツール

Windowsの方はZIPコマンドが実行できるコマンドラインツールをご用意ください。
macOSの方はTerminalをご使用ください。

設定手順

1.Lambdaにアップロードするファイルの準備

サンプルコード

以下のサンプルコードをファイル名「index.js」で保存してください。

サンプルコードの10~24行目はご自身の環境に合わせての環境に合わせて設定してください。
今回のシナリオではドメインAを同期元、ドメインBを同期先としています。

以下のコマンドを先ほど作成したファイルと同じ階層で実行し、「package.json」を生成します。

上記のコマンド実行後にpackage.jsonの設定をしますが、"name"と"description"のみ任意に設定していただき、他はEnterで進んで問題ありません。

次に以下のコマンドでkintone SDK for Node.js(β)をインストールします。

ここまで完了したら、フォルダ構成が下図の通りになっているか確認してください。

structure.png

確認後、以下のコマンドを実行してZipファイルを作成します。実行失敗した場合は、再度構成を確認してください。

2.Lambda関数の作成

次にLambda関数を設定しましょう。
下図のように、「一から作成」、ランタイムは「Node.js 8.10」、ロールは「既存のロールを選択」、既存のロールは「AWSLambdaExecute」を選択してください。
名前は任意に設定しましょう。

Image_7.png

作成すると設定画面に進むので、「ZIP ファイルをアップロード」から先ほど作成したzipファイルをアップロードしてください。

lambda2.png

次に、Lambdaのトリガーを選択します。
左側のトリガー一覧から、「CloudWatch Events」を選択してください。

Lambda3.png

「トリガー」の設定を下図のように、「新規ルールの作成」を選択し、ルールタイプは「スケジュール式」、
スケジュール式は「cron(59 14 * * ? *)」に設定し、「トリガーの有効化」にチェックを入れ追加してください。

lambda4.png

設定が完了したら、保存をしてください。

lambda5.png

以上で設定は完了です。

解説

サンプルコード「index.js」について説明していきます。

今回のコードでは、kintone API SDK(β) for Node.jsを使用して、kintone REST APIを実行しています。
詳細については下記のGitHubとドキュメントをご覧ください。

GitHub

https://github.com/kintone/kintone-nodejs-sdk/

ドキュメント

https://kintone.github.io/kintone-nodejs-sdk/

サンプルコードについて

10~24行目

kintone Node.js SDKを使ってそれぞれのドメインへの認証を行っています。
6行目で、ドメイン名と認証方法をkintoneConnection_Aに保存しています。
7行目では保存した情報を使ってレコード操作に関するクラスを呼び出しています。

fetchRecordsCreatedAtToday

ドメインAの 作成日が今日 のレコードをすべて取得する関数です。
レコード一括取得のAPIはNode.js SDKのRecordクラスのgetRecords関数を使用しています。

fetchRecordsUpdatedAtToday

ドメインAの 更新日が今日 かつ 作成日が今日でない レコードをすべて取得する関数です。

convertArray

kintone REST APIの登録と更新は、100件ずつしかできないため、取得したレコードを再整形する必要があります。
この関数では再整形しやすくするため、取得したレコードを100件ずつに分割する処理をしています。

convert.png

addRcords

引数に作成日が今日のレコードを設定し、そのレコードをドメインBのアプリに追加する関数です。
レコードを追加する際は、レコード番号、作成者、更新者、作成日時、更新日時などのメタ情報を削除する必要があるので、そのプロパティを削除してから追加しています。
※作成者、更新者、作成日時、更新日時は発行するAPIトークンに「アプリの管理権限」を付与することで指定が可能です。
レコード一括登録のAPIはNode.js SDKのRecordクラスのaddRecords関数を使用しています。

updateRecords

引数に更新日が今日 かつ 作成日が今日でない レコードを設定し、
そのレコードを元にドメインBのアプリのレコードを更新する関数です。

更新する際はレコード番号、作成者、更新者、作成日時、更新日時などのメタ情報に加え、アップデートキーも外だしする必要があるため、削除します。
レコード一括更新のAPIはNode.js SDKのRecordクラスのupdateRecords関数を使用しています。

exports.handler以下

先ほど設定した関数を以下のように並列で実行しています。

  • fetchRecordsCreatedAtToday => addRcords
  • fetchRecordsUpdatedAtToday => updateRecords

追加対象のレコードと更新対象のレコードは一致することはないため、
1日1回の実行で、ドメインAとドメインBのアプリを同期することが可能になります。

Lambdaのイベントスケジュール式について

CloudWatch Eventsのスケジュール式に上記のスケジュール式を設定していますが、
これは毎日UTC時間の14時59分に実行されるように設定しています。
UTC時間の14時59分は日本時間だと23時59分なので、日付が変わる直前にindex.jsの中身が実行されるようになっています。

おわりに

いかがでしょうか。別ドメインとの定期的な同期が実現できたかと思います。
Lambda × kintoneをkintone Node.js SDKを使って簡単に実装することができました。

Lambdaは定期実行ができるので、kintoneでこれまでできなかったバッチ処理が可能です。

LambdaからS3にファイルをアップロードしたりできるので、AWS上に定期的にバックアップを作成することもできそうですね。

このTipsは、2018年9月版 kintoneで確認したものになります。

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

ログインしてコメントを残してください。