CData Software Blog

クラウド連携のCData Software の技術ブログです。

ローコードアプリ統合プラットフォーム Paragon を使って Slack への通知フローを構成してみる

f:id:sugimomoto:20200809170523p:plain

こんにちは。CData Software Japanリードエンジニアの杉本です。

今回は気になるローコードなAPI連携サービス「Paragon」を見つけたので、紹介したいと思います。

Paragon とは?

Paragon はビジュアルワークフローエディターを使用して簡単にAPI統合、DB連携などを構成することができるローコードアプリケーション統合プラットフォームです。いわゆるiPaaSですね。

www.useparagon.com

f:id:sugimomoto:20200809165608p:plain

最近、約2.6億円調達のプレスリリースが出て、結構ツイッターなどでは反響があったように感じます。

jp.techcrunch.com

主な特徴としては、ZapierやPower Automateのようなビジュアルワークフロー・iPaaSですが、どちらかといえば完全にコードを廃するよりも、中継処理部分はJavaScriptで柔軟な処理を書かせるという感じが強い製品です。

f:id:sugimomoto:20200809165621p:plain

連携先サービスのラインナップは今の所控えめですが、Web APIをリクエストするためのコネクタは柔軟に構成できるので、大抵のREST APIには接続できるかなと思います。

DB系でMongoDBとMySQLPostgreSQLをおさえているのが印象的ですね。

f:id:sugimomoto:20200809165632p:plain

あとポイントとしてはAPI Response を構成できるところですね。いわゆるFaaS(Azure Functionsや AWS Lamdaみたいな)的な構成もできます。

docs.useparagon.com

f:id:sugimomoto:20200809165640p:plain

Paragonではfreeプランが提供されていて、とりあえずサクッと試すことが可能です。ただし、Google Sheetsや各種RDBなどの連携は上位プランからとなり、その場合はトライアルが無いみたいなので要注意です。

www.useparagon.com

f:id:sugimomoto:20200809165652p:plain

シナリオ

今回 は Paragon の free プランを使って、Slack通知のAPI連携を実装してみました。

https://cdatajbuilds.s3-ap-northeast-1.amazonaws.com/CDataBlog/Paragon/paragontest.gif

以前私のBlogで紹介している、OReillyのBookリストから最新の書籍リストを取得して、Slackに通知するというものです。

kageura.hatenadiary.jp

上の記事でも書いていますが、API は CData API Serverを使って構成しています。

https://www.cdata.com/jp/apiserver/

f:id:sugimomoto:20200809165708p:plain

ちなみに、freeプランだと標準提供のSlack コネクタは利用できないので、APIコンポーネントを利用して、実装しています。

サインアップ

まずは Paragonにサインアップしましょう。ParagonのWebサイトの「Get Started」から

https://www.useparagon.com/

f:id:sugimomoto:20200809165716p:plain

以下のユーザー登録を行うだけでサインアップでき、そのまま Free プランが利用できます。

f:id:sugimomoto:20200809165727p:plain

Workflowの作成・スケジューラーの構成

サインアップしたら、新しくWrokflowを作成します。ParagonではWorkflowという単位で処理を記述していきます。

SlackNotficationという名前で作成し

f:id:sugimomoto:20200809165737p:plain

最初にTriggerを決めます。Triggerは現在「Scheduler」と「API Endpoint」が使えます。API Endpointだと、リクエストを受け付けるAPIエンドポイントが提供されるので、外部からそのAPIに対してリクエストを行い実行する形となります。

f:id:sugimomoto:20200809165743p:plain

とりあえず今回はTriggerで、30分ごととしました。

f:id:sugimomoto:20200809165750p:plain

APIからデータを取得するStepを作成

続いて実際の処理部分を作っていきます。まずOReillyのBook List APIからデータを取得したいのでAPI RequestのStepを追加します。

f:id:sugimomoto:20200809165756p:plain

今回は最新の書籍を5件取得します。上位5件で発売日降順で並び替えるので、実際のAPIリクエストは以下のようにしました。

GET https://oreillydemoapi.azurewebsites.net/api.rsc/OReillyBooks/?$top=5&$orderby=PublishDate desc

Paragonでは、Paramsの部分でクエリパラメータを記述できます。

f:id:sugimomoto:20200809165802p:plain

また、認証用のトークンはHeaderで渡します。以下のパラメータを追加しました。

x-cdata-authtoken: 7y3E6q4b6V1v9f0D2m9j

f:id:sugimomoto:20200809165809p:plain

それぞれのStepで実際にAPIが正常に実行されるかどうかを「Test Step」をクリックすることで確認できます。以下のようにレスポンスが返ってきていることを確認できました。

f:id:sugimomoto:20200809165814p:plain

レスポンスは以下のようになります。これを後続のStepで使っていきます。

