Help us understand the problem. What is going on with this article?

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

はじめに

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

きっかけ

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

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

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

botの作成

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

最初の躓き(Lambdaの準備)

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

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

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

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

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

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

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

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

image.png
こんな画面になって下の方に関数コードを入力できるのでようやくLambda_Functionにコードを入力するところことまで到達。
image.png
ここの 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エラーとかでたので念のためオープンにしました。
image.png
追加の設定を開くとAPI名は [Lmabda関数名-API] になってるはず。変更したかった変更。
デプロイされるステージは default のままでいいだろうけどなんとなく prod に変更しました。お好きにどうぞ。
image.png
必要な箇所を全て変更したら一番右下の追加をクリック。API Gatewayがトリガーに追加されているはずです。
忘れずに右上の保存をクリックして保存しておいてください。
image.png

API Gatewayの設定をするのでトリガーのAPI Gatewayを選択→ 下に表示される自分が作成したAPIをクリックしてGatewayの設定画面を開きます。
image.png
アクションからメソッドの作成やら統合リクエストの設定やらいろいろ書かれてる記事も拝見ましたが自分の成功談だとAPIのデプロイしましょう。デプロイするステージは自分が作ったステージを選択。(もしこの設定がまずかったら教えてください。)
image.png
左のサイドメニューからステージ画面に移ってステージの POST を選択すると
Slash Commandsに入力する

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

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

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を作成!

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

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

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

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

ACCESSTOKENとCHANNEL_ID

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

アクセストークン

最初の

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

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

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

チャンネルID

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

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

動作確認

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away