知識ゼロからSlackで匿名チャンネルを作ってみた話


はじめに

AWSの知識もLambdaの知識もPythonの知識も全くない状態でSlackに匿名チャンネルを作ろうと四苦八苦したときの備忘録。

きっかけ

Advent Calendarに誘われQiitaで何か記事書かないと…と考えてきた時に

社内slackにVIPチャンネルを作った話
https://qiita.com/peisuke/items/80984db8b47cd8243019

この記事を読んでこれは面白そう!自分の参加しているSlackにも導入してみたい!
と軽い気持ちで手を出したのが苦難の始まり。
全く知識なくても書かれてる通りに進めていけばそこまで苦労もなく導入できるだろうと素人考えしていました。

botの作成

まずはSlack側でアプリの設定。
貼られてるSlack APIのサイトからSlack botの設定。
ふむふむSlack bot作るのは初めてだけどこれくらいならわかる。
書かれた通りに設定完了!

最初の躓き(Lambdaの準備)

次は順番通りにLambdaの準備…Lambda…Lambda…?

色々な所に解説が乗っているので、Lambda+API Gatewayの使い方は割愛します。

割愛…割愛…
とりあえず調べてAmazon Web Servicesの一つだとわかる。
 
AWS公式にいって必要情報入力してAWSのアカウントを作成、サインイン。
…んん? 開始するのにもチュートリアルやらで見ないといけなさそうで時間がかかりそうだ。
今回は急ぎなのでチュートリアルを飛ばして直接AWS マネジメントコンソールに。

…Lambdaはどこへ行けば…

Lambda+API Gatewayの記事をめちゃくちゃ調べる

いろいろ記事を調べてなんとかなんとなーく仕組みがわかってきたような気がしてくる。
そして次は ここ でLambda関数を作ることから始めるのを理解。

一から作成関数の作成 を選んで 関数名 は自分のわかりやすい名称で。そして ランタイム はPythonで。
(実は最初は記事のコードが何で書かれてるのか分からずランタイムをデフォルトの他の記事でも書かれてたNode.jsで登録をする失敗してしまう。)

いろいろ参考にした記事(一部)

https://nmmmk.hatenablog.com/entry/2018/10/10/001548
https://qiita.com/s_s_k/items/b584435120e99d63975b
https://qiita.com/sakuraya/items/bc9af6f8983c80e75b99
https://qiita.com/nave421m/items/bec8d1d7daac810d10aa
https://qiita.com/mido_app/items/fcbbdb2bcce3edf0d3f5
https://dev.classmethod.jp/cloud/aws/serverless-first-apigateway/
https://www.wakuwakubank.com/posts/519-aws-lambda-introduction/
https://qiita.com/t--k/items/1377d1a57075fdbc238d


こんな画面になって下の方に関数コードを入力できるのでようやくLambda_Functionにコードを入力するところことまで到達。

ここの ACCESSTOKENCHANNEL_ID は変更する必要があるが後々説明。
一番右上の保存ボタンをクリックして保存をしたら次はAPI Gateway!

https://nmmmk.hatenablog.com/entry/2018/10/10/001548

この記事を参考にしながら
上の方に戻り トリガーを追加 を選択。
トリガー設定画面で API Gateway新規APIの作成 選択。
Choose a template はHTTP APIがBetaって書かれてるしいろいろLambda+API
Gateway関連の記事調べてもHTTP API使ってるのは見かけないのでREST APIを選択。セキュリティは正直わからなくて一度400エラーとかでたので念のためオープンにしました。

追加の設定を開くとAPI名は [Lmabda関数名-API] になってるはず。変更したかった変更。
デプロイされるステージは default のままでいいだろうけどなんとなく prod に変更しました。お好きにどうぞ。

必要な箇所を全て変更したら一番右下の追加をクリック。API Gatewayがトリガーに追加されているはずです。
忘れずに右上の保存をクリックして保存しておいてください。

API Gatewayの設定をするのでトリガーのAPI Gatewayを選択→ 下に表示される自分が作成したAPIをクリックしてGatewayの設定画面を開きます。

