Slide 1

Slide 1 text

Discordに流すWebhookを見れる 形で流してみる(Chalice + AWS Lambda + Python) Motoki Hirao

Slide 2

Slide 2 text

自己紹介 ● PyCon JPのスタッフをしていたこともあるPHPer(6月まで前職でPython 書いてました) ● PyCon mini Shizuokaのスタッフとして最後の最後でジョインして少しだ けお手伝いしました ● 業務としてPythonを書くことはなくなりましたが、手になじむので軽いも のを作るときはたまに使っています ● twitter: @__yumechi, Github: yumechi

Slide 3

Slide 3 text

私と静岡 6年ほど浜松におりました さわやかのハンバーグと ラーメン三太(細麺の方) によく行ってました

Slide 4

Slide 4 text

今回の目的 ● Discord に backlog, Kibela の更新情報を流したい…! ● 前提 ○ プライベートプロジェクトで作業している ○ チケット管理Backlog, 議事録やアイディアをKibela ○ コミュニケーションは Discord

Slide 5

Slide 5 text

今回の問題点 単純に下記のアーキテクチャでは動かないこと…!

Slide 6

Slide 6 text

今回の問題点 単純に下記のアーキテクチャでは動かないこと…! Discordに投げられる 形式ではないので、 うまく連動できない

Slide 7

Slide 7 text

※Slackの場合

Slide 8

Slide 8 text

困ったがこの構成にする

Slide 9

Slide 9 text

ここで AWS Lambda と API Gateway を使って 簡単にAPIを立てるには…?

Slide 10

Slide 10 text

そう、Chaliceを使う https://github.com/aws/chalice

Slide 11

Slide 11 text

Chaliceとはなに? ● Lambda と API Gateway をささっと作れる serverless framework ● Pythonで書くことができる ● 今回は使わないが、S3イベントやSNS、SQS向けにも使うことができる ● ローカルでデバッグできる!!!!!!!! ○ 動くだけのものをここに置いてみた ○ https://github.com/yumechi/hello-world-chalice

Slide 12

Slide 12 text

最小構成

Slide 13

Slide 13 text

これをちょっと作りこんで 各サイトのWebHookとして 設定すればOK ※ただしテスト送信には要注意

Slide 14

Slide 14 text

大きなプログラムにしたとき ● 分けたいという欲求が生まれる ○ 今回ならWebHookとして送られてくるサービスごとに分けて作りたい ○ 受信してパースする部分は別の作りにしたい ○ const に分けたい ● しかし…

Slide 15

Slide 15 text

ハマりポイント: 特定のディレクトリ配下に 入れないといけない

Slide 16

Slide 16 text

引用:https://aws.github.io/chalice/topics/multifile.html

Slide 17

Slide 17 text

なのでこういう構成になる 引用: https://github.com/yumechi/make-something-webhook

Slide 18

Slide 18 text

なんやかんやあって完成する ● ステージ環境と本番環境を分ける作りにして、環境変数を kamidana で 入れるようにしている ○ jinja を cli で使えるツール https://github.com/podhmo/kamidana ○ 本当はもっと方法ありそうな気もする … ● 表示のイメージはSlackに流れているものを見つつ、Discord Webhook の使い方ページを見ながら合わせる ○ Slackの連動のほうが簡単なので、完成イメージがつく ○ https://birdie0.github.io/discord-webhooks-guide/

Slide 19

Slide 19 text

まとめ ● Chalice便利です ○ こういう小技みたいなWebHookをプロキシするものとか作るのにはちょうどよさそう ● Pythonのライブラリや通信も使えるのが大きい ○ 今回はお馴染みの requests を使った ○ データの置き場とか工夫すれば、定期的に実行した結果を保存しておいたものを可視 化して分析、みたいなこともできそう ○ そしてその手のツールが揃っている Python の得意分野なのでは?

Slide 20

Slide 20 text

ここから先は 補足資料です

Slide 21

Slide 21 text

Tips: テスト送信のデバッグ ● Backlogもkibelaもテスト送信をクリアして初めてWebhook連動できる ● ただしテスト送信でどういう構造のデータで、どういう値のデータが来る のかわからない ○ (ドキュメントを漁ったけど、結局自分は発見できなかった) ● 解決方法としてログ出力して中身を合わせる ○ ログ出力は単純にprintを使うだけでOK ○ あとは CloudWatch を見に行く

Slide 22

Slide 22 text

Tips: 送信デザインを合わせる ● Slackに連動しているものがあるので今回はそれに合わせてみた ↑Slack ↓Discord

Slide 23

Slide 23 text

Tips: DiscordのWebhookを使った投稿 ● 困ったら紹介しているリンクを見てください ○ https://birdie0.github.io/discord-webhooks-guide/ ○ これがマジで便利 ● 中身のコンテンツは大体 embeds に入れる形 ○ 下の方に出ているもろもろは base["embeds"][0]["fields"] = fields みたいに入れる ○ 構造がかなりわかりづらいので慣れないと難しい