SlackにAWSとPythonを使って簡単なアプリを作る記録

このサイトのやり方でアプリを作る

qiita.com

Slackで新規にアプリとボットユーザを作成する

  1. 「Create New App」ボタンから新規アプリを作成する。
  2. サイドメニューの[Bot Users]から新規ボットユーザを作成する。

AWSでLambda関数からCloudWatchにデバッグ用のログを出力するためのIAMロールを追加する

  1. f:id:ponsuke_tarou:20190507135118p:plain
    [IAM]画面を開く。
  2. f:id:ponsuke_tarou:20190507135340p:plain
    サイドメニューの[Role]を選択して[Create role]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507135531p:plain
    [AWS service]の[Lambda]を選択し、画面下の[Next: Permissions]ボタンを押下する。
  4. f:id:ponsuke_tarou:20190507135836p:plain
    [AWSLambdaBasicExecutionRole]を選択してロールを追加する。
  5. f:id:ponsuke_tarou:20190507140448p:plain
    Roleが追加される。

AWSでSlack Event APIの認証を行うLambda関数を作成する

  1. f:id:ponsuke_tarou:20190507141038p:plain
    コンソールで[Lambda]を選択する。
  2. f:id:ponsuke_tarou:20190507141332p:plain
    [Create a function]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507141453p:plain
    [Author from scratch]を選択して必要な項目を入力する。
    1. [Runtime]は、「Python 3.6」を選択する。
    2. [Permission]は、[Execution role]で「Use an existing role」を選択して[Existing role]で追加したIAMロールを選択する。
  4. f:id:ponsuke_tarou:20190507143045p:plain
    参考にしているQiitaページに記載されているコードとHandlerを転記して保存する。
    • エンドポイントを認証するためにSlackからリクエストが送られてきた際には、認証をとおすためにchalleng要素をレスポンスする必要がある。そのための処理。

AWSで新規にAPI Gatawayを作成する

Lambda関数を叩くためのエンドポイントとなるAPIを作成する

  1. f:id:ponsuke_tarou:20190507144320p:plain
    コンソールから[API Gateway]を選択する。
  2. f:id:ponsuke_tarou:20190507144525p:plain
    [Get started]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507144602p:plain
    [OK]ボタンを押下する。
  4. f:id:ponsuke_tarou:20190507145026p:plain
    内容を入力してAPIを作成する。

APIにPOSTメソッドを作成する

  1. f:id:ponsuke_tarou:20190507145810p:plain
    POSTメソッドを追加する。

デプロイしてエンドポイントを作成する

  1. f:id:ponsuke_tarou:20190507150340p:plain
    [Action]セレクトから「Deploy API」を選択してデプロイを行う。
  2. 画面上部にエンドポイントとなるURLが表示されます。

テストする

  1. f:id:ponsuke_tarou:20190508125412p:plain
    [Test]リンクを押下します。
  2. f:id:ponsuke_tarou:20190508125617p:plain
    [Test]ボタンを押下します。
  3. f:id:ponsuke_tarou:20190508125841p:plain
    Lambda関数が呼ばれてログが出力されました。
  4. f:id:ponsuke_tarou:20190508130138p:plain
    CloudWatchにもログが出力されました。

Slackで作成したAPIを設定する

  1. サイドメニューの[Event Subscriptions]を選択する。
  2. [Enable Events]を「On」にする。
  3. [Request URL]にエンドポイントとなるURLを入力する。
  4. [Subscribe to Bot Events]に「message.channels」か「message.groups」を追加する。
  5. [Save Changes]ボタンで保存する。

f:id:ponsuke_tarou:20190507151234p:plain

「message.channels」を設定することでボットユーザが参加しているパブリックチャンネルに投稿されたメッセージを取得できる

api.slack.com

「message.groups」を設定することでボットユーザが参加しているプライベートチャネルに投稿されたメッセージを取得できる

api.slack.com

パブリックチャンネルプライベートチャネルかを見分ける簡単な方法

Slackの画面横に表示されているチャネル名の横にあるマークを見るとわかる。

f:id:ponsuke_tarou:20190508152336p:plain
#マーク
f:id:ponsuke_tarou:20190508152400p:plain
鍵マーク
get.slack.help

ボットユーザをワークスペースに追加する

アプリをインストールする

f:id:ponsuke_tarou:20190507151911p:plain
サイドメニューの[Install App]を選択し[Install App to Workspace]ボタンを押下してインストールする。

チャネルにボットを参加させる

f:id:ponsuke_tarou:20190507152311p:plain
Slackの歯車マークから[Add people to チャネル]からボットを追加する。

メッセージをチャネルに投げるとAWSのCloudwatchのLogに内容が出力される

START RequestId: 24..................... Version: $LATEST
[INFO]	2019-05-08T06:11:48.565Z	24......................
{
    "token": "hogehoge",
    "team_id": "hogehoge",
    "api_app_id": "hogehoge",
    "event": {
        "client_msg_id": "hogehoge",
        "type": "message",
        "text": "chanelとgroupの違いがよくわからない",
        "user": "投稿したユーザID",
        "ts": "1557295907.016900",
        "channel": "チャネルID",
        "event_ts": "1557295907.016900",
        "channel_type": "group"
    },
    "type": "event_callback",
    "event_id": "イベントID",
    "event_time": 1557295907,
    "authed_users": [
        "hogehoge"
    ]
}
ログはLambda関数に書いた「logging.info(json.dumps(slack_event))」で出力される

ボットユーザがメッセージを投稿する機能を作る

AWSにOAuth Tokenを設定する環境変数を設定する

Slack APIの画面でOAuth Tokenを確認する
  1. サイドメニューの[OAuth & Permissions]を選択してOAuth Tokenを確認する。
    • OAuth Tokenは、ワークスペースにアプリをインストールした際に生成されている。
Lambda画面でOAuth Tokenを設定する環境変数を設定する
  1. [Lambda]の画面 > サイドメニューの[Functions] > 作成した関数 で関数の画面を開く。
  2. [Environment variables]にKEY「SLACK_APP_AUTH_TOKEN」「SLACK_BOT_USER_ACCESS_TOKEN」を入力して各OAuth Tokenを設定する。
  3. 画面右上の[Save]ボタンで保存する。

Lambd関数を更新する

  1. [Function code]に参考にしているQiitaページに記載されているコードを転記する。
  2. [Save]ボタンで保存する。
メッセージの投稿には、ボットユーザがメッセージを投稿できるchat.postMessageを使用しています。

api.slack.com

メッセージを投稿して動かしてみる

f:id:ponsuke_tarou:20190508154352g:plain
できあがり