Slack
APIGateway

Slack の簡易エンドポイントを Amazon API Gateway で作った話

ランサーズ Advent Calendar 2018 の3日目です。
昨日は、ランサーズの分析基盤(capybara) についての記事でした。

本日は、ランサーズ社内で使用している Slack の独自エンドポイントについてお話しします。
Slack Webhoook の管理に悩んでいる場合は参考になるかもしれません。

概要

一言で表現すると「Slack に投稿できる簡易エンドポイント」です。
Slack 通知を気軽に実現するために作成しました。

  • サーバやバッチから使うための Slack 通知エンドポイント
  • POST でメッセージを投げつけるだけ
  • Webhook URL やトークンなどを意識する必要なし
  • Amazon API Gateway と Slack Incoming Webhook を活用

 
詳細な仕組みについては後述します。

Slack 簡易エンドポイントの使い方

エンドポイントに POST リクエストを送信するだけです。
どんな手段・言語でもすぐに使えます。

テキストだけを指定

最低限必要なパラメータは text だけで、未指定の項目にはデフォルト値が適用されます。

curl -XPOST https://xxxxxx.com/slack --data "text=通知のテストメッセージです。"

何も指定しない場合は、Slack テスト部屋にランサーズ君が通知してくれます。かわいい。

名前とアイコンを指定

usernameicon_emoji を指定すれば、アイコンや名前も変えられます。

curl -XPOST https://xxxxxx.com/slack \
--data "username=Testbot" \
--data "icon_emoji=:ghost:" \
--data "channel=#alert" \
--data "text=通知のテストメッセージです。"

JSON 形式で送信

JSON の方が扱いやすい場面も多々あります。
同じパラメータを JSON として送り付けても受け付けます。

curl -XPOST https://xxxxx.com/slack \
--header "Content-Type: application/json" \
--data '{
  "username": "Testbot",
  "icon_emoji": ":ghost:",
  "channel": "#alert",
  "text": "通知のテストメッセージです。"
}'

メリット

何よりも 簡単に使える ことが一番の利点です。

  • 通知内容だけをシンプルにサクッと送信できる
  • Webhook URL を発行する手間が掛からない
  • 各種ツールに Webhook URL や認証情報を埋め込まずに済む
  • Webhook 経路の一括管理ができる

デメリット

  • Incoming Webhook 非対応の機能(画像送信など)は使えない

裏側を Slack API に置き換えることで、対応自体は可能です。

Amazon API Gateway で実装

Slack 簡易エンドポイントは Amazon API Gateway で実装しました。
受け付けたリクエストを Slack に横流しするだけ なので、Lambda も使いません。

Content-Type によって以下のマッピングテンプレートを使い分けます。

application/json

JSON 形式でリクエストが来た場合は、何も変えずにそのまま使います。

マッピングテンプレート
$input.body

application/x-www-form-urlencoded

Form 形式でリクエストが来た場合は、リクエストボディを分解して JSON 形式に変換します。

マッピングテンプレート
{
#foreach($kv_str in $input.body.split('&'))
#set($kv = $kv_str.split('='))
  "$kv[0]": "$kv[1]"#if($foreach.hasNext), #end
#end
}

 
統合タイプを HTTP にした上で、Slack Incoming Webhook の URL を指定すると完成です。

細かいところではカスタムドメインやリソースポリシーのアクセス制限も設定していますが、割愛します。

 
API Gateway しか使用しないため、運用作業不要・コストも非常に低く抑えられるのが特徴です。
1ヶ月に100万回呼び出したとしても $4.25 だけで済みます。

Slack 簡易エンドポイントの導入効果

Slack へ簡単に通知できるようになったため、
これまでメールや別の手段で通知していたものを Slack に置き換える流れが加速しています。

多い日には1日で1000件近く呼ばれるようになりました。
今後も、社内 Bot の増加とともにエンドポイントへのアクセスが増える見込みです。

まとめ

  • Slack へ簡単に通知するためのエンドポイントを作成しました
  • POST リクエスト一つで通知できるため簡単に使えます
  • API Gateway を活用して運用負荷&コストの低減を図っています

今後は Slack API を使った再実装や、さらなる機能拡張などに取り組みたいと考えています。

 
以上、ランサーズ Advent Calendar 2018 3日目の記事でした。
明日は inamuu さんの記事です。お楽しみに!