会社でSlackを使っていてやっぱり誰かがチャンネルが作成したことが分からないので作成。
同じことを思ってインターネット上で既に色々な人が作成しているので、技術的には目新しくなく、アウトプットの管理として。
※次のようなページ等を参考にさせて貰いました。
http://coxcox.hatenablog.com/entry/2017/08/16/163719
#概要
パブリックチャンネルに関するイベントを指定したチャンネルに通知。
下記は、チャンネル作成を #general に通知している例
他に、次のようなイベントに対応
- チャンネル削除
- チャンネル名の変更
- チャンネルのアーカイブ
- チャンネルのアーカイブからの復元
SlackのEvents API
https://api.slack.com/events-api
構成
上のページと同じ次の構成。ステートレス。
Slack <---> API Gateway <---> Lambda
AWS側
Node.js は 8.10。
Lambdaはコール元がどこであるかに依存せず汎用的に作成して、APIの利用側とのインタフェースは API Gateway で吸収するのが良いかなと思っていたので、API Gateway では Lambdaプロキシ統合を使用していないが、VTLでの定義そのものや、エラーレスポンスのマッピングが綺麗ではないことを考えると、プロキシ統合してしまった方がいいのだろうか。
制限的なこと
- 削除は、通知されたチャンネルIDでチャンネル情報が既に取得できないので、チャンネル名等が取得できない。
Bot側でチャンネル情報を保持しておく必要がありそう。ステートレスと相性が悪い。 - プライベートチャンネルは、Bot Userが含まれていないと通知されない。
作成イベントは通知を確認できなかった。
Slack Web API
チャンネル名やユーザ名を取得するのに、Web APIを使っている。
(Eventsでは、基本的にSlack内部で管理されるチャンネルIDやユーザIDが通知されるため ※Eventによる)
https://api.slack.com/web
使用したAPI
channels.info
*
users.profile.get
*
chat.postMessage
気づいたこと
Slack APIのTokenには、OAuth Access Token
、Bot User OAuth Access Token
の2つがある。
-
OAuth Access Token
:管理画面にログインしているユーザのToken -
Bot User OAuth Access Token
:Bot UserのToken
管理画面の Scopes から、スコープを設定しても、*のAPIは、Bot User OAuth Access Token
だと、パーミッションエラーとなった。
Bot Userで OAuth を行えば良いのだろうけど、どう行えば良いのかわからなかった。
ログインユーザでOAuth Access Token
を生成してそれを使用した。
逆に自分以外のユーザ情報も取れるのかな?と思ったけど、取得できていた。
ソースコード
Slack、API Gateway、Lambdaのセットアップ
Lambda コードは、一部を node_modules で 別リポジトリ にしてみた
なので、git clone
後、npm install
を行って zip アップロードする必要がある。
やりたいこと
- 盛り上がっているチャンネルを通知させたい
メッセージ全てをイベント通知すると費用もかかりそうなので、どうかなと思った。
今のステートレス構成でそれ以外の Events API だけだと難しそう。
Cloud Watch でスケジュールイベントと連動して、とかならできそう。(でも、全チャンネル分の情報を取得する必要がある。ので、イベントトリガにできた方がシンプル)