DiscordのチャンネルにINTERACTIONS ENDPOINT URLを登録した自作のBotを招待し、コマンドを実行すると、処理は実行できているものの、「アプリケーションが応答しませんでした」と表示されました。
2023/10/02時点、Discord APIのバージョン10の場合です。
✅ 解決方法
コマンド実行から3秒以内にInteractionsの初回のレスポンスを行う。
🔴 原因
Interaction tokens are valid for 15 minutes and can be used to send followup messages but you must send an initial response within 3 seconds of receiving the event. If the 3 second deadline is exceeded, the token will be invalidated.
「DiscordのInteractionsの初回のレスポンスを3秒以内に行わないと、トークンが無効になる」という仕様を見逃していました。
Interaction tokens are valid for 15 minutes
の部分を見て、15分間は有効だと勘違いしてしまいました……
💻 エラー発生時にやっていたこと
やろうとしていた事はこんな感じです。
- EC2に建てたゲームサーバーの起動をDiscordのコマンドで行う
- Discordのコマンド(Interactions)のハンドリングはLambdaで行う
- PING - PONGの対応
- Authorizationの対応
- サーバーコマンドのハンドリング用のLambdaを呼び出す
「アプリケーションが応答しませんでした」を表示しないようにするには、
コマンド送信 → LambdaのInitialization -> LambdaのInvocation -> Discordがレスポンスを受け取る
の一連の流れを3秒以内に終わらせる必要があります。 当然Lambdaのコールドスタートも含めて3秒以内に応答する必要があります。
自分の今回のケースだと、Lambdaの実行時間は平均3~6秒前後かかっていたので全然間に合っていませんでした。
今回は、サーバーコマンドのハンドリング用のLambdaを呼び出す際に、非同期呼び出しではなく同期呼び出しを行なっていたため、サーバーコマンドのハンドリング用のLambdaのレスポンスを待機してしまって、Discordへのレスポンス送信に時間がかかってしまったのが原因でした。
解決方法としては、サーバーコマンドのハンドリング用のLambdaを非同期呼び出しして、サーバーの起動処理が終わる前に一旦Discordに対してInteractionsの応答を行うとうまくいきました。