はじめに

こんにちは。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ファイルは削除できない(有料ならいける?)

この記事をシェアする:

東日本橋の制作・開発会社 プレスマンのスタッフブログ