どーも、たつみんです。
以前、稟議・ワークフローツールのkickflowをご紹介した時、Oktaアカウント発行までをOkta Workflowsで実行する処理について触れました。
今回、どのような処理を実装したかを記事にします。
今回実現したいこと
情報システム部門がアカウント発行を行う場面を想定し、以下のシナリオをOkta Workflowsで実現したいと思います。
- 稟議・ワークフローツールで承認完了になった入社申請に対して処理を行う
- 承認完了から入社日まで期間が空く場合を考慮し、Oktaアカウントの発行作業は入社日の7日前に実施する
- Oktaアカウント(メールアドレス)のアカウント部分はfirstname.lastname形式とする
- Oktaアカウントの初期パスワードはランダムな8桁の英数字を指定する
- 処理結果として発行したアカウント情報を通知用Slackチャンネルに通知する
- Oktaアカウントの重複チェックとして、Slack(解除済みユーザー含む)に確認を行う
- 重複時は通知用Slackチャンネルにアラートを出し、手動対応とする(今回、自動化しない)
Okta Workflowsの設定
概要
今回は以下の1つのテーブルと3つのOkta Workflowsによって実現します。
- データ蓄積用テーブル
- kickflowからデータを受け取りテーブルに格納するフロー
- 毎日決まった時刻に起動し、テーブル内を検索するメインフロー
- 検索結果があった場合にOktaアカウント作成を実行するヘルパーフロー
テーブル作成
稟議・ワークフローツールのデータをテーブルに格納します。Okta Workflowsではテーブル機能もあるため一時的にデータを蓄積することができます。
今回はOktaのアカウント作成に必要なデータやアカウント作成後にOkta IDを格納するためにkickflow-Joinという名前でテーブルを作成し、下図のようなカラムを作成しておきました。
kickflowからデータを受け取りテーブルに格納するフロー
全体図は下図のとおりとなります。
- API Endpointをトリガーとして指定します。生成されたInvoke URLとClient TokenをkickflowのWebhook設定に登録します。これによりkickflowで発生したイベントをこのフローで受け取ることができます。
- Get Multiple関数を利用し、受信したbodyから必要なデータを取得します。ここでは実際にWebhookからどのようなデータが送信されるかを確認しながら指定するとよいでしょう。
今回の場合は、eventType
や申請フォームを識別するためのdata.ticket.workflow.code
の他に、申請フォームで入力された値はdata.ticket.inputs
以下に配列として格納されていることがわかりました。配列を指定し、valueを取り出す処理としています。 - Continue if関数を利用し、
eventType
がticket_completedである場合のみ続行します。 - 同様に
data.ticket.workflow.code
が入社申請をあらわすコードを指定します。 - Compose関数を利用し、Firstnameが入力されている
data.ticket.inputs.5.value
とLastnameが入力されているdata.ticket.inputs.4.value
とドメイン部分も付加しOktaアカウント(メールアドレス)の候補を作成します。 - To Lower Case関数を利用し、作成した文字列を全て小文字に変換します。
- Create Row関数を利用し、テーブル「kickflow-Join」を選択後に各カラムに2.と6.で取得した値を当てはめていきます。
このOkta Workflowsが動作することでテーブル「kickflow-Join」には以下のようにデータが格納されます。
毎日決まった時刻に起動し、テーブル内を検索するメインフロー
こちらも全体図は以下のとおりとなります。
- Scheduled Flowにて毎日朝6時に起動するトリガーを設定します。
- Now関数で実行時の日時(UTC)を取得します。
- Add関数を利用し、7日後の日時を取得します。
- Date to Text関数にて7日後の日時(UTC)をタイムゾーンをJSTに変換し、同時にフォーマットをYYYY-MM-DD形式とします。
- Serch Rows関数にてテーブル「kickflow-Join」のJoin dateの値が4.で変換した7日後の日時(JST)と一致する行を取得します。この時取得した行は複数件あることを考慮しOptionsでAll matching rowsを選択します。
- Length関数にて取得した行の長さを調べます。
- If/Else関数を利用し、条件設定にlengthが0以上とし、Saveをします。Save後に下図のようにTrueの処理とFalseの処理を記述します。
下図の上部がの8.がTrueの処理、下部の9.10.がFalseの処理となります。 - Trueの場合は5.で取得した行について1行ずつアカウント発行の処理を行います。
Reduce関数を使いHelper Flow(別のOkta Workflows)を呼び出します。この時に呼び出すOkta Workflowsに渡したい値についてmemoとして定義しておきます。 - Falseの場合は7日後の入社対応がないため、Compose関数でメッセージを作成します
- Slackアプリ連携のSend message to Channelを利用し、作成したメッセージを指定したチャンネルに送信します。
検索結果があった場合にOktaアカウント作成を実行するヘルパーフロー
こちらも全体図は以下のとおりとなります。
- 他のWorkflowsから呼び出されるためのHelper Flowをトリガーとして選択します。呼び出し元で渡された値を受け取れるようにInput to this Flowで定義しておきます。
- Continue if関数を利用し、テーブル「kickflow-Join」のOkta IDが空の場合のみ処理を続行します。
- Slack Adminアプリ連携のSearch Userでテーブル「kickflow-Join」のUser name(メールアドレス候補)をキーに検索を実行します。この時、解除済みユーザーも含めて検索が行われます。一致した場合はSlackユーザーのIDを取得します。
- If/Elseを利用し、3.のSlackユーザーのIDがEmptyであることを条件に設定します。この後、Trueの場合とFalseの場合でそれぞれ処理を行いSlack通知のためのメッセージを作成します。作成したメッセージを受け取れるようにCreate OutputsでSlack messageという名前の変数を作っておきます。
下図の上部5.6.7.8.がTrueの処理、下部の9.がFalseの処理となります。 - Trueの場合、Random関数を利用し、8桁のランダムな英数字を作成します。
- Oktaアプリ連携からCreate Userを選択し、OptionをWith Passwordを選択します。Oktaユーザー作成に必要な値を1.および5.から当てはめていきます。
- Compose関数で作成したOktaアカウントの情報をメッセージとして作成します。
- Update Row関数を利用し、テーブル「kickflow-Join」のOkta IDに作成されたOktaのIDを反映させます。
- Falseの場合、Compose関数でメールアドレス候補が過去に使用されたものである旨のメッセージを作成します。
- 7.および9.で作成したメッセージをOutputとして指定します。
- If/Elseを抜けて、Slackアプリ連携のSend message to Channelを利用し、作成したメッセージを指定したチャンネルに送信します。
実行結果としてSlackに以下のようなメッセージが投稿されます。
ユーザー作成後の動き
今回のフローの処理ではありませんが、アカウント作成時にOktaのプロファイルのUser typeにkickflowで入力された雇用形態を反映するようにしています。
Oktaのグループルール設定でUser Typeが「正社員」であれば、Generalグループに追加する、「業務委託」であればSubcontractingグループに追加し、それぞれのグループはプロビジョニング設定が完了しているアプリケーションを割り当てることでSaaS側へのユーザー作成まで行うこともできます。
kickflowから連携させる属性を増やし作り込むことで属性ベースのアクセスコントロール の考え方に基づく設計が可能です。
課題点
実は今回のフローには以下のような課題があります。
kickflow側でフォームの並び順が変更になった際に自動的には追従できない
これはOkta Workflowsでkickflow側のデータを取得する際に配列を指定しているためです。今後、kickflow側で並び順を変更すると配列の順序も変化するため、メンテナンスが必要になることがあります。
過去に発行したメールアドレスと重複した場合の処理
これについてはどのように処理を行うべきか悩みました。私が情報システム部門で業務をしていた時には、同姓同名の別人の場合に数字やアルファベットを付加するなどのルールが決まっていました。しかし、同一人物が退職後に再入社する場合もあり、同じメールアドレスを利用することもあったため、あえて自動化せずにSlackに通知を行うのみに留めました。
まとめ
今回はkickflowからのデータを受け取ることをトリガーとしていましたが、Webhookが利用でる他のツールでも同様のことが可能です。
またフローの中でAPIを実行することや、OktaやSlack以外にもコネクタが用意されているアプリがあるため、アイディア次第で様々なことが実現できそうです。
2021年10月のOkta社のプレスリリースのとおり、Okta Workflowsは5つのフローまでは無料で利用できます。
Okta Workflowsについてご相談がございましたらぜひ弊社までご連絡ください!