Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWSのサービスを活用してSlackのやりとりを分析してみよう

TomoyaIwata
November 07, 2019

 AWSのサービスを活用してSlackのやりとりを分析してみよう

2019/11/07に開催されたTiny Spec Osaka: Slack developers Osaka kickoffでLTさせて頂いた際の資料です

TomoyaIwata

November 07, 2019
Tweet

More Decks by TomoyaIwata

Other Decks in Technology

Transcript

  1. AWSのサービスを活⽤して
    Slackのやりとりを分析してみよう
    クラスメソッド株式会社
    岩⽥ 智哉
    1

    View Slide

  2. スライドは後で⼊⼿することが出来ますので
    発表中の内容をメモする必要はありません。
    写真撮影をする場合は
    フラッシュ・シャッター⾳が出ないようにご配慮ください
    Attention

    View Slide

  3. 3
    ⾃⼰紹介
    lクラスメソッド株式会社
    l⼤阪オフィス所属
    lサーバーレス開発部 改め CX事業本部
    l好きなAWSサービス: AWS Lambda
    岩⽥ 智哉

    View Slide

  4. 4
    クラスメソッドとSlack

    View Slide

  5. 5
    クラスメソッドとSlack
    • 2019年1⽉からチャットツールをSlackへ段階移⾏
    • 2019年7⽉完全移⾏完了
    • 1,000以上のパブリックチャンネルが存在
    • カスタム絵⽂字4,000オーバー

    View Slide

  6. 6
    APIを活⽤して業務を効率化したり、、、

    View Slide

  7. 7
    ただただ技術の無駄遣いをしてみたり

    View Slide

  8. 8
    カスタム絵⽂字とリアクションの利⽤が活発

    View Slide

  9. 9
    AWSのサービスを活⽤した
    リアクションの分析事例に
    ついてご紹介します

    View Slide

  10. 10
    利⽤するAWSサービス
    実質無限にスケールアップ可能なオブジェクトストレージ
    Amazon S3
    AWS Lambda
    AWS上で発⽣したイベントをトリガーにユーザーが作成した関数が実⾏できるサービス
    いわゆるFaaS(Function As a Service)
    Amazon Athena
    SQLを使ってS3上のデータを分析できるサービス
    Amazon CloudWatch
    モニタリング⽤のサービス
    ログ、メトリクス、イベントという形式でモニタリングデータを収集できる

    View Slide

  11. 11
    利⽤するAWSサービス
    AWS Glue
    ETL⽤のマネージドサービス
    分析⽤データの準備やロードが簡単に⾏える
    Amazon Neptune
    フルマネージドなグラフ型データベースサービス
    AmazonEC2
    仮想サーバーを提供するサービス

    View Slide

  12. 12
    分析対象︓#misc-osaka
    • ⼤阪オフィス雑談部屋
    • 参加⼈数80名
    • (純粋な⼤阪オフィス所属メンバーは約30名)
    • Publicチャンネルで1,2を争う投稿数の多さ

    View Slide

  13. 13
    データ収集
    ②SlackのAPIをコール
    users.list
    channels.history
    ③レスポンスを成形
    してS3に保存
    ①時間ベースのイベントで1⽇1回
    Lambda Functionを起動

    View Slide

  14. 14
    channels.historyのレスポンス
    {
    "client_msg_id": "8f1bd7ee-93e3-472b-8705-02fb09c305b2",
    "type": "message",
    "text": "10⽉初の:coffee::douzo:",
    "user": ”XXXXXXXX",
    "ts": "1569889373.419300",
    "team": ”XXXXXXXX",
    "reactions": [
    {
    "name": "arigato",
    "users": [
    "UEMTXXXXX",
    "UFBUXXXXX",
    "UB2EXXXXX",
    "UF73XXXXX",
    "UFABXXXXX"
    ],
    "count": 5
    }
    ]
    }
    client_msg_idがいかにもキー項⽬っぽいが、
    ⼊っていないこともある
    キーとして使⽤するならts

    View Slide

  15. 15
    レスポンスを整形
    {"client_msg_id": "1CC9C859-8A7D-4F67-BD8F-11558881907C", "type": "message", "text": "なるほどです︕...
    {"client_msg_id": "C547B3A0-942E-4891-8C2C-D619AC64507C", "type": "message", "text": "いえいえ︕...
    {"client_msg_id": "FB645242-E8AD-4F35-BBDC-F97DC9114322", "type": "message", "text": "@ひできさん¥...
    {"client_msg_id": "8f7a8f25-c3b7-4598-802a-5cedee816841", "type": "message", "text": "HIGOBASHI.AWSは...
    {"client_msg_id": "AABB8B75-7044-4BB7-8264-63DC83DFECF4", "type": "message", "text": "あーなるほど︕¥n...
    • Lambdaで1⾏1Jsonになるように整形
    • 整形したらS3にアップロード

    View Slide

  16. 16
    Amazon Athenaによる
    分析例

    View Slide

  17. 17
    Athenaによる分析の構成
    ① GlueでS3をクローリングし、データ構造を解析
    ③AthenaからSQL
    を使って分析
    ②Glueのデータカタログと連携

    View Slide

  18. 18
    Glueによるクローリング
    収集したJSONファイルをGlueでクローリング
    データの構造を解析

    View Slide

  19. 19
    Glueによるクローリング
    クロールが完了するとAthenaから「テーブル」
    として参照可能に

    View Slide

  20. 20
    Athenaによる分析
    reactionsの型がarrayなので、⾏に展開したい...

    View Slide

  21. 21
    unnestで複数⾏に展開
    unnestとCORSS JOINを使うことで
    1⾏のデータをN (リアクション数)⾏に展開

    View Slide

  22. 22
    unnestで複数⾏に展開
    さらにunnestとCORSS JOINを使うことで
    ユーザー、リアクションごとの⾏データに変換

    View Slide

  23. 23
    ⼈別に使⽤頻度の⾼いリアクションを抽出
    SELECT
    us.real_name, agg.name, agg.rnk, agg.cnt
    FROM
    (SELECT
    react_user_id, name,
    RANK() OVER (PARTITION BY react_user_id ORDER BY cnt DESC) AS rnk,
    cnt
    FROM
    (SELECT
    react_user_id, react.name, COUNT(*) AS cnt
    FROM
    messages
    CROSS JOIN UNNEST(reactions) AS t(react)
    CROSS JOIN UNNEST(react.users) AS t(react_user_id)
    GROUP BY
    react_user_id, react.name
    )
    ) agg
    INNER JOIN users us ON
    agg.react_user_id = us.id
    WHERE
    rnk <= 5
    ORDER BY
    react_user_id, rnk

    View Slide

  24. 24
    ⼈別に使⽤頻度の⾼いリアクションを抽出(結果)
    岩⽥の使⽤頻度の⾼いリアクション
    Oさんの使⽤頻度の⾼いリアクション

    View Slide

  25. 25
    グラフ型データベース
    Amazon Neptuneによる
    分析例

    View Slide

  26. Private subnet
    26
    Neptuneによる分析の構成
    AWS Cloud
    VPC
    Public subnet
    ①S3からNeptuneに⼀括ロード
    ※事前に所定フォーマットの
    CSVに変換する必要あり
    ②Gremlin Consoleから
    クエリを発⾏

    View Slide

  27. 27
    モデリング

    View Slide

  28. 28
    完成したモデル
    user post
    user
    user
    name:iwata
    text:
    :coffee:ドリップ開始
    post
    react
    react
    name:xxx
    name:yyy
    name:arigato
    name:kansya

    View Slide

  29. 29
    分析対象
    岩⽥が登録したカスタム絵⽂字による
    リアクションの使⽤状況

    View Slide

  30. 30
    Amazon Neptuneによるチャットの分析
    :kaiserwave:
    :kaiserwave_rugal:
    :genocide_cutter:

    View Slide

  31. 31
    Amazon Neptuneによるチャットの分析
    あるユーザーが
    ポストした投稿に
    :kaiserwave:でリアクションしたユーザー
    がポストした投稿に
    :kaiserwave:でリアクション...

    View Slide

  32. 32
    Amazon Neptuneによるチャットの分析
    :kaiserwave:が
    N連鎖する経路を求める

    View Slide

  33. 33
    kaiserwaveが1連鎖する経路
    g.V().repeat(out('post')¥
    .inE().has('name','kaiserwave')¥
    .outV().dedup()).times(1).path()
    経路数:15

    View Slide

  34. 34
    kaiserwaveが2連鎖する経路
    g.V().repeat(out('post')¥
    .inE().has('name','kaiserwave')¥
    .outV().dedup()).times(2).path()
    経路数:7

    View Slide

  35. 35
    kaiserwaveが3連鎖する経路
    g.V().repeat(out('post')¥
    .inE().has('name','kaiserwave')¥
    .outV().dedup()).times(3).path()
    経路数:9

    View Slide

  36. 36
    kaiserwaveが3連鎖する経路
    kaiserwave
    ※投稿のノードは表⽰を省略
    kaiserwave
    kaiserwave
    kaiserwave kaiserwave
    kaiserwave
    kaiserwave
    kaiserwave
    kaiserwave
    kaiserwave
    森岡
    kaiserwave
    kaiserwave
    kaiserwave

    View Slide

  37. 37
    まとめ

    View Slide

  38. 38
    まとめ
    • AWSのサービスを利⽤することで、Slack上のやり取りを
    様々な切り⼝から分析することができる
    • Slackのやり取りを分析することで、新たな発⾒があった
    り無かったり...
    • Slackのやり取りを分析するのは楽しい︕︕

    View Slide

  39. 39
    是⾮AWSのサービスで
    遊んでみて下さい︕︕
    まとめ

    View Slide

  40. 40
    ご清聴ありがとうございました

    View Slide

  41. 41

    View Slide