Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

4 クラスメソッドとSlack

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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にアップロード

Slide 16

Slide 16 text

16 Amazon Athenaによる 分析例

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

27 モデリング

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

37 まとめ

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

41