はじめに
こんにちは。CTOの穴原です。 弊社では1年半くらい前からSlackを導入し、使用しています。 おかげでリモートワークをする方も増え、働き方も多用になってきました。
(特にママさんワーカーが増えました!)
Slackをフリープランで使用していると、ストレージ容量制限を超えて怒られてしまいます。 最近アップロードしたファイル以外は一括削除したい + 継続的に削除が走るようにしたい、ということで、SlackAPI × Lambdaで実装してみました。
Slack API を使ってみる
まずは、Slack APIを使ってみます。
今回はfiles.listでファイルの一覧を取得し、files.deleteで対象のファイルを削除する、という流れでやってみようと思います。 (APIの使い方はここ)
Slack APIのメソッドの引数はtokenがRequiredになっているので、取得しておきましょう。*1 (tokenの取得はここから)
Lambda
Lambdaで関数を作成します。 SlackのBluePrintも用意されているのですが、それほど難しくないので、今回は一から作成しました。
Nodeのコードはこんな感じ。
'use strict';
const moment = require('moment');
const request = require('request');
// slackのトークン
const TOKEN = 'xxxxxxx';
// 何日前までのファイルを残すか
const DAY = 365;
// 一度の実行で消す最大ファイル件数
const FILE_MAX = 1000;
/* イベント発火時に呼ばれるハンドラ */
exports.handler = (event, context, callback) => {
//requestオプションを定義
let options = {
url : 'https://slack.com/api/files.list?token=' + TOKEN + '&count=' + FILE_MAX + '&ts_to=' + getBeforeTimeStampByDay(DAY),
method : 'GET',
json : true,
};
//ファイルリスト取得リクエスト送信
request(options, function (error, response, body) {
if(0 < body.files.length){
// 1ファイル毎に削除
body.files.forEach((val) => {
deleteSlackFile(val.id);
});
}
});
};
/**
* ファイルの削除処理
*/function deleteSlackFile(id) {
//requestオプションを定義
let options = {
url : 'https://slack.com/api/files.delete',
method : 'POST',
json : true,
form : {"token":TOKEN, 'file':id},
headers :{'Content-Type':'application/json'}
};
request(options);
}
/**
* 指定した数値(日単位)過去のタイムスタンプを返却する
*/function getBeforeTimeStampByDay(day) {
return moment().unix() - 60*60*24*day;
}
イベントのトリガーとしては、CloudWatch Eventsを使ってみます。 今回は日次で動いてくれれば良いので、スケジュール式は rate(1 day)
としておきます。
削除対象のファイルが多いと、files.deleteでタイムアウトになることもあるので、タイムアウト時間を多めに設定しておきます。
あとは、日次でCloudWatchが動作していることが確認できれば完成です。 Slackのファイルを確認すると削除されていることが確認できます。*2
さいごに
これでSlackに怒られなくて済む!
*1管理者以上の権限を保持したユーザーのtokenでないと、他ユーザーがアップロードしたファイルを削除できない
*2privateファイルは削除できない(有料ならいける?)