魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

Slack の局所的便利アプリを作る

概要

Slack App 作りたくないですか? ということで作ります。

背景

職場は Slack をゴリゴリのゴリに使っているのでその便利は身に染みて分かっており、私生活でも使おうということで個人でワークスペースを作ったことがありました。

Slack App の練習場所みたいな意味も込めて作ったのですが、当然一人だと特にすることがないので完全に宝の持ち腐れという感じでしばらく放置していました。

ところで、以前から弟とよくオススメの音楽を教え合っていたのですが、LINE だと話題が混ざったり反応しないといけないような感じがしたりすることもあり、ちょっと不便(というかお互い気を使ってしまいそう)だなと思っていました。

じゃあ Slack で非同期にいろんな音楽やらなんやらを蓄積していく場所にしようじゃないか、ということで弟を招待して使いはじめました。

たった二人ですが sake とか cooking とか色々チャンネルを作っていい感じに運用しています。

で、 music というチャンネルを作ってそこに YouTube のリンクを貼ってオススメの音楽を連携しあうようになったのですが、同じ動画を何回も貼りそうになってしまいます。だってオススメする気持ちは変わらないので。

そこで、過去に投稿された楽曲の一覧をいつでも取得できるような Slack App を作ろうと思いました。

ちなみに執筆しながら作っているので手順書のような思考のログのような感じになるかと思います。

仕様を考える

どんな構成がいいか考えてみます。

わたくし不肖ながら AWS エンジニアなので AWS ありきで考えます。

まず、API で Slack の投稿を引っこ抜く Lambda が必要そうです。 ですが毎回全部引っこ抜くのは非効率の極みなので、一定期間ごとに実行して、それを DynamoDB に保存していくのが良いでしょう。 現状で一週間程度は簡単に遡れるので、週に一度のペースで一週間分のデータを取得します。 そして投稿内容から YouTube の URL と動画タイトルを抽出し、 DynamoDB に保存します。 定時実行なので CloudWatch Events で起動させます。

そして実際に一覧を投稿してくれる機能です。 Slash コマンドを実装して、コマンドを叩いたときに楽曲の一覧を返してくれるのが一番扱いやすそうな気がします。 このとき、集計する期間を「いつからいつまで」という風にできるのが便利だと思うので、コマンドの引数に指定できるようにしたいですね。

DynamoDB のインデックスの張り方を工夫すれば曲名から投稿されてるか否かが分かったり、とかも出来そうですが、それはそもそも Slack 側で検索すれば出てくるので今回は考えない方向でいきます。

ところで、Slack API の特徴としてタイムアウトが3秒、というものがあります。 なのでタイムアウトを回避するために、若干時間のかかる処理ではい次のような構成を取ることがよくあります。 まず Slash コマンドで起動された Lambda はとりあえずレスポンスを返して、そのときにもう一つのメイン処理を行う Lambda をキックし、キックされた二つ目の Lambda が Slack に本当に欲しい情報を投稿する、と言った感じです。

今回はシンプルなので大丈夫な気もしますが、見切り発車でやっているので今後機能が拡張されることも考慮して分離しておきましょう。

ここまで文章で長々と書いてしまいましたが、構成図としてはこんな感じになります。

f:id:kesumita:20200527230619p:plain
構成図

本文中では明確に説明していませんでしたが Lambda の前には API Gateway が挟んであり、 Slash コマンドの Endpoint URL にこいつを指定します。

draw.io 初めて使って描きましたがやたら苦労しました。

作った

f:id:kesumita:20200531202041p:plain
やけくそUI

なんというか……作ってる途中に完全に飽きてしまいました。

一応、次のようなコマンドで指定した期間内に投稿した YouTube の楽曲をとって来れます。

/music yyyy/mm/dd yyyy/mm/dd

そのうち気が向いて改善したくなったら改良します。

制作途中も逐一記事に書いてたのですが、試行錯誤してるうちにめんどくさくなってしまいましたね。

他にやりたいことがたくさんあるので一旦これはおしまいにします。

尻すぼみ乙。