dely engineering blog

レシピ動画サービス「kurashiru」を運営するdelyのテックブログ

好きな技術を使って作る!くだらないslackBot運用のすゝめ

こんにちは。サーバーサイドエンジニア兼、新米slackBot整備士のjoe (@joooee0000) です。 本記事はdely Advent Calendar 2018の11日目の記事です。

Qiita: https://qiita.com/advent-calendar/2018/dely
Adventar: https://adventar.org/calendars/3535

前日は、iOSデザインエンジニアの John が という記事でXcodeのDebugging View Hierarchiesの紹介をしました!

はじめに

皆さんは、触ったことのない技術をプライベートで触ってみたいけど、結局なにを作ろう。と悩んだ結果座学のみになってしまった経験はありませんか?

f:id:joe0000:20181211120039p:plain

そんな方がいたら、くだらないslackBotを作って運用をしてみることをおすすめします!

最近、哲学研究会(怪しげ)という社内クラブのslackチャンネルで哲学slackBotの運用をはじめました。 数百種類の哲学名言の中から毎日ランダムで1件名言を呟いてくれるslackBotです。

f:id:joe0000:20181211123808p:plain

そのslackBot活動がとても良い勉強になったので、このAdventCalendarではくだらないslackBotを運用するメリットやオススメのslackBotの始め方を紹介します。

また、実際に得たslackBotに関する知見や具体的な実装方法について、次回のdely Advent Calendar 2018の19日目に、サーバーレス+Go言語で作るインタラクティブな哲学slackBot というタイトルで公開します。

くだらないslackBotを運用するとなにがいいのか

(以下、slackBotのことをBotと呼ばせていただきます。)

くだらないBotを運用する一番のメリットは、楽しく技術の勉強ができるという点です。

  • 失敗をおそれず色々な技術を試せる
  • 工夫次第でどんな技術でも自由に取り入れられる
  • 得た知見を業務に役立てられる
  • 車輪の再開発/overkillが気にならない
  • フロント側のコードを書かなくても目に見える楽しいアウトプットがある

中でも、

  • 楽しいアウトプットがある

ここはモチベーションを維持する上でとても大事です。

特に、ミドルウェアやサーバー周りを触ってみたい場合は、使いたい技術は決まっていても目的(アウトプット)を考えるところに時間がかかってしまうことがあります。Botを作るという目的を決めることで、先に進みやすくなることもいいところです。

また、

  • 工夫次第でどんな技術でも自由に取り入れられる

という点もあります。

slackは、slack上で発生したユーザーの様々なアクティビティを、自分で作成したWebAPIサーバー(以降、APIサーバー)に送信することができます。つまり、自分で作成したAPIサーバーに届いたあとはどんな処理をすることも可能です。そして、処理の結果をslackに反映させることができます。自前のAPIサーバーで行う処理を拡張することで、いかようにも自分の好きな技術を取り入れることができます。

f:id:joe0000:20181211120401p:plain

その例として、普段はRailsを書いている私ですが、インタラクティブな哲学Botを作ることで下記の技術に触れることができました。

  • Go言語
    • (slackBotのメイン処理記述)
  • クローラ(python)
    • (哲学名言の収集)
  • AWS SAM (LambdaやAPI Gatewayを簡単に構築するためのフレームワーク)
    • AWS Lambda
      • (slackBotの本体処理実行)
    • AWS API Gateway
      • (slackのInteractive機能のWebAPI作成)
    • AWS CloudWatch
      • (Lambda定期実行のイベント)
  • AWS IAM Role
    • (AWS SAMを使うためのユーザー権限付与)
  • AWS DynamoDB
    • (哲学名言を保持するためのストレージ)
  • slackAPI
    • (slackとのやりとり)

こちらが上記を使ってつくった、実際に私が運用している哲学Botです。 1日に1回哲学者の数百種類の名言の中からランダムでつぶやいてくれます。さらに、ポストされた哲学に対してメンバーが名言を評価できるボタンをおいていて、その結果をDynamoDBに記録しています。
(この日の哲学は高評価)

f:id:joe0000:20181211120857p:plain

機能はまだこれだけなのですが、APIサーバーを用意する部分や、DynamoDBからランダムに値を取得して定期的にメッセージをPOSTする部分だけで、色々な技術に触れることができました。

