Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

yuu26
インフラ分野に興味のあるエンジニアです。 https://spla2.yuu26.com なども作りました。 最近の新しい記事はブログに書いています。
https://blog.yuu26.com/tag/technology/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away