Edited at

古い Slack チャンネルを自動でアーカイブする機能を作りました

More than 1 year has passed since last update.


💡作ったもの

毎月第1月曜日に久しく投稿のないSlackチャンネルを1つだけアーカイブしてくれます。こういうのは機械的にやっちゃったほうがいいでしょ。

チャンネルに参加しているみんなが寂しくないように謎のメッセージを残してからアーカイブするようにしました。なお、参加者にはメンションが届くし、必要なら手動で戻せるので実害はないかと思います。


:octocat:成果物

saitota/SlackChannelArchiver

Lambda + Cloudwatch Events 起動のサーバレス構成です。


✋構築手順

README に書きました。Serverless Framework でさくっとデプロイできます。


🔧工夫したところ

Serverless Framework を活用するのが楽しくなってきました。単純にデプロイするだけではなく、ステージ毎に設定ファルを切り替えたり (environment_xxx.yml) 、プロファイルをオプションで切り替えられることを知りました。


sererless.yml

provider:

stage: ${opt:stage, self:custom.defaultStage}
region: ${opt:region, self:custom.defaultRegion}
profile: ${opt:profile, self:custom.defaultProfile}
custom:
defaultStage: dev
defaultRegion: ap-northeast-1
defaultProfile: default
otherfile:
environment:
dev: ${file(./environment_dev.yml)}
prd: ${file(./environment_prd.yml)}
functions:
fnc:
environment:
${self:custom.otherfile.environment.${self:provider.stage}}
※一部省略してます

明示的に AWS-CLI プロファイル名を指定しなければ defaut を使うようにしました、個人的には事故らないように deault プロファイルを使わないので、私の環境では明示しないとエラーになります。プロファイルを指定する場合は、


console

$ serverless deploy --profile account1


ステージも指定しなければ dev 環境にデプロイされます。プロダクションなら次のように書く。間違えて prd にデプロイするようなミスがなくなります。


console

$ serverless deploy --stage prd


あと面白いのが、プラグイン serverless-plugin-aws-alerts で Invoke エラーやスロットリングに対してアラーム設定ができる。もう画面ポチポチしなくていいんだよ!


sererless.yml

custom:

alerts:
stages:
- ${opt:stage, self:custom.defaultStage}
alarms:
- functionErrors
- functionThrottles
plugins:
- serverless-plugin-aws-alerts
※一部省略してます


🐛 副作用

もちろんアーカイブしてほしくないチャンネルも、時が立てばアーカイブしてくれます。手動で戻します。


🐛 ハマった所

Slack API を生で叩いててハマることがたまにあります。チャンネル一覧などは取得できるのに、channels.archive メソッド を呼ぶときだけエラーが。権限が不足している?ちゃんと channels:write もScope設定したし、そんなはずないんだけど…

{'ok': False, 'error': 'missing_scope', 'needed': 'channels:write', 'provided': 'identify,bot:basic'}

どうやらアーカイブなどの一部操作は BOT ユーザではきないみたいです。考えることを諦め Legacy トークンを利用しました。

後日調べたところ、 OAuth でアクセストークンを発行するのが正しいやり方のようです。

Slackで業務チャンネルの平穏を維持するbot、そして人間のトークンをbotに与える話 - Qiita

SlackでOAuth2を利用したときのメモ - Qiita