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

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

119659c28d16f22d01eb48a6f3ee1391?s=47 TomoyaIwata
November 07, 2019

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

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

119659c28d16f22d01eb48a6f3ee1391?s=128

TomoyaIwata

November 07, 2019
Tweet

Transcript

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

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

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

    岩⽥ 智哉
  4. 4 クラスメソッドとSlack

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

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

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

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

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

  10. 10 利⽤するAWSサービス 実質無限にスケールアップ可能なオブジェクトストレージ Amazon S3 AWS Lambda AWS上で発⽣したイベントをトリガーにユーザーが作成した関数が実⾏できるサービス いわゆるFaaS(Function As

    a Service) Amazon Athena SQLを使ってS3上のデータを分析できるサービス Amazon CloudWatch モニタリング⽤のサービス ログ、メトリクス、イベントという形式でモニタリングデータを収集できる
  11. 11 利⽤するAWSサービス AWS Glue ETL⽤のマネージドサービス 分析⽤データの準備やロードが簡単に⾏える Amazon Neptune フルマネージドなグラフ型データベースサービス AmazonEC2

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

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

  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
  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にアップロード
  16. 16 Amazon Athenaによる 分析例

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

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

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

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

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

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

  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
  24. 24 ⼈別に使⽤頻度の⾼いリアクションを抽出(結果) 岩⽥の使⽤頻度の⾼いリアクション Oさんの使⽤頻度の⾼いリアクション

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

  26. Private subnet 26 Neptuneによる分析の構成 AWS Cloud VPC Public subnet ①S3からNeptuneに⼀括ロード

    ※事前に所定フォーマットの CSVに変換する必要あり ②Gremlin Consoleから クエリを発⾏
  27. 27 モデリング

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

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

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

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

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

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

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

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

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

    kaiserwave kaiserwave kaiserwave 森岡 kaiserwave kaiserwave kaiserwave
  37. 37 まとめ

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

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

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

  41. 41