Interactive Messageを使ったSlackBotをAWSに移行してみた

Shuji Ohira
inet-lab
Published in
Oct 14, 2021

研究室用Slackで用いている研究室の掃除当番を決定/通知するボットを学内サーバ(オンプレ)で運用していました.しかし,毎年学内で停電作業があるためその度にボット用サーバを停止する作業を人手で行ったり,セキュリティアップデートを逐一適用したりと運用面で課題がありました.そこで,今回はこのボットをAWSを用いて完全にサーバーレスアーキテクチャで構築したので,その手順をまとめています.

実装したSlackBot用アーキテクチャ

ボットの作成
本記事では,Slack側のボットの作成方法については述べませんが,ボットの作成方法は https://qiita.com/ref3000/items/83b36541f61e334b542e が参考になると思います.この記事内のpost_sample.jsが上記アーキテクチャでいうpost.js(毎週月曜12:00に掃除当番を通知するjs)に対応しており,receive_sample.jsがbutton.jsに対応しています.

AWS EventBridge \Lambda \S3 の設定
以下に示す画像のように,研究室内で運用しているボットは毎週月曜12:00に掃除当番をSlackに通知します.また,掃除当番は掃除を終えた後SlackBotによって通知されたメッセージにあるボタンを押し掃除したことを研究室メンバーに周知します.

おそうじうながしロボのアイコンは各年の象徴的な人物等を用いています.(今年はCOVID-19,去年は菅総理)

ここでは,まず毎週月曜12:00に掃除当番通知機能を実装していきます.用いるサービスは,AWS EventBridge, Lambda, S3です.

まずはLambdaを設定していきます.AWSマネジメントコンソールにログインした後,サービス一覧からLambdaのページに飛びます.Lambdaのページの`関数の作成`を押し,`一から作成``関数名(例:cleaningbot-post)``Node.js 14.x`を選択し`関数の作成`を押します.これで,1つ目のLambdaは作成完了です.

次に,`+ トリガーを追加`を押し,Lambdaのトリガーを設定します.Lambdaには毎週月曜12:00にSlackに通知して欲しいので,定期実行可能なEventBridgeを設定します.ルールは`新規ルールの作成`を選択しルール名を入力します.ルールタイプには`スケジュール式`を選択し,スケジュール式として`cron(0 3 ? * MON *)`という文字列を入力します.これで毎週月曜日にLambdaが起動されるようになります.

今回デプロイしたいボットは,前の週の掃除係に基づいて次の週の掃除係を決定するようなコードになっています.言い換えると,Lambdaが状態(ステート)に依存して通知するコンテンツを変更すると言えます.したがって,「前の週の掃除係」をどうやって保存し,Lambdaで引っ張ってくるかが問題となります.今回は「前の週の掃除係」をS3に保存する方法で解決しました(他の方法としてLambdaの一時的な512MBのデータ領域を使うことも考えられますが今回はS3とLambda連携を勉強したかったのでやめました).

ですので,次にLambdaとS3を連携する上で必要となるIAMロールの設定とバケットポリシーについて述べます.まずは,LambdaのIAMロールに新たにS3に対するポリシーを追加していきます.IAMを変更するため,AWSマネジメントコンソールのIAMページに行きます.IAMのページにある`アクセス管理``ロール``cleaningbot-post-role-XXXXXXX`(Lambdaのロール)を選択します.次に,遷移したページで`ポリシーをアタッチ``ポリシーを作成``JSONタブ`を選択します.ここで,JSON形式でポリシーを記述できるため,以下のポリシーを記述してください.

//LambdaのS3に対するReadWriteを許可するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::cleaningbot-backet/*"
]
}
]
}

この後,ポリシーの名前を入力し,`ポリシーの作成`を押せば終了です.

AWS API Gateway\Lambda の設定
次に,掃除終了周知ボタン機能をAPI GatewayとLambdaを使って実装していきます.先ほどLambdaを作成した同様の手順でLambdaを新たに作成します.同様にトリガを設定しますが,ここではAPI Gatewayをトリガにします.トリガの設定で,新しいAPIを作成するため`APIを作成する`を選択し,APIタイプは`REST API`,セキュリティは`オープン`を設定します(Slack側からアクセスするためオープンにしてます).これらを設定したら`追加`を選択します.これで,API Gatewayが作成でき,APIにアクセスするためのエンドポイント(例:https://xxxxxxxxx.execute-api.[region].amazonaws.com/default/cleaningbot-button)が生成されたので,SlackBotのInteractive Message設定ページでこのエンドポイントを設定します.これで,全体のアーキテクチャの実装は完了です.

終わりに
今回はInteractive Messageを使ったSlackBotをAWSに移行する記事を書きました.また,AWSの使用料金をSlack Channelに通知するAmazon SNSも合わせて用いれば料金面も考慮しつつ運用していけると思います(今回のアーキテクチャだと月100円もかからない気がしますが).

参考文献
1. “Node.jsを使ってLambdaでS3のファイルのRead/Write,” https://nkgr.hatenablog.com/entry/2018/06/26/220000

--

--