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

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

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

PyCon mini Shizuoka (2021/11/20) にLTで発表した内容になります。
This is a lightning talk I gave at PyCon mini Shizuoka on November 20, 2021.

yumechi(Motoki Hirao)

November 20, 2021
Tweet

More Decks by yumechi(Motoki Hirao)

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. ※Slackの場合

    View full-size slide

  8. 困ったがこの構成にする

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 最小構成

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. なんやかんやあって完成する
    ● ステージ環境と本番環境を分ける作りにして、環境変数を kamidana で
    入れるようにしている
    ○ jinja を cli で使えるツール https://github.com/podhmo/kamidana
    ○ 本当はもっと方法ありそうな気もする

    ● 表示のイメージはSlackに流れているものを見つつ、Discord Webhook
    の使い方ページを見ながら合わせる
    ○ Slackの連動のほうが簡単なので、完成イメージがつく
    ○ https://birdie0.github.io/discord-webhooks-guide/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide