Edited at

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 さんの記事です。お楽しみに!