また、今回はAWSのサーバーレスの機能やGo言語を中心に触ってみたかったのでこちらの構成になりましたが、GCPを使っている方だったらGCPを、自前でサーバーを立てて運用してみたい方だったら自前サーバーを、GoではなくNode.jsをやりたい方はNode.jsを、と、柔軟に触ってみたい技術を取り入れることができます。

Bot運用を始めてみる

Bot運用を始めるのにおすすめの手順を書いていきます。

1. やりたいことを決める

まずはどういうBotを作るか決めます。ここが一番楽しい部分と思う方もいるかもしれません。 一方で、ここがどうしても思いつかない方もいると思います。そんな方は、なんでもいいので単純なBotを作ることから初めてみるのがいいと思います。

例えば、毎日決まった時間に「ばなな」と呟くBotを作るとします。これだけでも、上記でいうところの

  • AWS SAM
    • AWS Lambda
    • AWS CloudWatch
  • AWS IAM Role
  • Go言語
  • slackAPI

に触れることができます。
(Lambdaを定期実行にしてslackAPIを叩いてメッセージをPOSTするように作るとこれらが使えます。)

f:id:joe0000:20181211121015p:plain

最初はミニマムではじめても、そこからいくらでも拡張していくことができます。 例えば、これにプラスしてゴリラの画像をクロールしてS3に保存し、決まった時間に画像をPOSTしてくれるようにするだけで「ばなな」をつぶやくだけのBotから、

  • クローラー
  • AWS S3

を使って開発することができます。 さらに、ゴリラの画像のイケテる度合いを5段階で評価できるボタンをつけて、週末には週間イケてるゴリラランキングを出す拡張をするとしたら上記の技術に加えて、例えば下記のような技術をつかえるようになります。

  • AWS API Gateway
  • AWS DynamoDB
  • slackのInteractive機能

さらに、インプットされた顔写真に対して一番近いゴリラの画像を返すようにしたら機械学習を使うこともできますし、処理に時間がかかる場合はAWS SQSなどの非同期処理も導入できるかもしれません。(そこまでしたらすごい)

このように、ミニマムで作ったところから機能を拡張していくことでいかようにも触れる技術を増やすことができるため、最初に作るものを考え過ぎないようにするといいと思います。 最初は「ばなな」と定期的に呟いておかしな人だと思われても、ここまですれば周りの人々が徐々に興味を持ってくれるかもしれません。 なので、なにも思いつかない人は、なんでもいいのでとにかく始めてみてはいかがでしょうか!
(よろしければ「ばなな」のアイデアをお譲りします)

2. slackのアプリを作成する

次に、slackのアプリを登録します。

slackには一般公開のアプリと特定のワークスペースに閉じたアプリを作ることができ、後者であれば手順としても、精神的にも気軽に作成できます。

定期的に「ばなな」と呟くだけのBotであればIncomingWebhooksで十分で、もっと言えばリマインダー機能があれば十分なのですが、今回のような目的の場合拡張性があったほうがよいため、最初からアプリにしておくことをオススメします。

アプリにしておくことで、ボタンをつけたり、slack上で起きた特定のアクションをhookできたり、できることの選択肢がグッと広がります。

アプリを作成する手順は下記です。

1. こちら から CreateNewApp ボタンを押す

2. アプリの名前とアプリを所属させるワークスペースを選択

3. やりたいことに必要な機能の選択

f:id:joe0000:20181211121116p:plain

Incoming Webhooks :

おなじみの機能ですが、特定のチャンネルに対してURLが発行され、URLにPOSTリクエストを送ることによってチャンネルにメッセージをポストする機能です。メッセージの送信しかできません。

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/DUMMY/DUMMY/DUMMYDUMMY

slackAPIにもメッセージをチャンネルにPOSTする機能が存在するので、slackAPIを使う場合はこちらの機能はoffで大丈夫です。拡張性を考えると、IncomingWebhookは投稿しかできないのでslackAPIを使うことをおすすめします。

InteractiveComponents:

ボタンやプルダウンメニューなどのインタラクティブな機能を使うためのものなので、自分で用意したAPIサーバーのエンドポイントを登録する必要があります。

