🎰

自前サーバーで動かしてたWebサービスを障害発生から4時間でHeroku環境に移行させた話

2023/11/03に公開

そもそもどんなサービスを動かしていたのか

VRSNS VRChat向けのゲーム内通貨保存システム「CBS」

・ユーザー数はおよそ3000人
・日あたりのアクティブユーザーは60人

特徴

・ゲーム内でのロールプレイイベントに価値を付加できる
・イベントに向けて労働ワールドで稼ぎ,イベントをさらに楽しむ
・キャストは給与を貰える→循環経済の創造

今回何が起きたのか

アップデート

・ターゲットサービスプラットフォームであるVRChatにクライアントアップデートが入った
・この際にhttpによる平文通信がブロックされるように変更された
・事前のアナウンスはなかった

当日の流れ

・お昼:今夜は提携VRカジノの営業日!サーバーも問題なく稼働中!
・2023/10/27 15:34 問い合わせフォームにユーザー様からサービスが使えない旨の報告が入る
・2023/10/27 15:40 原因調査開始
・2023/10/27 15:55 クライアントアップデートによるhttp通信のアクセス制限であることを特定,httpsであれば問題ないことを確認
・2023/10/27 16:00 予約してた車の査定に行くために1時間外出→21:00をデッドラインとすることを関係各所に通達
・2023/10/27 18:00 httpsのいわゆる「オレオレ証明書」で乗り切れないかと自己証明pemを作成 通信を試みるも失敗(そんなに甘くなかった)
・2023/10/27 18:30 今から証明書取るのも間に合わないしデフォルトでhttpsの環境に移行したほうが良さそう と考える(今回コンテナ開発していなかったことを若干後悔)
・2023/10/27 18:30 Herokuへの移行を始める

Pythonで作成したサーバーアプリケーションをHerokuにデプロイする

1. Herokuアカウントの作成

Herokuにデプロイする前に、Herokuのアカウントを作成してください。アカウントを作成するには、Herokuのウェブサイトにアクセスし、サインアップ手続きを完了します。

2. Heroku CLIのインストール

Herokuアカウントを作成したら、Heroku CLI(Command Line Interface)をインストールします。CLIを使用してアプリをデプロイし、操作します。CLIのインストール手順は、Heroku Dev Centerを参照してください。

3. アプリのセットアップ

  1. Pythonで作成したアプリケーションを選定し、必要なファイルを含むディレクトリを作成します。

  2. requirements.txtに pip install うんちゃら でブチ込んだライブラリ類を使用しているもの依存関係のあるものだけ書く. pip freezeが便利.

  3. 'runtime.txt'に使用しているPythonのバージョンを書いておく.Herokuが対応しているものじゃないと認識しないぽいのでHerokuを参照.今回は「python-3.10.4」と書く.

4. Procfileの作成

Herokuでは、Procfile というファイルを使ってアプリケーションのプロセスを宣言します。 Procfile ファイルをアプリケーションのルートディレクトリに作成し、アプリの実行コマンドを指定します。例えば、Webアプリケーションの場合、以下のように記述できます。

web: python app.py

app.py はアプリケーションのエントリーポイントファイルです。このファイル名は、アプリケーションに合わせて変更してください。

5. Herokuにログイン

Heroku CLIを使用して、Herokuにログインします。以下のコマンドを実行します。

heroku login

コマンドを実行すると、ブラウザが開き、Herokuのウェブサイトでログイン手続きを完了することが求められます。

6. Herokuアプリの作成

Herokuにアプリを作成するために、次のコマンドを実行します。

heroku create

このコマンドにより、新しいHerokuアプリが作成されます。アプリのURLが表示されるので、メモしておきましょう。

7. アプリのデプロイ

Herokuアプリをデプロイするには、以下のコマンドを実行します。

git push heroku master

このコマンドは、ローカルのコードをHerokuにプッシュし、アプリをデプロイします。

8. アプリの起動

アプリがデプロイされたら、次のコマンドを使用してアプリを起動します。

heroku ps:scale web=1

これにより、Webプロセスが1つ実行されます。

9. アプリの確認

・2023/10/27 20:30 ブラウザでアクセスを確認して動いた!!! 目標タイムに間に合ってよかった
ProcfileがPythonWebサービスの作り方によって若干書き方が違うので手間取った.

自前サーバーからHerokuに移行する上でソースコードの改良を行わなければならない箇所が1点

サーバーアプリを建てるポート
通常はこんな感じに適当なポートを設定したりする(しない人もいるかも)

app.py
# サーバーの設定
server_address = ('', 40008)
httpd = ThreadedHTTPServer(server_address, RequestHandler)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
# サーバーの開始

HerokuではHerokuサービス側からポートが割り振られるのでOSライブラリを使用してポートを受け取ってそこにサーバーを建てるらしい(初めて知った)

app.py
# サーバーの設定
import os
port=int(os.environ.get("PORT", 5000))
server_address = ('', port)
httpd = ThreadedHTTPServer(server_address, RequestHandler)
#httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
# サーバーの開始

Discussion