PyCon JP 2021 でのミニゲームをGoogle Cloud RunとFirebase Hostingで作った話

JX通信社はPyCon JP 2021のゴールドスポンサーとしてスポンサーさせていただきました。 今回弊社平瀬さんがLocastの内容で登壇されました!内容はこちらからご覧ください。

speakerdeck.com

その際、会社のブースではPythonを使ったミニゲームを実施していました。

PyCon JP 2021について

f:id:jx_k_watanabe:20211019211553p:plain

PythonのカンファレンスであるPyCon JP 2021はオンラインとオフラインでのハイブリッド開催となりました。スポンサーブースはオンラインのみで、Discordのチャンネルに参加者の方に入っていただき、そこで会社の紹介や、参加者の方と交流するという流れになっていました。画像はブースで待機している図です。

f:id:jx_k_watanabe:20211019210537p:plain:w300

(JX通信社のブースです)

その中でJX通信社ではミニゲームを開催し、来場者の方にゲームを遊んでいただき、抽選で景品を差し上げることにしました。 オンラインブースに来てもらうためのコンテンツを用意すると、当日来てくれた方と話すきっかけになったり、宣伝もしやすかったので用意して良かったです。

f:id:jx_k_watanabe:20211019210616p:plain:w400

ゲームの内容

ゲームを作るに当たり、UI部分まで作るのは大変そうだったので、小規模に、かつPythonを使ってゲームを楽しめるようにできないか考えた結果、お客さんはエンジニアなのでターミナルからアクセスしてもらう形式にしました。

Responseはすべてテキストで返却して、回答者に答えをPostしていただく形式になっています。

f:id:jx_k_watanabe:20211019224510p:plain

(ちなみにResponseをapplication/jsonではなくtext/plainにすることでターミナル上で改行がきちんと反映されるというハックがあります)

また、回答していただけた方にアンケートを実施していたのですが、回答が全て好評でよかったです。

f:id:jx_k_watanabe:20211019223735p:plain:w500

要件

今回設定したのは以下の要件でした。

  • APIだけで完結させる
  • お客さんのHTTPClientで答えをPostしてもらう

システム構成

f:id:jx_k_watanabe:20211019210706p:plain

ソースコードはこちらで公開しています。

FastAPI(ゲーム部分)

API部分はFastAPIで作成しました。テキスト・問題・解答はyamlファイルに入れておき、ゲームの進行度に応じて適切な内容を返すようにしたので、ロジック部分はほぼありません。

f:id:jx_k_watanabe:20211019210729p:plain:w300

FastAPIは基本JSONレスポンスなので、文章を出す際に改行コードが出てしまい、若干見づらかったためテキスト形式でレスポンスを返すようにしました。

工夫した点1: Cloud Runからのレスポンスタイムが遅い

Cloud Runは、通常コールドスタートといって、リクエストが来ない間はインスタンスを立ち上げない状態のままにしておき料金を抑えてくれるという特徴があります。しかし、リクエストが来る最初のレスポンスは時間がかかってしまう問題があり、コールドスタートのままだとリクエストから5秒以上かかってしまうこともありました。ゲームは(一般的なAPIエンドポイントと比較すると)リクエスト数が少なくなるため、ユーザーがアクセスするときに時間がかかってしまうことは避けたかったので、Cloud Runのオプションで最低1つのインスタンスを立ち上げておくようにしました。

このようにデプロイ時にプロパティを設定することで、最低インスタンス数を指定することができます。

gcloud run deploy game --source . --min-instances 1

工夫した点2: ドメイン名を読みやすいようにしたい

当初はCloud Runが自動生成していたURLを利用していたのですが、実際にゲームを参加していただく方に分かりづらいドメイン名になってしまっていたため(https://game-mbqu6va7zq-an.a.run.app/ のようなドメインが生成されます)、ある程度読みやすいドメインがほしいなと思いました。

そこで、Firebase hostingを使って、ゲームに必要なドメインを作成することにしました。デフォルトだと、プロジェクト名そのままのドメインが生成されてしまうため、カスタムドメインを作成します。 Firebaseの画面から新規でウェブのアプリを作成します。その際に、Firebase Hostingの設定もできるため、ここで追加します。

f:id:jx_k_watanabe:20211019211204p:plain

その後、チュートリアルに従ってFirebaseの設定をします。加えて、Firebase HostingからCloud Runに送信するための設定を記述します。以下すべてのトラフィックをCloud Runに送信するための設定です。また、生成されたindex.htmlは削除しましょう。

"hosting": {
  // ...
  "rewrites": [ {
    "source": "**",
    "run": {
      "serviceId": "game", // ここにはCloud Runのプロジェクト名を指定します
      "region": "asia-northeast1"
    }
  } ]
}

おまけ

今回PyConJPの開催期間2日稼働させた結果、150円前後で抑えることができました。(Cloud Runの最低インスタンスを抑えることでもう少し安くできたかもしれないですが)

f:id:jx_k_watanabe:20211019211252p:plain:w500

まとめ

今回もスポンサーとして参加できてよかったです。

JX通信社はPythonistaを募集しております!

open.talentio.com