定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜

著者名: クローバ株式会社 (External link) 門屋 亮 (External link)

目次

はじめに

こんにちは、クローバの門屋です。
kintoneは単体でも十分便利なものですが、社内のデータと連携して使いたいというシーンはかなりあると思います。
たとえば社内システムの社員マスターや顧客マスターと連携する場合や、集計した結果のみをkintoneに保存したい場合などが考えられます。
自分で実装する場合にはREST APIを使った連携が定石ですが、APIの仕様を理解する必要があるため、敷居の高さを感じる方も多いでしょう。

ここではkintoneのコマンドラインツールのcli-kintoneを定期実行させて、2つのシステム間のデータ同期をとる方法について説明します。
今回はインポートとエクスポートどちらでも流用しやすいように、2つのkintoneのデータを同期するシナリオを考えてみましょう。

シナリオ

2つのkintoneがそれぞれ別のドメインで運用されています。
コピー元のドメインのアプリAから、コピー先のドメインのアプリBへ、前日追加されたデータと前日更新されたデータを同期します。

なにはともあれ、cli-kintoneについて

cli-kintoneは、コマンドライン上からkintoneにデータを入出力できるツールです。
Windows/Linux/Mac版が提供されています。
cli-kintoneの使い方の基本は、次のチュートリアルを参照してください。
はじめようcli-kintone

同期するアプリについて

cli-kintoneを使えば、テーブルや添付ファイルも同期可能です。
ただし、以下のフィールドの同期はできません。

  • カテゴリー
  • ステータス
  • 作業者

また、コピー元アプリとコピー先アプリにはそれぞれ以下の注意点があります。

  • コピー元アプリとコピー先アプリで同期するフィールドのフィールドコードは同じ値にします。
  • どちらのアプリにも、作成日時フィールドと更新日時フィールドを配置します。
  • 顧客コードなど、キーとなるフィールドを用意します。
    キーとなるフィールドはアプリの設定で重複を禁止してください。
  • コピー元とコピー先の両方のAPIトークンを用意し、それぞれ次の権限を付与してください。
    • コピー元のAPIトークン
      • 閲覧権限
    • コピー先のAPIトークン
      • レコード追加
      • レコード更新
      • アプリ管理権限を設定してください。

前日追加されたデータを取得する

cli-kintoneを使って前日追加されたデータのCSVファイルを取得するには、次のコマンドを実行します。

1
2
3
./cli-kintone record export --base-url $BASE_URL_A \
  --app $APP_ID_A --api-token $API_TOKEN_A \
  --condition "作成日時 >= YESTERDAY() and 作成日時 < TODAY()" > new_records.csv

それぞれの変数は次の値を示します。

変数
$BASE_URL_A コピー元アプリのkintoneのURL(例:https://sample-a.cybozu.com)
$APP_ID_A コピー元アプリのアプリID
$API_TOKEN_A コピー元アプリのAPIトークン

前日更新されたデータを取得する

同様に、前日更新されたデータのCSVファイルを取得するには、次のコマンドを実行します。

1
2
3
./cli-kintone record export --base-url $BASE_URL_A \
  --app $APP_ID_A --api-token $API_TOKEN_A \
  --condition "作成日時 < YESTERDAY() and 更新日時 >= YESTERDAY() and 更新日時 < TODAY()" > updated_records.csv

データを追加、更新する

取得したCSVファイル使って、コピー先のドメインBのアプリを更新します。コマンドは以下のようになります。

1
2
3
4
5
6
./cli-kintone record import --base-url $BASE_URL_B \
  --app $APP_ID_B --api-token $API_TOKEN_B \
  --file-path ./new_records.csv --update-key $UNIQUE_FIELD_CODE
./cli-kintone record import --base-url $BASE_URL_B \
  --app $APP_ID_B --api-token $API_TOKEN_B \
  --file-path ./updated_records.csv --update-key $UNIQUE_FIELD_CODE

それぞれの変数は次の値を示します。

変数
$BASE_URL_B コピー先アプリのkintoneのURL(例:https://sample-b.cybozu.com)
$APP_ID_B コピー先アプリのアプリID
$API_TOKEN_B コピー先アプリのAPIトークン
UNIQUE_FIELD_CODE キーとなるフィールドのフィールドコード

copy2kintone

ここまでの処理をシェルスクリプトにまとめます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
cd `dirname $0`

# コピー元アプリ
APP_ID_A=123
BASE_URL_A="https://sample-a.cybozu.com"
API_TOKEN_A="ELH834tmgivQFyk4ZYmyyVmJPZgrld9VqSnP3HtU"

# コピー先アプリ
APP_ID_B=456
BASE_URL_B="https://sample-b.cybozu.com"
API_TOKEN_B="8Nt48J7iwf2evOjxKWIMlX3FYK89hBcgnUWzAi70"
UNIQUE_FIELD_CODE="顧客コード"

rm -f new_records.csv
rm -f updated_records.csv

# コピー元アプリからデータを取得
./cli-kintone record export --base-url $BASE_URL_A \
  --app $APP_ID_A --api-token $API_TOKEN_A \
  --condition "作成日時 >= YESTERDAY() and 作成日時 < TODAY()" > new_records.csv
./cli-kintone record export --base-url $BASE_URL_A \
  --app $APP_ID_A --api-token $API_TOKEN_A \
  --condition "作成日時 < YESTERDAY() and 更新日時 >=YESTERDAY() and 更新日時 < TODAY()" > updated_records.csv

# コピー先アプリにデータを追加、更新
./cli-kintone record import --base-url $BASE_URL_B \
  --app $APP_ID_B --api-token $API_TOKEN_B \
  --file-path ./new_records.csv --update-key $UNIQUE_FIELD_CODE
./cli-kintone record import --base-url $BASE_URL_B \
  --app $APP_ID_B --api-token $API_TOKEN_B \
  --file-path ./updated_records.csv --update-key $UNIQUE_FIELD_CODE

定期実行する

作成したシェルスクリプトを定期実行するため、cronに登録します。
linuxの場合、chmod 755 copy2kintone で実行権限を先に付与する必要があります。

1
crontab -e

次のようにcrontabを編集します。

1
0 3 * * * /home/kintone/bin/copy2kintone

これで、毎日午前3時に前日分の同期処理が実行されます。

Windowsサーバーの場合はバッチファイルを作成してタスクスケジューラに登録することで同様のことが実現できます。
WindowsではShift-JISでCSVをインポート・エクスポートすることが多いため、必要に応じて文字コードの変換をしてください。
cronで動かしても実行結果が出ない場合、まず手元でシェルスクリプトを実行し動作確認をしてください。
linuxの場合、cronのログを/var/log/syslogで追うことができます。実行結果が出ない場合、ログを確認しましょう。

おわりに

いかがだったでしょうか。
cronとcli-kintoneとを組み合わせることで、最小限の手間でデータ同期を実現できることがおわかりいただけたかと思います。
これでこれまで埋もれていた社内のデータも有効活用できますね!

え、深夜に動かすサーバーがない?そんなときはAWSのlambda上でcli-kintoneを動かして定期実行させることもできます。こちらについてもまた機会があれば書いてみたいと思います。

更新履歴

  • 2024年6月6日
    • cli-kintone v1以上に対応しました。
information

このTipsは、2024年5月版kintoneとcli-kintone v1.10.13で動作を確認しています。