Workato：Workato REST APIとSlackを組み合わせてアクティブレシピの管理を効率化する

# はじめに

Workatoにおける既知の問題として、現在有効なレシピ（アクティブレシピ）とその数は分かるが、どのレシピが課金対象（Callable Recipe以外）であるか一目で分からないという問題があります。

Workatoでは「Projects」で現在有効なレシピ（アクティブレシピ）をの数やその内容を確認することが出来ます。しかし、ここで確認できるものはスタートしているレシピの総数であり、課金対象・非課金対象のレシピの区別はされていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/cd0eaa83-7992-f260-97d5-ab8f27904f7e.png)

目視でCallable Recipeを数えて課金対象と非課金対象のレシピを把握する方法もありますが、Workato導入当初のようなレシピの少ない状況であれば、まずはそれで事足りるとは思いますが、運用が進むにつれ、レシピの数が多くなれば、目視でCallable Recipeを数える方法で状況把握する方法は現実的ではなくなります。何より、目視で数える方法は効率的とはいえません。

また、意図せずスタートするレシピにも注意が必要です。一部のコネクターには、レシピが停止していても、トリガーが呼び出されることで自動的にレシピをスタートされるものが存在します。これにより、いつの間にか課金対象のレシピが増えた、課金対象のレシピが増えたことで契約レシピ数を超えてしまった等の問題に遭遇することがあります。

※例えば、Workbot for Slackの場合、Workbotのコマンドが呼び出されると、停止しているレシピであっても、そのレシピにエラーが無ければレシピが勝手にスタートします。

それから、課金対象レシピを含め、アクティブレシピの状況を把握するために毎回Workatoを開くのも非効率であるといえます。可能であれば、Slack等のコミュニケーションツールを利用して、毎日自動的に知らせてほしいものです。

ということで、今回はWorkatoのアクティブレシピの管理を効率化するためのレシピを作成していきます。

# Workato REST API

WorkatoにはWorkato自身を操作するためのREST APIが用意されています。本REST APIを利用することで、例えば現在動作中のレシピの一覧（リスト）や、各レシピのトリガーを含めた詳細情報を確認することができます。つまり、REST APIを利用することで、どのレシピが課金対象になり、どのレシピが課金対象外となるかを確認することもできます。

Workato REST APIの詳細は、以下を参照ください。

https://docs.workato.com/workato-api.html

## Workato API Keyの取得

Workato REST APIを利用するには、まずWorkato API Keyの取得が必要です。
API Keyは、Workatoを開き、「Setting」－「API Key」の順にクリックすることで確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d6cbae78-284b-1d49-48d2-d03b623483d6.png)

# コネクションの作成

最初に、HTTPコネクターのコネクションを新たに作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/29d468a9-4abe-8305-ec11-a6d427de3970.png)

次に、コネクションの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/75138d7c-fcb5-0e0c-97e5-779840ce10a7.png)

|フィールド           |値                             |
|:------------------:|:-----------------------------:|
|Connection name     |任意の名称                      |
|Location            |任意のプロジェクトあるいはフォルダ|
|Authentication type |Header auth                    |
|Header authentication|x-user-token: \<WorkatoのAPI Key\> <br> x-user-email: \<WorkatoワークスペースのAcccount email>|
|Use custom TLS/SSL certificate settings|No          |
|Is this app in a private network?|No gateway        |

# レシピの作成
次のようなレシピを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/54e6a4fd-877e-4114-7823-9ef3ee74c270.png)

上記レシピの作成手順について、順を追って説明します。

## 【１】レシピの作成に必要な情報の取得（準備作業）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4d8fb6a8-5a70-7ac3-8717-10efa1fb7a4e.png)

### １．トリガーとアクションの設定

トリガーには Scheduler by Workato コネクターを指定し、設定はデフォルトのままとします。
アクションには HTTP コネクターを指定し、先に作成したコネクションを指定のうえ、次の通り設定します。なお、Requestのみ設定し、Responseは未設定のままとします。（Responseは後ほど設定します）

#### Request name
任意の名称

#### Request

##### Method
GET

##### Request URL
`https://www.workato.com/api/recipes/`

##### Request URL parameters
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/09c31185-5d25-b792-42f0-e0a68980fb6b.png)

|フィールド           |値                             |
|:------------------:|:-----------------------------:|
|per_page            |1                              |
|running             |true                           |
|adapter_names_any   |true                           |

##### Request headers
デフォルトのまま

### ２．レシピのテスト実行とJSONテキストの取得
以上の設定が完了したら、画面右上の「Test」をクリックし、レシピのテストを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ed101c23-3af5-e1c8-9b27-29f2ff192e4d.png)

テストが完了し、成功すると「Successful」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fa8243dd-7b4f-6f38-b124-3105460012c5.png)

また、HTTPコネクターをクリックし、「Output」タブをクリックすると、レスポンスを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ea1acac6-f48b-562e-d09a-436689cd0a79.png)

レスポンス内の「Body」の値をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1b851768-7fdd-4d9a-151d-6f65c14a4317.png)

### ３．Response schemaの設定

レシピ編集画面へ戻り、Response schemaの「Use JSON」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/246c65de-dc66-3e57-db89-81912b5e7a15.png)

JSON sampleに先ほどコピーしたBodyの内容を貼付し、「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a837b122-7538-a321-9721-fce0b6baffb1.png)

内容を確認のうえ、問題なければ「Generate schema」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/55beda3e-1d8f-b2ee-1ba0-24162fb8042f.png)

以下の通り、Response schemaが自動で生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5f275eed-2036-4049-c313-94b3e09f9ce5.png)

　
## 【２】変数・配列の定義
### １．List by Workatoコネクターを追加します。
「Create repeat helper list」を選択します。Sizeは`10` とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9005be86-ae6b-3d29-ca50-277d50adf66b.png)

### ２．Variables by Workatoコネクターで変数を追加します。
「no_results」変数（Boolean型）を定義します。デフォルト値は `No` とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5683766e-e81f-ecfb-0328-f59bbc4d2c73.png)

### ３．Variables by Workatoコネクターでリストを追加します。
「billable_recipes」と「non_billable_recipes」リストを追加します。List item schemaには、いずれも「recipe_id」（String型）と「recipe_name」（String型）を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b4cc3197-2fdd-bf2d-0b3c-0cdeba204198.png)

## 【３】レシピリストの取得と処理
### １．ループ処理でレシピのリストを取得します。
ループ処理に使用するリストは、【２】の１で追加したList by Workatoコネクターの出力値を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fdfd380e-3f6e-8fbf-7632-3afeaf2df712.png)

### ２．HTTPコネクターを編集します。
HTTPコネクターは先に追加したものを使用します。Request URL parametersの「per_page」を `100` に変更し、「page」を追加したうえで Step 6の `Seq no`をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3bbdedb4-2265-be35-f50c-6a14fed6cb74.png)

### ３．HTTPコネクターの戻り値が0件であった場合の処理を定義します。
戻り値の件数が0件であった場合は、「no_results」の値を `Yes` にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/946e6bf7-86b2-7c60-9e41-7452741169ca.png)

Ifブロックの条件に指定するList sizeは、Step 8の値を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2de8051d-296f-fcc4-bfdf-c771aabeae8b.png)

### ４．HTTPコネクターの戻り値が0件以外の場合の処理を定義します。
Ifブロックの条件に指定するList sizeは、上記３と同様、Step 8の値を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2de8051d-296f-fcc4-bfdf-c771aabeae8b.png)

### ５．取得したレシピのリストをループ処理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ec57e029-811e-1bd1-ba2e-997f158ed4bc.png)

ループに使用するリストは、Step 8の `Items` を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7ace9670-8065-ac53-9125-56313fef8ddd.png)

### ６．Callable recipe と Callable recipe以外のリストを作成します。
Ifブロックを追加し、Callable Recipeでない場合と、Callable Recipeである場合の条件を定義します。
Callable Recipeがトリガーの場合、 「Trigger application」の値は `workato_service`になりますので、 `workato_service` であるか、そうでないかでCallable Recipeである・ないの判別が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f85c06f0-12db-7e35-58ba-3d58e1dde878.png)

それぞれの条件にVariables by Workatoコネクターを追加し、「Add item to list」アクションを選択し、List nameより該当するリストを選択のうえ、各リストに値をセットします。「Recipe ID」と「Recipe name」の各値は、Step 12の値を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a29b10e1-a86a-78dc-47c9-412eb293f040.png)

## 【４】Workbot for Slackコネクターの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fbc4c7f2-5022-de83-21a0-2e7d0c47fd97.png)

### １．課金対象アクティブレシピのSlack通知のためにWorkbot for Slackコネクターを追加し、次の通り定義します。

※記載のない項目は、デフォルトのままとします。

|項目                    |値                                |
|:---------------------:|:--------------------------------:|
|Channel name/DM        | 通知先のチャンネル                |
|Notification text      | 「課金対象のアクティブレシピ」など  |
|Multiple attachments   | Yes                              |
|Attachments source list| Step4の `billable_recipes`       |
|Attachment color       | `Warning` など                    |

#### Attachment fields
|Field|Title                  |Value                             |
|:---:|:---------------------:|:--------------------------------:|
|#1   |ID                     | Step4の `Recipe ID`              |
|#2   |Name                   | Step4の `Recipe name`            |
|#3   |URL                    | https://app.workato.com/recipe/ *Step4の `Recipe ID`*|

### ２．課金対象外アクティブレシピのSlack通知のためにWorkbot for Slackコネクターを追加し、次の通り定義します。

※記載のない項目は、デフォルトのままとします。

|項目                    |値                                |
|:---------------------:|:--------------------------------:|
|Channel name/DM        | 通知先のチャンネル                |
|Notification text      | 「課金対象のアクティブレシピ」など  |
|Multiple attachments   | Yes                              |
|Attachments source list| Step5の `non_billable_recipes`       |
|Attachment color       | `good` など                    |

#### Attachment fields
|Field|Title                  |Value                             |
|:---:|:---------------------:|:--------------------------------:|
|#1   |ID                     | Step5の `Recipe ID`              |
|#2   |Name                   | Step5の `Recipe name`            |
|#3   |URL                    | https://app.workato.com/recipe/ *Step5の `Recipe ID`*|


# 実行例
上で作成したレシピを実行すると、次のようにSlackへ通知されます。これにより課金対象のアクティブレシピと課金対象外のアクティブレシピを一目で判断することができます。また、Slackへ定期的に通知させることで、Workatoの画面を見ることなく、アクティブレシピの状況を把握できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/609011e2-360d-647e-14af-4dec95332ca0.png)