💡作ったもの
毎月第1月曜日に久しく投稿のないSlackチャンネルを1つだけアーカイブしてくれます。こういうのは機械的にやっちゃったほうがいいでしょ。
チャンネルに参加しているみんなが寂しくないように謎のメッセージを残してからアーカイブするようにしました。なお、参加者にはメンションが届くし、必要なら手動で戻せるので実害はないかと思います。
成果物
saitota/SlackChannelArchiver
Lambda + Cloudwatch Events 起動のサーバレス構成です。
✋構築手順
README に書きました。Serverless Framework でさくっとデプロイできます。
🔧工夫したところ
Serverless Framework を活用するのが楽しくなってきました。単純にデプロイするだけではなく、ステージ毎に設定ファルを切り替えたり (environment_xxx.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 プロファイルを使わないので、私の環境では明示しないとエラーになります。プロファイルを指定する場合は、
$ serverless deploy --profile account1
ステージも指定しなければ dev 環境にデプロイされます。プロダクションなら次のように書く。間違えて prd にデプロイするようなミスがなくなります。
$ serverless deploy --stage prd
あと面白いのが、プラグイン serverless-plugin-aws-alerts
で Invoke エラーやスロットリングに対してアラーム設定ができる。もう画面ポチポチしなくていいんだよ!
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