🗂

Discord Slash Commands を AWS Lambdaで実装する際、どのリージョンを使うか迷った話

2023/07/01に公開

はじめに

日本国内ユーザー向けに、直接ユーザーに接続してもらうサービスを開発することが多く、今まで東京リージョンばかり使っていたのですが、スラッシュコマンドを実装する際、主な接続先はDiscordということに気がつきました。

サーバーが海外にある場合、東京リージョンを使い続ける意味はないので、少し緩めの調査になりますが、適切なリージョンを探してみました。

前提

  • AWS Lambdaの関数URLを利用
  • 個人開発でサービスの規模は(少なくとも立ち上げ初期は)小さい
  • 今後OpenAIのAPIなど組み込みたいが、現在はDiscordのみと連携

DiscordのAPIサーバーのロケーションはどこか

DiscordのAPIサーバーのロケーションは、(検索した限り)公式では明示されていないようです。
非公式な情報(RedditやStackoverflowなどでのディスカッション)では米国の東海岸、または東海岸と西海岸という情報が多かったです。

IPアドレス

ログを取ったところ、DiscordのIPアドレスは、ランダムで複数のものが使われていました。
それぞれ whois で調べるとGoogle CloudのIPでした。
公式ドキュメントで明示されていない点も合わせて考えると、少なくともIP固定が保証されているわけではなく、サーバーのロケーション含めて、今後変更されることもあると考えた方が良いでよう。
(コストをかけて、特定ロケーションに特化した作業をしても報われない)

レイテンシを計測してみる

この時点で、バージニア北部(東京リージョンの次に使い慣れている)で良いかなと考えたのですが、何か見落としがあるかもしれないので、軽く計測することにしました。

どんな計測をしたかというと

  • 東京(ap-northeast-1)
  • バージニア北部(us-east-1)
  • カリフォルニア北部(us-west-1)

に、同一の設定、コードで関数を作成し、対応したスラッシュコマンドを作成します。

手動になってしまいますが、それぞれのスラッシュコマンドを交互に実行していきます。

だいたい、それぞれ15回程度叩くと、把握できているIPが複数回確認できました。

ログから、Discord側にレスポンスを返した時間を記録します。
同時に、Discord側がメッセージを作成した時間を、APIを使って取得します。

これで、レイテンシ(レスポンスを返した時間〜受信した時間)を推定します。
(メッセージの作成時間が必ずしもレスポンスを受け付けた時間ではないのであくまで推定)

測定結果

結果は予想通りで
平均で
バージニア北部 → Discord: 85ms
カリフォルニア北部 → Discord: 140ms
東京 → Discord: 187ms
となりました。

実は単一リージョンの中の結果だけ見ると、IP毎に出現頻度や時間に、多少のバラツキが出たのですが、複数リージョンの結果を照らし合わせると、例えばどれか1つのIPがカリフォルニア(西海岸)と言えるような傾向はありませんでした。
(例えば、バージニアで遅かったIPがカリフォルニアや東京で速かったというわけではない)

本当は数百回くらい試した方が良かったかもしれませんね。

結論

米国リージョンはバージニア北部だけではないので、東海岸からさらに適切なリージョンを探す必要があるかもしれません。ただ、あまり時間を使い過ぎるのも効率的ではないので、当面はバージニア北部を使おうと思います。

今後、例えばOpenAIのAPIを使った機能を作るといった場合、別の要素も入ってきますし、北部バージニアが80ms程度なら、同じ東海岸なら10msも差がつかない気がします。

とはいえ、実行回数が少なかった点や長期間の検証はできていないので、今回の所要時間を覚えておき、中長期で運用する中で、今回の結果と異なる数値が出るようなら再度調査してみようと思います。

Discussion