Slack Custom Functions で作るSlackワークフロー内での外部API呼び出し

こんにちは、 id:numanuma08 です。前回の記事に引き続きSlackネタです。

blog.covelline.com

この記事内でSlack内の動作をトリガーにSendgrid APIを呼び出し、メールを送信するワークフローを紹介しました。Slackから外部サービスのAPIを呼び出す方法は

  • Slack Appとしてインストールする
  • Outcoming Webhook を使う
  • Custom Functionsを実装する

方法が考えられます。これらのオプションの中からCustom Functionsを選んだ理由と実装する上での注意点を紹介します。

Slackから外部サービスのAPIを呼び出すには

Slackから外部サービスのAPIを呼び出す場合、そのサービスがSlackアプリとして公開されていれば設定画面からアプリを連携させるとワークフロー内から利用可能となります。

slack.com

今回私達が使いたいSendgridはSlackアプリとして公開されていなかったためこの方法は使えません。

時点でOutcoming Webhookがあります。

slack.com

しかし、Outcoming Webhookはすでに非推奨です。将来削除される可能性もあり、Slackアプリが推奨されています。

以上の利用からCustom Functionsを使った外部API呼び出しを採用しました。

Slack Custom Functionsとは

Slackアプリで提供されていない機能を自分で定義・実装しワークフローから呼び出す仕組みです。他のワークフローと同じく入力を受け取り動作をさせて結果を出力します。外部APIの呼び出しも可能なので

  • 特定のAPIを呼び出す
  • 一般公開されていないシステムと連携する
  • 特殊な形式のファイルの作成

など実装可能です。ノーコードで実現できるワークフローと異なり、Typescriptによるコーディングが必要です。

api.slack.com

ランタイムはdenoです。

Custom Functionsで実装する

開発環境のセットアップとかコードの書き方などはドキュメントやSDKのリポジトリを参照すると早いです。

github.com

実装する上でで私がつまずいた部分やドキュメントに記載はあったけれど見落とした部分についてまとめます。

外部サービスを呼び出す場合、manifestに記述が必要

slack.com以外のドメインを呼び出す場合、manifest.tsoutgoingDomainsに接続先ドメインを記載しなければなりません。Sendgrid APIの場合エンドポイントのドメインはapi.sendgrid.comです。この記述を忘れるとAPIの呼び出しに失敗します。

エラー発生時にスタックトレースは表示されない

Functions実行中にエラーが発生してもSlackの画面上などにエラーログは表示されません。エラーとして表示されるのは関数実行時返り値でoutputs.errorに設定した文字列のみです。したがって、Custom Functionsの実行エラーが生じた場合のエラーメッセージを適切に定義しワークフロー実行者に対して通知しなければなりません。また、ログも表示されません。

env設定はデバッグ実行時は参照されない

APIキーなど秘密情報をアプリで利用するためにSlackワークスペースに環境変数を設定可能です。Slack CLIをインストールしてslack env addコマンドから設定できます。しかし、環境変数はローカロデバッグモードでは参照されません。デバッグ時はローカルに置いた.envファイルを参照します。このあたりはドキュメントに記載されています。

api.slack.com

npmパッケージは利用できない

deno自体はnpmを利用可能ですが、Custon Functionsはデプロイ時に実行するdeno bundleコマンドでnpmのライブラリ取得に失敗し、デプロイ不能です。今回、Sendgrid APIを呼び出すためにSendgridがnpmパッケージとして公開しているクライアントライブラリを使って開発していましたが、デプロイ中に問題が発覚したので自前でfetch APIを使って再実装しました。

www.npmjs.com

Webのエンドポイントを呼び出すだけなので大した手間はないですが、ちょっと驚き。

まとめ

Slackワークフローから外部APIを呼び出す方法としてSlack Custom Functionsを紹介しました。Slackに課金しているチームなら利用可能なので、新しいサービスの実装や車内ワークフローの改善などで積極的に利用できると良いですね。