こんにちは、 id:numanuma08 です。前回の記事に引き続きSlackネタです。
この記事内でSlack内の動作をトリガーにSendgrid APIを呼び出し、メールを送信するワークフローを紹介しました。Slackから外部サービスのAPIを呼び出す方法は
- Slack Appとしてインストールする
- Outcoming Webhook を使う
- Custom Functionsを実装する
方法が考えられます。これらのオプションの中からCustom Functionsを選んだ理由と実装する上での注意点を紹介します。
Slackから外部サービスのAPIを呼び出すには
Slackから外部サービスのAPIを呼び出す場合、そのサービスがSlackアプリとして公開されていれば設定画面からアプリを連携させるとワークフロー内から利用可能となります。
今回私達が使いたいSendgridはSlackアプリとして公開されていなかったためこの方法は使えません。
時点でOutcoming Webhookがあります。
しかし、Outcoming Webhookはすでに非推奨です。将来削除される可能性もあり、Slackアプリが推奨されています。
以上の利用からCustom Functionsを使った外部API呼び出しを採用しました。
Slack Custom Functionsとは
Slackアプリで提供されていない機能を自分で定義・実装しワークフローから呼び出す仕組みです。他のワークフローと同じく入力を受け取り動作をさせて結果を出力します。外部APIの呼び出しも可能なので
- 特定のAPIを呼び出す
- 一般公開されていないシステムと連携する
- 特殊な形式のファイルの作成
など実装可能です。ノーコードで実現できるワークフローと異なり、Typescriptによるコーディングが必要です。
ランタイムはdenoです。
Custom Functionsで実装する
開発環境のセットアップとかコードの書き方などはドキュメントやSDKのリポジトリを参照すると早いです。
実装する上でで私がつまずいた部分やドキュメントに記載はあったけれど見落とした部分についてまとめます。
外部サービスを呼び出す場合、manifestに記述が必要
slack.com
以外のドメインを呼び出す場合、manifest.ts
のoutgoingDomains
に接続先ドメインを記載しなければなりません。Sendgrid APIの場合エンドポイントのドメインはapi.sendgrid.com
です。この記述を忘れるとAPIの呼び出しに失敗します。
エラー発生時にスタックトレースは表示されない
Functions実行中にエラーが発生してもSlackの画面上などにエラーログは表示されません。エラーとして表示されるのは関数実行時返り値でoutputs.error
に設定した文字列のみです。したがって、Custom Functionsの実行エラーが生じた場合のエラーメッセージを適切に定義しワークフロー実行者に対して通知しなければなりません。また、ログも表示されません。
env設定はデバッグ実行時は参照されない
APIキーなど秘密情報をアプリで利用するためにSlackワークスペースに環境変数を設定可能です。Slack CLIをインストールしてslack env add
コマンドから設定できます。しかし、環境変数はローカロデバッグモードでは参照されません。デバッグ時はローカルに置いた.env
ファイルを参照します。このあたりはドキュメントに記載されています。
npmパッケージは利用できない
deno自体はnpmを利用可能ですが、Custon Functionsはデプロイ時に実行するdeno bundle
コマンドでnpmのライブラリ取得に失敗し、デプロイ不能です。今回、Sendgrid APIを呼び出すためにSendgridがnpmパッケージとして公開しているクライアントライブラリを使って開発していましたが、デプロイ中に問題が発覚したので自前でfetch APIを使って再実装しました。
Webのエンドポイントを呼び出すだけなので大した手間はないですが、ちょっと驚き。
まとめ
Slackワークフローから外部APIを呼び出す方法としてSlack Custom Functionsを紹介しました。Slackに課金しているチームなら利用可能なので、新しいサービスの実装や車内ワークフローの改善などで積極的に利用できると良いですね。