🍜

Azure Logic AppsのCustom Connectorを一から作成してみる

2022/07/27に公開

Azure Logic Appsとは

Logic Appsとは、Azureで提供されているサービスの一つで、様々なサービスからデータを取得したり連携したりするための処理を極めて簡単に定義できるのが特徴です。

  • Azureの各種サービス、各種SNSやWebサービス接続用の「コネクタ」がデフォルトで提供されており、フローチャート的に組み合わせるだけで処理を定義できる
  • サーバレスで動作するため、処理が動作している時間のみに課金され極めて安価
    (一ヶ月Webクローラーを動かして数十円の課金で済みました)

Logic Appsの編集画面はこんな感じです。
Logic Apps公式チュートリアルより

クローラーや通知ツール、SlackやLINE、Twitterと連携するBOTなど作ったり、
Azure内のデータ処理連携などを手軽に作るのに適していると思います。

サーバレスなデータ処理機構をビジュアル的に組める類似のサービスではAWS Step Functionsなどがありますが、基本的にLambdaを手書きで積み上げる必要のあるStep Functionsと比べると「よくある処理」を組み合わせるならLogic Appsのほうが早く作れるかと思います

カスタムコネクタとは

とは言っても、当然世の中のすべてのWebサービス向けのコネクタが定義されているわけではなく、
自前で定義したくなることもあります。(自社サービスのコネクタを作りたい、とか)
カスタムコネクタを作成することで、自分が定義したAPIを叩くコネクタをLogic Apps上で既成のコネクタと同じように使うことができるようになります。(認定を受ければ公開もできるようです)

カスタムコネクタの作成方法

Custom Connectorの作成方法には以下の3つの方法があります。

ここでは、OpenAPI定義を用いてSlackに発言を投稿するカスタムコネクタを作ってみたいと思います。

具体的な作成手順

今回やりたいことの確認

Slackのメッセージ投稿API https://api.slack.com/methods/chat.postMessage を叩くカスタムコネクタを作成します。

今回のAPIの要件:

  • https://slack.com/api/chat.postMessage にPOSTする
  • "Authorization: Bearer XXXXXXXXX" 認証ヘッダを付ける
  • "Content-type:application/json" ヘッダを付ける
  • ボディはjsonでchannelとtextを要素として持つ

という極めて単純なAPIです。

Custom Connector定義を作る

Azureポータル > Custom Connectorから作成を選択しコネクタの名前などを指定します

SwaggerでOpen API定義を作成する

カスタムコネクタの定義本体となるOpen APIでのAPI定義を作成します。

特に使い慣れた環境がなければ、Swagger Editorを使うのが手っ取り早いです。馴染みの無い方はざっくりOpen APIはRESTful APIの定義フォーマット、SwaggerはOpen APIを記述するためのツール、とお考えください。

SlackのAPIリファレンスを参考に以下のようになります。

swagger: '2.0'
info: {title: Default title, description: slack APIs, version: '1.0'}
host: slack.com
basePath: /api
schemes: [https]
consumes: [application/json]
produces: [application/json]
securityDefinitions:
  API Key: {type: apiKey, in: header, name: Authorization}
security:
  - API Key: []
paths:
  /chat.postMessage:
    post:    
      summary: Post a message to the channel.
      consumes:
        - application/json
      parameters:
        - in: body
          name: user
          description: The message to be posted.
          schema:
            type: object
            required:
              - text
              - channel
            properties:
              text:
                type: string
              channel:
                type: string
      responses:
        200:
          description: "成功時のレスポンス"

注意点としてSwagger/Open APIではバージョンとして2.0と3.0.Xが存在し、シンタックスが異なります。
Customer ConnectorはOpen API 2.0のみをサポート するため、必ず2.0で記述します。

swagger: "2.0"という行があればOpen API2.0, openapi: 3.0.Xという行があればOpen API3.0のフォーマットとして扱われます。[1]

Custom Connectorはjson形式でのみインポートを受け付けるため、Swagger EditorからJSONとしてダウンロードします。

仮にswagger.jsonとして保存したとします。

Custom ConnectorにOpen API定義をインポートする

ダウンロードしたjsonをCustom Connectorにインポートします。

  1. Logic Apps Custome Connectorから上で作成したCustom Connectorを選択します

  2. Editを選択

  3. API Endpoint種別として「REST」、Import modeにOpenAPI fileを選択.
    ファイルに先程ダウンロードしたjsonを指定

  4. General InformationにOpen APIで指定したHostとBase URLが自動反映されているはずです
    (アイコン、色はお好みで)

Security ->を押下。

  1. 認証設定。ここも自動設定されます

Definition ->を押下

  1. アクションの定義。

    アクションの名前や説明を記述。Visibilityはコネクタを追加した際、このアクションが最初に表示されるか等の指定です。ひとまずImportantを指定。

今回はAPIが一つのみでコネクタが提供するアクションも一種類ですが、コネクタ内にアクションを複数定義することも可能です。(+New Actionを追加)

7.リクエストの定義
このアクションで投げられるリクエストの定義。

Bodyは以下のように設定(されているはず)。

  1. レスポンスの定義。今回は特にレスポンスから拾う値等は無いのでそのまま

ここまですべて完了したら「Update Connector」を押下。

作成したコネクタを利用する

Slack側の認証設定

本題ではないので詳細省略。こちらを参照。chat:write 権限の付与されたUser OAuth Tokenを取得します。
以下、User OAuth Tokenを以下と仮定。

xoxp-XXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXX

Logic Appsに組み込む

Logic app designer画面で組み込みます。今回は適当に1分毎の定期トリガーから呼び出してみます。

Step追加の際に、「Custom」内に定義したコネクタが表示されます

定義したpost Messageアクションが表示されています。

このAppの中でのコネクタ名を付け、クレデンシャルを提供します。
上述のUser OAuth Tokenの場合、
Bearer xoxp-XXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXXをクレデンシャルに指定します。


#できれば xoxp-...のみを指定できるようにしたかったのですが、分かりませんでした。ご存じの方居たらコメントください

saveして実行します。

無事にSlackに定期ポストされるようになりました。

脚注
  1. Open API2.0はかつてSwagger 2.0と呼ばれていました ↩︎

Discussion