定期実行でデータの同期を実現するスマートな方法 その2〜AWS Lambda編〜

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

目次

はじめに

こんにちは、クローバの門屋です。
以前、次の記事で異なるドメイン間のkintoneデータを同期する方法について書かせていただきました。
定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜

今回は、AWS Lambdaを使ってサーバーレスでkintoneの同期を実現する方法を紹介してみたいと思います。

なにがうれしいか

定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜 では、常時稼働するサーバーでcronなどのスケジューリングサービスを使用して定期実行する前提でした。
しかしわざわざそのために常時稼働のサーバーを用意するのが難しい場合もあると思います。
AWS Lambdaを使えば、サーバーを用意しなくても定期実行ができます。

アプリの準備

同期するアプリは 定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜 を参考に準備してください。

copy2kintone

スクリプトは前回の記事で紹介したcopy2kintoneを、Lambdaで動かすために少し修正します。
レコードのコピーと更新の処理を行うシェルスクリプトです。 ファイル名はcopy2kintoneとし、メソッド名はcopyとします。

 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
33
34
35
36
37
38
function copy () {
  # コピー元アプリ
  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="顧客コード"

  # /tmpディレクトリに移動
  cd /tmp

  # 必要なファイルをコピーし、権限を設定
  cp /var/task/cli-kintone /tmp/cli-kintone
  chmod 755 /tmp/cli-kintone

  # コピー元アプリからデータを取得
  ./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

  # 終了メッセージ
  echo "Process complete!"
}

ファイルをzipにまとめる

プログラムをLambda上で動かすには、必要なファイルをzipにまとめる必要があります。
以下にその手順を説明します。

Linux版cli-kintoneをダウンロードする

AWS LambdaはLinuxで動作しますので、 Github (External link) から最新のcli-kintone(linux-x64.zip)をダウンロードして解凍します。

bootstrapファイルをダウンロードする

AWS Lambdaでシェルスクリプトを実行するためのbootstrapファイルを準備します。
以下のリンクをクリックしてbootstrapファイルをダウンロードしてください。
Windowsの場合は、以下のリンクを右クリックして「名前をつけて保存」を選択し、拡張子をつけずに「bootstrap」というファイル名で保存してください。
ダウンロード先

bootstrapファイルを自作したり上記のbootstrapファイルを編集をしたりする場合、bootstrapファイルにはchmod +xを実行して実行権限を付与する必要があります。
Windowsの場合は、Linux環境を用意して実行権限を付与してください。

ファイルをすべて同じフォルダーにコピーする

ファイル名 説明
cli-kintone kintoneコマンドラインツール
bootstrap AWS Lambdaでシェルスクリプトを実行するためのファイル
copy2kintone 全体の処理を行うシェルスクリプト

zipで圧縮する

ここで注意しないといけないのは、フォルダーを圧縮するのではなくファイル単位で圧縮しないといけないということです。
MacやLinux、Windowsのcygwin環境などでは以下のコマンドで圧縮できます。
Windowsのエクスプローラーの場合は、フォルダーではなくファイルを個別に複数選択して、右クリックで圧縮するとよいようです。

1
zip -r kintone-lambda.zip cli-kintone bootstrap copy2kintone

Lambda関数を作成する

  1. AWSマネジメントコンソールからLambda関数を作成します。

  2. 次の図のように、関数名を「cron_clikintone」とし、ランタイムを「Amazon Linux 2023」に設定します。

  3. アップロード元をクリックして、「.zipファイル」を選択します。

  4. 作成した「kintone-lambda.zip」をアップロードします。

  5. そのまま画面内のランタイム設定の編集ボタンをクリックします。

  6. ハンドラーを「copy2kintone.copy」のように、ファイル名.メソッド名とします。

  7. 設定タブから一般設定を選択します。

  8. メモリを「256MB」、タイムアウトを「30秒」に設定します。

テスト

テストタブを選択し、「テスト」ボタンをクリックします。

実行が正常終了すると、「実行中の関数:成功」と表示されます。

自動実行の設定

「設定」タブから「トリガー」を選択し、「トリガーを追加」をクリックします。

次の図や表のように設定します。

設定 説明
イベントソース EventBridge(CloudWatch Events)
ルール 新規ルールを作成
ルール名 ルールごとに一意の名前をつけます
ルールタイプ スケジュール式
スケジュール式 cron(0 17 * * ? *)

これで、毎日午前2時(日本時間)に、同期処理が実行されるようになります。

Schedule expressionの記述方法についてはAWS Lambdaデベロッパーガイド「 rateまたはcronを使用する式をスケジュールする (External link) 」を参考にしてください。

おわりに

いかがだったでしょうか。
ちょっと複雑だったかもしれませんが、サーバーを自前で用意しなくて済むのは大きな利点ではないでしょうか。
また、S3など他のAWSサービスと組み合わせることで、たとえばS3にデータがアップロードされたタイミングでそのデータを同期するといったようなことも可能です。
Lambdaを使うとOSなどの管理も不要なため、アプリケーションの運用だけに集中できます。
cli-kintoneと組み合わせることでコードの記述も最小限に抑えられますので、ぜひうまく活用してみてください。

information

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