ボタンを押したタイミングで指定したエンドポイントにPOSTリクエストを飛ばしてくれます。その内容をみて、あらゆる自由な動作を自分のサーバーで行うことができます。
(アプリを作成した時点でAPIサーバーをまだ作ってなかったのでこの時点ではダミーのURLを設定しました。あとから変えられます。)

ボタンは こんな感じの機能です。

f:id:joe0000:20181211121305g:plain

また、ボタンやプルダウンの他に、Actionを設定してメッセージに対して特定の動作を紐づけることもできます。

f:id:joe0000:20181211121335p:plain

EventSubscriptions:

特定のslack上のアクティビティを検知して、こちらが作成したAPIサーバーにリクエストを送ってくれる仕組みです。なので、InteractiveComponentsと同様に自分で用意したAPIサーバーのエンドポイントを登録する必要があります。

こちらは、アクティビティの結果を指定したAPIサーバーに送信してくれるだけの機能です。アクティビティのPOSTリクエストを受け取ってから、slackにメッセージを送信するなど他のslackのタスクを実行したい場合は slackAPIを使う必要があります。

hookできるslack上のイベントも、様々なものが存在しています。

f:id:joe0000:20181211124456p:plain

Permissions:

こちらの項目では、作成したアプリで、先ほどから連呼しているslackAPIを叩くための権限管理(Scopeの設定)をします。

様々な動作を許可するScopeが存在しているので、適宜必要になるものを選びます。こちらを適切に選択できていないと、やらせたい動作に紐づくslackAPIを叩いた時にScopeエラーがでます。

1つ以上のScopeを設定すると、Scopeの設定と同じ画面にあるアプリをワークスペースにインストールするための Install App to Workspace ボタンがEnableになります。

(1つ追加してボタンがEnableになれば、Scopeは後から追加することもできるのでとりあえず1つScopeを追加しましょう。)

f:id:joe0000:20181211121457p:plain

4. アプリをワークスペースにインストール

3の Permissions の工程でEnableになった Install App to Workspace ボタンを押すと、slackAPIとやりとりする用のOAuthAccessTokenが発行され、晴れてslackAPIが使えるようになります。

f:id:joe0000:20181211121559p:plain

5. 機能実装に必要なToken周りの値を確認する

一番重要なのは下記の2つです。

slackAPIを使う場合

  • OAuth Access Token
    • slackAPIを利用するために使うToken
    • OAuth & Permissionsの項目で参照

InteractiveComponentsやEventSubscriptionsを使う場合

  • Verification Token
    • slackアプリでインタラクティブなアクションが行われた際、自分のslackがAPIサーバーに飛ばすリクエストにくっついてくる認証Token
    • (これがついているリクエスト以外は弾くように実装する)
    • アプリページのBasicInformationにあるAppCredentialsの項目で参照

6. (EventSubscriptionsを使う場合): APIエンドポイント認証処理

EventSubscriptionsを使う場合、設定したAPIサーバーのエンドポイントに対し、slack側が正当性の検証を行います。

こちら に記述してあるやり方で所定の形式のJSONがslackからPOSTされるので、それに対して適した内容をレスポンスすることで検証を完了することができます。

7. 完了!!

以上で、アプリの作成はOKです。 slackAPIを使って好きなことができるようになります!

3. 好きな技術を選択し、機能実装を開始する

どの技術を使うかは、やりたいことによって変化しますし、無数の選択肢が存在しています。 今一番興味がある技術を選んでBot作成のモチベーションをあげてください。

使いたい技術が明確にある方は、Bot運用を開始する手順の1で好きな技術ベースでどのようなBotを作るかを考えるというのも選択肢の一つだと思います。

まとめ

slackBotを運用することで、好きな技術の勉強を楽しく行うことができるようになります。 その最初に、まずは拡張性の高いslackのアプリを作成してみるのはいかがでしょうか!

f:id:joe0000:20181211121702p:plain

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

次回予告

明日は、delyのWebディレクター/SEO担当のinter_net_ghostによる「kurashiruが取り組むSEOのはなし」です。お楽しみに!

また、dely Advent Calendar 2018の19日目で実際に運用している哲学Botの具体的な実装について紹介します。

dely Advent Calendar 2018 - Qiita