公開日:2020-10-20
「自分のアイデアをカタチにして人に見せたい時、動くものをカンタンに作れたら」という話をよく聞きます。
私に言わせれば「それ、kintone で作っちゃえばいいのに」ということが非常に多いです。
例えば以下のようなプルダウンを連動させる UI が必要となった場合に、実際には Web で実装する場合でも、我々は kintone でパパっと実際に動くものを作って確認してもらいます。
kintone なら、こんなの作るの一瞬ですからね。
kintone の標準機能だけで作れるなら標準機能で、カスタマイズが必要なら gusuku Customine を使って、時には カレンダーPlus のような特定の機能に特化したプラグインを入れたり、自分で Javascript を書いて実装することもありますが、とにかく価値を素早く提供することを心がけています。
世の中が ノーコード や ローコード などと言い出す ずっと前から「kintone を使って、とにかく早く価値を提供すること」これがアールスリーにとっては当たり前でした。
そうこうしていると、いわゆるバックエンド(管理系)のシステムはもちろん、一般利用者に使用させるフロントエンドの Web も kintone でええやん。利用者分の kintoneアカウントのライセンス費が必要になるけど、それを考慮に入れても kintone で作る方が(総合的に)安いよね と判断されるお客様が増えてきました。
そこで問題になるのが kintoneアカウントの作成・払い出し(発行)です。
kintoneアカウントを追加するには ライセンスを購入(発注)する必要がありますし、kintone を使い込んでいれば、作成したユーザーを特定の組織やグループのメンバーに入れることでアクセス制御することが多いです。
今回、申請をもとに kintoneアカウントを設定し 払い出す仕組みを作ったので、ポイントを紹介したいと思います。
1. アカウントを作成・設定する API が提供されている
kintoneアカウント、というか cybozu.com のユーザーを作成する API が提供されています。 遠慮なく はっきり言いますけど、まあ、めちゃくちゃ使いにくいんですけどね・・
APIを使って以下の機能は概ね 1時間程度で実装することが出来ました。
・cybozu.com のユーザーを作成する
・そのユーザー用の組織を新たに作成し、メンバーに追加する
・ある kintoneアプリのレコードを読み出し、そのレコードに記録されている kintoneアカウント(複数)を前述の組織のメンバーに追加する(このドメインでは 「組織間のアクセスを制限」 しているため、この実装が必要でした)
・あるグループ(ロール)のメンバーに追加する
・ユーザーの利用サービス設定(kintoneライセンスを割り当て)
「メンバーに追加する」とさらりと書きましたが、これ、API に JSON投げる という要領では出来ないんですよね・・
const req = async (method, data, api) => {
const apiName = api.endsWith(‘.csv’) ? api : `${api}.json`;
let contentType = ‘application/json; charset=UTF-8’;
if (api === ‘file’) {
const headers = data.getHeaders();
contentType = headers[‘content-type’];
}
return await axios({
method,
headers: {
‘X-Requested-With’: ‘XMLHttpRequest’,
‘X-Cybozu-Authorization’: Buffer.from(`${KINTONE_USERNAME}:${KINTONE_PASSWORD}`).toString(‘base64’),
‘Content-Type’: contentType
},
data,
url: `https://${KINTONE_HOSTNAME}/v1/${apiName}`
});
};
みたいな関数を用意しておいて
// ユーザーの所属組織インポート用 CSVアップロード
const fd = new FormData();
fd.append(‘file’, txt, ‘userOrg.csv’); // txt には ユーザーの所属組織インポート用 CSV のレイアウトに合わせた文字列をセットしておく
const res = await req(‘POST’, fd, ‘file’);
// ユーザーの所属組織インポート
const resImp = await req(‘POST’, { ‘fileKey’: res.data.fileKey }, ‘csv/userOrganizations’);
// 他のことを色々やってから・・
// ユーザーの所属組織インポート 処理結果確認
const resProc = await req(‘GET’, { ‘id’: resImp.data.id }, ‘csv/result’);
あらかじめCSVを作り、ファイルアップロードAPI(しかもこれは kintone用のものとは別の User API用のなので @kintone/rest-api-client なんて洒落たものは使えません)でアップロードしてから インポートAPI を叩くという面倒くさいことをしています。
でもまあ、正直ここまでは良かったんですよ、ここまでは・・
2. kintoneライセンスの残数(契約数(上限)- 利用中)を取得する API が提供されていない
kintoneライセンスを購入(発注)を自動化するのはリスキーだし問題だよね ということで、少し多めにライセンスを購入しておいて(予備)、その中から適宜自動で払い出し、予備ライセンス数があらかじめ決めておいた数(発注点)を下回ったら 管理者に通知して購入(発注)手続きを行っていただく という形で合意しました。
でも 残数(契約数(上限)- 利用中)を取得する方法がない んですよ! なんてことだ・・(まあ、やる前から知ってはいたのですがww)
仕方がないので、あらかじめ cybozu.comユーザーを作成し kintoneライセンスを割り当てておき、ユーザー作成(払い出し)の申請が来たら ログイン名, パスワード, 表示名, Emailアドレス, 表示優先度 を変更して払い出すように実装を変更しました。
このプログラムで払い出す以外の用途でも kintoneユーザーを作成する依頼が度々来るので、手動で kintoneライセンスを付け外ししても問題ないように実装して動作確認するのに苦労しました。(何せ kintoneライセンスを余らせている開発環境なんてないものですし、、)
「表示優先度」(sortOrder)は 従来は設定していなかったのですが、これはぜひ活用すると良いですね。
「組織とユーザーの設定」画面での並び順をアカウントの役割別にまとめることが出来るので便利です。
(しっかし、そろそろ本気で <cybozu.com共通管理(ユーザ管理やセキュリティ設定の機能)> の UI改善を実現してくれないと・・ 今年の Cybozu Days には期待して良いんだよね? > サイボウズさん)
3. 残数が発注点を下回ったら購入(発注)手続きする人に通知する
上記により(実質的に使える)ライセンス数が発注点を下回ったら管理者に通知して購入(発注)手続きを行っていただけるようになりました。
通知方法は面倒くさかったので AWS に SNS Topic を一つ追加して、この Topic を Slack で subscribe してもらうようにしました。
ライセンス数が発注点を下回っている間にも続々と払い出し申請が来る可能性があるので、その間は煩わしいですが 都度 スコココッ(通知)を送るようにしています。
そして、もし払い出せるライセンスが一つもなくなってしまった場合には 断末魔の叫びを関係者に一斉送信するようにしています。
購入手続きが完了して契約数(上限)が増えたら、ある kintoneアプリ上のボタンを押してもらうことにしました。
これによりライセンスを払い出せずに止まってしまっていた申請があれば順次処理しますし、ダミーユーザーを作成して今後の払い出し申請に備えるようにしています。(このテストも面倒くさかった・・)
4. kintoneアカウントを払い出したら申請者に通知する
ここは以前より申請用の kintoneアプリがあったので、そのアプリのプロセス管理ステータスをプログラムで更新するようにしました。
これまで申請いただいてから数日程度お待たせして 中の人がアカウントを作成・設定していたのですが、この仕組みを導入後は 申請した直後に kintoneの通知メールが来て、レコードを開くと仮パスワード等の 必要な情報が全て書かれているし、詳細画面でボタンを押すとメールワイズで実際に使用される方へメールを送れるし、アプリ等の設定も完了しているのでビックリされています。
今まで数日待たされていたのは何だったのか・・との感想に対して「中の人が小人さんになったので仕事が早くなりました」とお答えしています。(もちろん冗談です)
5. kintoneアプリから払い出し処理を呼び出すようにする(もちろん gusuku Customine を使って!)
さすがに払い出し処理の実装はノーコードというわけにはいかなかったのですが、AWS Lambdaで実装したので gusuku Customine を使って呼び出すように設定するだけです。申請用アプリでアクションを実行したタイミングと 購入(発注)管理者用のアプリでボタンを押したタイミングで「AWS Lambda ファンクションを実行する」ようにしました。
以上が kintoneアカウントを自動作成・払い出しするために私が実装した内容の全てです。
大した内容ではありませんが、同じ悩みを抱えておられる、どこかのどなたかの参考になれば幸いです。
そして、そろそろ本気で サイボウズさんが <cybozu.com共通管理(ユーザ管理やセキュリティ設定の機能)> をリニューアルしてくれることを心の底から願っています。
Cybozu Days に期待しましょう!