kintoneプラグインのライセンスを管理してプラグインの利用ドメインを制限する

目次

はじめに

kintoneにはプラグインを販売するサイボウズ公式のプラットフォームはありません。
そのため、kintoneプラグインを販売したり、プラグインを利用できるドメインや期間を制限したりするしくみは、各社独自で構築する必要があります。
ここではkintoneプラグインの利用を制限する方法(以下、ライセンス管理)の例を紹介します。

前提

  • ドメイン単位でライセンスを管理します。
  • プラグインを利用できる有効期限を設けて、期限を過ぎると利用不可と判定します。
  • AWS (External link) を利用します。
  • AWSの各サービスはAWS CloudFormationを利用して構築します。

全体構成

構成図

リクエストの流れ

  1. 利用者がkintoneの画面(たとえばレコード一覧画面)を開いた際に、kintone JavaScript APIで Amazon API Gateway (External link) のAPIにリクエストする。
  2. AWS Lambda (External link) の関数が実行され、 Amazon DynamoDB (External link) のテーブルの内容を確認し、プラグインの利用可否を応答する。
  3. kintone JavaScript APIが応答を受け取り、プラグインの利用を制御する。

ポイント

Amazon API Gatewayへのリクエストには、リクエスト元のAPIを固定するため kintone.proxy() を利用します。
参考: cybozu.comが使用するドメインとIPアドレス (External link)
Amazon API GatewayをリクエストできるIPアドレスを制限することで、セキュリティを高めます。

information

Amazon API GatewayのAPIへのリクエスト方法がわかれば、ライセンスを発行していないドメインからもリクエストされる可能性があります。

AWS LambdaにAmazon DynamoDBの参照権限のみを付与することで、有効期間の更新やデータの追加を防ぎます。

手順

下準備

AWSのアカウントを用意します。
本作業ではAmazon DynamoDB、AWS Lambda、Amazon API Gatewayだけでなく、AWS Lambda実行用のロール(kintonePluginLicenseRole)を作成します。
そのため、適切な権限を付与してください。

AWS コマンドラインインターフェイス (External link) をインストールします。

次のリポジトリをcloneしてください。
https://github.com/kintone-samples/kintone-plugin-license (External link)

Amazon DynamoDBの構築

次のコマンドを実行します。

1
aws cloudformation deploy --stack-name create-kintone-plugin-license-table --template-file ./CloudFormation/dynamodb.yaml

Amazon DynamoDBにテーブルが構築されていることを確認します。

AWS Lambdaの構築

次のコマンドを実行します。

1
aws cloudformation deploy --stack-name create-kintone-plugin-license-lambda --template-file ./CloudFormation/lambda.yaml --capabilities CAPABILITY_NAMED_IAM

AWS Lambdaに関数が構築されていることを確認します。

Amazon API Gatewayの構築

次のコマンドを実行します。

1
aws cloudformation deploy --stack-name create-kintone-plugin-license-api --template-file ./CloudFormation/api-gateway.yaml

Amazon API GatewayにAPIが構築されていることを確認します。
エンドポイントは後の作業で利用するのでメモします。

AWS Lambdaのコード設定

Node.js (External link) をインストールします。
次のコマンドを実行します。

1
2
3
cd LambdaFunction
npm install
npm run build

distディレクトリ配下にlambda-function.zipが作成されます。
先ほど構築したAWS Lambdaの関数に、lambda-function.zipをアップロードします。

動作確認

Amazon DynamoDBで「kintonePluginLicenseTable」テーブルを開き、データを登録します。
domainには動作確認で利用するkintoneのドメイン名を入力します。
pluginIdには動作確認で利用するプラグインのIDを入力します。プラグインIDはプラグイン設定画面のURLから確認できます。
URLが次の場合はPLUGIN_IDがプラグインIDです。

https://sample.cybozu.com/k/admin/app/ooo/plugin/config?pluginId=PLUGIN_ID

expirationDateは[新しい属性の追加]でタイプが「文字列」の属性を追加してください。
値には本日の日付を入力します。入力形式は入力例を参考にしてください。

項目名 入力内容 入力例
domain ドメイン名 sample.cybozu.com
pluginId プラグインID cbjamdbgngjoiaoaghfbenkkkaefcefj
expirationDate プラグインの有効期限 2024/05/05

カスタマイズファイルに「kintonePlugin/index.js」の内容を設定した、kintoneプラグインを作成します。
コード内のAmazon API Gatewayのエンドポイントは、構築したAPI GatewayのAPIのエンドポイントに置き換えてください。
kintoneプラグイン開発手順

kintoneプラグインをインストールし、該当画面を開くと開発者コンソールに次のメッセージが表示されます。

1
プラグインのライセンスは有効です。

Amazon DynamoDBを開き、expirationDateを昨日の日付に変更します。
該当画面を開くと開発者コンソールに次のメッセージが表示されます。

1
プラグインのライセンスは無効です。

検討事項

ライセンスチェックを実行する画面

レコード一覧画面などの利用者の画面の場合はAWSへのリクエスト数が増えます。
そのため、リクエスト結果をキャッシュするなどの対応が必要になります。

管理者画面(プラグイン設定画面)の場合はリクエスト結果の有効期限をプラグイン設定に保存します。
利用者画面ではプラグイン設定の有効期限を元にプラグインの利用可否を判断することで、AWSへのリクエスト数を減らせます。
ただし、有効期限を更新するたびに、プラグイン設定の再保存やアプリの更新が必要になります。

リクエストに失敗した場合の対応

ネットワークやAWSなどで障害が発生すると、ライセンスチェックのリクエストがエラーになります。
リクエストエラーが発生した場合にプラグインの利用を許可するかどうかは、検討すべき事項です。
特に利用者画面でライセンスをチェックする場合はプラグインの利用を許可することを検討してください。
ライセンス管理のしくみで障害が発生し、プラグインおよびkintoneを利用できなくなるケースが過去に発生しています。

事前作業なしでお試し

紹介した内容ではDynamoDBにドメイン名やプラグインID、有効期限を事前に登録する必要があります。
この事前作業を省くには、AWS LambdaにAmazon DynamoDBの追加権限を付与します。
Amazon DynamoDBにデータが存在しない場合はデータを追加し、有効期限をn日後に設定するようAWS Lambdaのコードを変更します。
これにより、スムーズなお試しが可能になります。

information

不要なデータを追加される可能性が生まれます。メリットとデメリットをよく比較検討して採用してください。

おわりに

kintoneプラグインのライセンス管理方法の例を紹介しました。
実際に運用する場合には次のような内容も検討する必要があります。

  • テスト環境の構築
  • Amazon DynamoDBのバックアップ
  • Amazon API GatewayのAPIへのカスタムドメイン名の設定
    APIを誤って削除して再作成した場合、APIのURLが変わってしまい、ライセンスチェックでエラーが発生します。
    解決するには全顧客にプラグインを差し替えてもらう必要があります。
    これを防ぐため、Amazon API GatewayのAPIにカスタムドメインを設定すると安全です。

本記事の内容はkintoneプラグインライセンス管理方法の一例です。
自社にとって適切なライセンス管理のしくみを構築するヒントになればうれしいです。

information

このTipsは、2024年4月版kintoneで動作を確認しています。