前書き
ゲームはローカルでブロックを破壊・配置できる基本の枠組みが整いつつあります。
ここで破壊したときに世界からブロックの情報を破棄してプレイヤーのインベントリに追加しなければならず
配置したときにインベントリから消して、世界に配置しなければなりません。
不正を防ぐために、クライアントからは座標とアクションだけを操作情報としてリクエストするだけ
実際のブロックの値のやりとりはすべてサーバー上で行われることになります。
サーバーの実装
これまで長いこと Redis によるブロックデータの管理を考えてきましたが、二点気になることがありました。
- 全部バイナリで処理するのにいちいち文字列に直されて、高額になるほどインスタンスのメモリが大きくなる
- HTTPリクエストの階層が深くて無駄なやり取りが多い(Unity C# → PlayFab Cloud Script → API Gateway → Lambda(python) → ElastiCache)
そこで go 言語で http サーバーを立てて、データをバイナリのまま操作しちゃうのがいいかなって思った次第
バイナリファイルで読み書きもできる様子なので
go 言語まわりの復習
基本的には公式ドキュメントで確認する
golang.org
ですが2年ほど前に go 言語を調べていたので、読み返してコンテキストを作ります。
simplestar-tech.hatenablog.com
simplestar-tech.hatenablog.com
simplestar-tech.hatenablog.com
simplestar-tech.hatenablog.com
simplestar-tech.hatenablog.com
simplestar-tech.hatenablog.com
C++ でプログラミングを学んだ人には手になじみやすい言語だと思います。
AWS で golang Web サーバー
Go 言語について復習が終わったところで
ここで目に留まったのが次の Elastic Beanstalk の説明文
Elastic Beanstalk では、アプリケーションを実行しているインフラストラクチャについて学習することなく、AWS クラウドでアプリケーションをすばやくデプロイし、管理できます。Elastic Beanstalk は、選択肢を狭めたり制御を制限したりすることなく、管理の複雑さを軽減します。アプリケーションをアップロードするだけで、Elastic Beanstalk が自動的に容量のプロビジョニング、負荷分散、拡張、およびアプリケーションの状態のモニタリングといった詳細を処理します。
こんなこと言われたら使ってみたくなるじゃないですか
ということで、よくある質問 - AWS Elastic Beanstalk | AWS
と次の開発者ガイドを眺めてみることにしました。
docs.aws.amazon.com
とりあえず使ってみようということで、アプリ名と Go プラットフォームを選んで起動したら
問題なく Go 環境が立ち上がった。
EC2 は t2.micro インスタンスタイプで立ち上がり、おそらくその中に docker でも起動しているんじゃないかな
ssh で接続することは、最初のセキュリティーグループでは設定されていないけど、穴を開けて入ってみます。
どうも穴開けただけでは許可が下りなかった+ユーザーは誰であるべきか不明
ドキュメントによるとまずは eb init を打てるようにならないとお話にならないと書いてあった
eb init とは?
docs.aws.amazon.com
git の説明の通り Windows 環境なので PowerShell から実行して Python 3.7 インストールが走り…
pip 入らないエラーも --user オプションをつけて入るようになり
PowerShell 上で eb --help で eb の情報が引き出せるところまできました。
eb コマンドが使えるようになったので対象の eb 環境に ssh 接続してみましょう。
eb ssh GettingStartedApp-env
リージョン指定がないと怒られるので、案内に従い eb init をします
新しい環境だったので、IAMユーザーの秘匿情報を旧 PC から持ってきます。
さらに ssh キーを作って登録してインスタンスの再起動まで許可してやっと ssh 接続できるようになりました。
どうやって go 動いているんだろう?
docker コンテナとかじゃなかった
あ、ここに application.go ファイルが置かれてた
/var/app/current/
ひとまずこれで全世界に golang での Web アプリを http 80 ポートで提供している状態になりました。