アクションからメソッドの作成やら統合リクエストの設定やらいろいろ書かれてる記事も拝見ましたが自分の成功談だとAPIのデプロイしましょう。デプロイするステージは自分が作ったステージを選択。(もしこの設定がまずかったら教えてください。)

左のサイドメニューからステージ画面に移ってステージの POST を選択すると
Slash Commandsに入力する

Request URL: 後ほど作るLambdaのAPI Gateway

が表示されるのでこれをコピっておきます。自分が作成したSlackアプリ設定画面に戻ってRequest URLに貼り付け→保存!

requests入りのレイヤー

ここまでしてもSlack上でアプリの表示はされますが動かないので最初の記事に書かれていた唯一の注意点、

唯一の注意点としては、BotからSlack APIを叩くために、requestsモジュールを使えるようにしたいです。Lambda Layerを使ってrequests入りのレイヤーを作っておきましょう。

requests入りのレイヤーを用意しておきます。
…注意点…requests入りのレイヤーの用意…これで説明終わり…がんばって調べよう…

…「Lambba」「レイヤー」「request」っと…カチカチッ

https://dev.classmethod.jp/cloud/aws/lambda-layer-first-action/
https://qiita.com/t_okkan/items/394a15577bd1aad46ec3

要はrequests.zipを自分のPCで作成してアップロードする必要があると判明。
上の記事を参考に

$ mkdir python
$ pip install -t ./python requests
$ zip -r requests.zip python

を自分のPCのターミナルで入力。
自分のPCの場合Pythonのバージョンが古く

pip install -t ./python requests

のpipコマンドが使えなかったのでPythonを一度バージョンアップしてから requests.zip を作成することになりました。

pythonのバージョンアップ

https://www.sejuku.net/blog/50417
https://note.nkmk.me/python-requests-usage/
https://prog-8.com/docs/python-env

これらの記事を見てPythonのバージョンアップをして requests.zip を作成します。

https://prog-8.com/docs/python-env

この記事通りにPythonのバージョン確認→Homebrew→pyenvのインストール→Pythonのバージョンアップ

$ pip install -t ./python requests
$ zip -r requests.zip python

のコマンドをターミナルで入力してrequests.zipを作成!


LambdaのコンソールのサイドメニューからLayersのページに移ってレイヤーの作成をクリック。

レイヤーの作成ページで先ほど作ったrequests.zipをアップロードする。
レイヤーの名前は自分がわかりやすい名称をつけてもいいが、気を付けたいのは互換性のあるランタイムをしっかり設定する。
(自分は最初ランタイムの設定をせずに作成してこの後関数にレイヤーを追加できず困ることに…)

作成した関数のページからレイヤーを選択してレイヤーの追加。
関数に先ほどアップしたレイヤーを選択して追加!


きっと作成したLambda関数画面が関数、API Gateway、Layersが追加されこんな風になってるはずです。
忘れずに右上の保存を押しておきましょう

ACCESSTOKENとCHANNEL_ID

ここでそろそろSLackのアプリ画面に戻ります。

アクセストークン

最初の

Permissions
Scopes
chat:write:bot: On
commands: On

OAuth & Permissions のページの Scopes を設定すると一番上の
OAuth Tokens & Redirect URLs のグレーアウトしていたボタンが緑色になってアクセストークンを作成することができるようになります。

アクセス許可をしてアクセストークンをコピー、作成したLambda関数の ACCESSTOKEN 箇所と置き換えます。

チャンネルID

https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08

こちらを参考に匿名投稿が投稿されるチャンネルのリンクをコピーして
コピーしたURL https://〜〜〜.slack.com/archives/〇〇〇〇〇〇 の後ろの〇〇〇〇〇〇の文字列部分をコピーして作成したLambda関数の CHANNEL_ID 箇所と置き換えます。

動作確認

この時点で書かれてるとおりのことを書いたので
最もシンプルなバージョンは動くはず。
カタッ!

※Advent Calendarの12月6日用の記事なので一度ここで終わります。
随時追記予定