LoginSignup
9
5

More than 3 years have passed since last update.

Discord botをAWS APIGateway+Lambdaで動かしたい

Posted at
  • 本記事は記載途中です *
  • 現時点ではdiscord.pyがAPI GatewayのWebSocket I/Fの動きと連動させられないので、この手のラッパーを使わず、スクラッチで書く必要があるなーと考えています。 *

Discordとは

テキスト+音声会話用コミュニケーションツールの一種。
競合としてはテキスト+音声両方ではTeamsとLINE、テキストのみであればSlack、音声会話ではZoom、WebEx、Skype辺りが競合する。

特徴としてはゲーム用途に特化させた設計になっていて、その方面に向けた機能が多い。
但し現在はゲーム用途以外でも使用するケースが増えているらしい。

Discord BOTについて

その他のツールと同様に、特定イベントに対しテキスト応答を行う。(例えばユーザがチャンネルにJoinしたらいらっしゃいませ、とか)
そういったメジャーな処理に加えて、他ツールではAPI等が存在しない音声系の調整が可能なのが特徴。(全員ミュートなど)
(少なくともLINE、Teamsはいずれも2021/2月時点で各公式Docsには存在しない。またTeamsは不明だがLINEは2年以上APIの構成が変わってないので今後の更新は期待できそうにないと思う)

BOT作成者がBOTを公開状態にすると、原則自由に使用可能になる。

Discord自体の利用は無料であるが、BOTの処理を行うサーバは別途必要で、そのサーバ利用/維持費はBOT作成者が負担する。

My BOTサーバインフラ方面設計

今回のポイントは「サーバ利用/維持費用」である。
費用やセキュリティ面を度外視するなら、グローバルIP+適当なドメイン付けたWebサーバを用意し、Discordからの処理を受け付ければ良いが
当然相応の維持費も要るし、セキュリティ対応も手間である。

というわけで調べても情報があまりなかったAWS API Gateway + Lambda(Python)でDiscord BOT作成を試みた。
(保険としてherokuやAWS EC2もあるが、ここは折角なのでServerlessで)

ラフのアーキテクチャは以下の通り。
DiscordBOT_AWSArc.png

HTTPのフロント部分のリクエスト受付はAPI Gatewayが対応し、その後の処理はLambdaのPythonが対応する。

API GatewayはAWSフルマネージドであり脆弱性対応はAWSが実施する。
多分時折中のEC2インスタンスが入れ替わったりするが、冗長化された上で実施されるため無停止である。
(たまたま運悪くリクエスト中にインスタンスシャットダウンを食らう可能性はあるが、確率はかなり低い上リトライすればOKである)

使用料は100万リクエストあたり1.29USDである。

LambdaはAWS上でスクリプト実行を行うプラットフォームで、所定のコードを置いておき各イベントに応じて起動が行われるマネージドサービスである。
Lamdba画面上から操作して実行したり、Lambda自体のcronで定期実行も可能であるが、今回はAPI Gatewayのリクエスト受信と連動させる。

使用料はリクエスト10万件あたり 0.20USDと処理のCPU時間とメモリ量&利用時間に応じた費用が発生する。

API GatewayとLambda現時点で想定月額利用料は5.00USD/月である。
別途通信料はあるが、テキストのみであるため一旦考慮しない。

この構成における最も大きなメリットは「処理を行わないIdle状態時には費用や手間が掛からない」点にある。
また相当量の処理を継続して実行しつづけるような状態でなければ、維持費はサーバ1台を起動しつづけるより安価になる想定である。
特に頻繁に処理を行うわけではなく、1日10回未満の処理を想定しているため、このメリットを最大に享受する構成になっている。

もし今後BOTを公開したり、Discordのチャンネル内のユーザが増えた場合は使用量に応じたAWS利用料が発生する見込みであるが
現時点でBOTを公開する予定はなく、ユーザもせいぜい2桁人数のため、1日10回未満程度の処理想定としている。

設計を詰めてみた結果(2021/3/2時点)

これら設計のアプリケーション部分はdiscord.pyを使用する想定だったが、
インフラ部分とdiscord.pyが噛み合わないことが判明している。

discord.pyは起動後、自身のプロセスが常駐しWebSocketを対応するが、
API Gateway+Lambdaでは以下のように、リクエストごとにLambda Functionを呼び出す形になるため噛み合わない。

以下URLより図を抜粋
https://qiita.com/G-awa/items/472bc1a9d46178f3d7a4
AWSChatArc.png

今後の進め方(2021/3/2時点)

  1. API Gateway + lambdaを維持し、lambda functionにDiscordの生APIで実装する。

  2. 大人しくEC2上でdiscord.pyを使う。

BOT自体は3月下旬に使用したいため、現時点では実装の早い2案を採用する予定である。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5