{
    "@odata.context": "https://oreillydemoapi.azurewebsites.net/api.rsc/$metadata#OReillyBooks",
    "value": [
        {
            "RowId": 439,
            "ImageUrl": "https://www.oreilly.co.jp/books/images/picture_large978-4-87311-888-8.jpeg",
            "ISBN": "978-4-87311-888-8",
            "Price": "3520",
            "PublishDate": "43766",
            "Title": "ゼロトラストネットワーク",
            "URL": "https://www.oreilly.co.jp/books/9784873118888/"
        },
        {
            "RowId": 440,
            "ImageUrl": "https://www.oreilly.co.jp/books/images/picture_large978-4-87311-889-5.jpeg",
            "ISBN": "978-4-87311-889-5",
            "Price": "4180",
            "PublishDate": "43757",
            "Title": "Juliaプログラミングクックブック",
            "URL": "https://www.oreilly.co.jp/books/9784873118895/"
        },
        {
            "RowId": 438,
            "ImageUrl": "https://www.oreilly.co.jp/books/images/picture_large978-4-87311-887-1.jpeg",
            "ISBN": "978-4-87311-887-1",
            "Price": "3080",
            "PublishDate": "43735",
            "Title": "NumPyによるデータ分析入門",
            "URL": "https://www.oreilly.co.jp/books/9784873118871/"
        },
        {
            "RowId": 437,
            "ImageUrl": "https://www.oreilly.co.jp/books/images/picture_large978-4-87311-886-4.jpeg",
            "ISBN": "978-4-87311-886-4",
            "Price": "3190",
            "PublishDate": "43727",
            "Title": "レガシーコードからの脱却",
            "URL": "https://www.oreilly.co.jp/books/9784873118864/"
        },
        {
            "RowId": 419,
            "ImageUrl": "https://www.oreilly.co.jp/books/images/picture_large978-4-87311-865-9.jpeg",
            "ISBN": "978-4-87311-865-9",
            "Price": "4620",
            "PublishDate": "43725",
            "Title": "Raspberry Piで学ぶコンピュータアーキテクチャ",
            "URL": "https://www.oreilly.co.jp/books/9784873118659/"
        }
    ]
}

Slack通知Messageを生成するStepを作成

続いて、API Responseで受け取ったデータをSlackへ通知するための文字列として構成しなおします。

Paragonではこういった処理を一律「Function」というStepでJavaScriptのコードにより構成します。

https://docs.useparagon.com/building-workflows/functions

f:id:sugimomoto:20200809165824p:plain

Functionは前Stepのレスポンスをパラメータとして受け取ることができます。

パラメータは予め定義する必要があるので、以下のようにパラメータのKeyを決めて、前Stepで受け取ったレスポンスをプルダウンから選び、指定します。今回はレスポンスの一個目(response.body.value.0)をパラメータとして渡すようにしました。

f:id:sugimomoto:20200809165828p:plain

あとはJavaScriptで受け取ったレスポンスをSlackに通知するメッセージへ加工します。parametersの変数から予め指定したパラメータにアクセスができます。

function yourFunction(parameters, libraries) {
    return {
        "text" : "最近以下の本が追加されました。\nTitle:" + parameters.value.Title + "\nPrice:" + parameters.value.Price + "円\nURL:" + parameters.value.URL + "\nImage:" +  parameters.value.ImageUrl
    }
}

最終的な通知メッセージは以下のイメージです。

f:id:sugimomoto:20200809165835p:plain

Slackへの通知リクエストを行うStepを作成

最後にSlackへの通知処理を構成します。

前述の通り、FreeプランではネイティブのSlack通知機能が使えないので、API Requestを使って、構成します。

なので予めSlack AppでIncoming Webhooksを構成し、URLを取得しておきましょう。

slack.com

f:id:sugimomoto:20200809165845p:plain

次のStepとして「Request」を追加し

f:id:sugimomoto:20200809165855p:plain

PSOTリクエストでSlackの通知URLを指定します。

Bodyには、前のStepで構成したパラメータを以下のように渡すよう、Keyに「text」と指定して、Functionの返り値を紐付けます。

{
    "text" : "Message"
}

f:id:sugimomoto:20200809165907p:plain

以上ですべてのStepの構成は完了です。

テスト実行

それでは試しに実行してみましょう。

TriggerでSchedulerを指定していますが、「Test Workflow」から手動で実行することも可能です。

f:id:sugimomoto:20200809165926p:plain

https://cdatajbuilds.s3-ap-northeast-1.amazonaws.com/CDataBlog/Paragon/paragontest.gif

おわりに

まだリリースされて間もない製品ということもあり、コネクターの数やUIの挙動など、気になる点もありますが、処理がJavaScriptで書ける点やFaaS的構成が取れる点など、ローコード製品ながらもエンジニアフレンドリーな感じもする面白いサービスでした。