AWS EC2にクラウドゲーミングサーバを立ててOculus Quest 2でVRゲームを遊ぶ

## TL;DR

- VRゲームをやりたいけど、高スペックGPUのWindowsマシンがない
- AWS EC2にWindows Serverを立て、Oculus Quest 2を接続してVRゲームをプレイする
- ゲーミングPCなしでも$1/h程度のコストでVRゲームをプレイ可能

## はじめに

VRゲームを遊ぶための大きなハードルとして、高いGPUスペックが求められる点があります。しかしそうしたGPUは仮想通貨マイニング需要などもあり価格が高騰して簡単に入手することができません。そこで時代はクラウド、足りないリソースはクラウドで調達すれば良いのです。

本記事ではAWS EC2のGPUインスタンスを利用してVRゲームを遊ぶ環境を構築し、そこにVRデバイスであるOculus Quest 2で接続する手順をご紹介します。1時間あたり$1ほどののコストは発生するものの、初期費用を低く抑えながらVRゲームを始めることができます。VRを体験してみたいけど機材を整えることにハードルを感じている方は是非お試しください。

## 利用機材/技術/アプリケーション

- [AWS EC2 GPUインスタンス(G4)](https://aws.amazon.com/jp/ec2/instance-types/g4/)
- [Persec](https://parsec.app/)
- [Parsec Cloud Preparation Tool](https://github.com/parsec-cloud/Parsec-Cloud-Preparation-Tool)
- [Oculus Quest 2](https://www.oculus.com/quest-2/)
- [Virtual Desktop](https://www.vrdesktop.net/)

## EC2インスタンス作成

AWSコンソールにログインしてEC2インスタンスを作成します。マシンイメージは`Microsoft Windows Server 2019 Base`を選択してください。

![スクリーンショット 2021-08-29 21.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/adb86ad8-02ff-03c5-1bb5-55b6a7467060.png)

次にインスタンスタイプを選択します。EC2のGPUインスタンスには`g4dn`と`g4ad`の二つのファミリーがあります。前者はNVIDIA T4、後者はAMD Radeon Pro V520というGPUを搭載しています。のちにご紹介するParsec Cloud Preparation Toolがプロセッサの差異を吸収してくれるのでどちらのファミリーを選んでも問題ありません。AWSの紹介文によると`g4ad`ファミリーの方がグラフィックの処理に優れているとのことだったので筆者はそちらを利用しています。

https://aws.amazon.com/jp/ec2/instance-types/g4/

インスタンスタイプは最低限のスペックの`g4dn.xlarge`/`g4ad.xlarge`でOKです。

![スクリーンショット 2021-08-29 21.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/961cf8b1-f48b-6cdb-77c6-048ddf8c9c94.png)

イメージとインスタンスタイプを選んだらインスタンスの具体的な設定に進みます。G4インスタンスは高価なのでスポットインスタンスとして利用します。「3.インスタンスの設定」で「スポットインスタンスのリクエスト」にチェックをつけてください。

![スクリーンショット 2021-08-29 21.56.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/d0e4fc51-c501-b2b1-adfc-6604bc694ce2.png)

ゲームのダウンロードなどにある程度のストレージが必要なので「4.ストレージ」で適当なサイズのストレージをアタッチしてください。ボリュームタイプは汎用SSDでOKです。

「6.セキュリティグループの設定」ではデフォルトでタイプ:RDPの3389番ポートが開いています。ここに追加でタイプ:カスタムTCPの38810,38820,38830,38840番ポートを解放してください。(重要！)

これらのポートは後述するVirtual Desktopというアプリケーションを使ってOculus Quest 2からこのサーバに接続する際に必要になります[^1]。

[^1]: 接続できなくて困っている時に[Virtual DesktopのDiscordチャンネル](https://discord.com/invite/E44Gcquk?utm_source=Discord%20Widget&utm_medium=Connect)で質問すると教えてもらえました。ヘルプページにも近しいことが書かれていますが、サーバのポートを開けるという理解までは自力ではたどり着けませんでした。> Can I connect to my computer over the Internet? Yes, make sure "Allow remote connections" is checked in the Streamer window. You'll also need to enable UPnP on your router and the Streamer App will forward the required ports automatically. If you want to manually configure your router, forward TCP ports 38810, 38820, 38830 and 38840. https://www.vrdesktop.net/

![スクリーンショット 2021-08-29 22.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/fd3ea374-d6f5-9dfd-4614-afbbb34c07fd.png)

最後に起動ボタンを押すとキーペアの設定モーダルが開きます。何かしらの鍵がAWS上にある場合はそれを利用してもいいですし、新規作成してもOKです。作成する場合はWindows Serverにログインする際に必要になるのでわかりやすいところに保存しておきましょう。

![スクリーンショット 2021-08-29 22.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/09358249-c4ba-fce5-3131-fff43458e971.png)


## RDPで接続

インスタンスの作成が終わったらRDPで接続して環境の設定を行います。作成したインスタンスを選択して「接続」>「RDPクライアント」>「パスワードを取得」で先程設定したキーを使ってRDP用のパスワードを生成します。

RDP接続にはWindowsの場合はOSのリモートデスクトップ機能が使えます。Macの場合はApp Storeから入手できるMicrosoft Remote Desktopを使うのが簡単です。

https://dev.classmethod.jp/articles/first-login-to-ec2-windows/

インスタンスのRDPクライアント画面で表示されたIPアドレスとパスワードを入力して接続します。

使用したEC2インスタンスのRDP用パスワードは初期接続用のものです。このインスタンスをAMIイメージとして保存してから再度立ち上げた場合は再生成できません。

https://dev.classmethod.jp/articles/about-custom-ami-windows-password/

どこかにメモしておく、Windows上でパスワードを変更する、ログイン時にパスワードを要求しないように設定するなどしておくといいでしょう。ただし、パスワードを要求しないようにした場合はRDP用のポートを閉じておいた方がいいと思います。後述するように環境構築以降はPersecで接続するのでRDP用ポートを開けておく必要はありません。

## ゲーミングPC環境構築

各種ゲームを実行する環境は[Parsec Cloud Preparation Tool](https://github.com/parsec-cloud/Parsec-Cloud-Preparation-Tool)によって構築するのが簡単です。ついでに低レイテンシでリモート接続できる[Persec](https://parsec.app/)というアプリケーションがインストールされるので以降はこちらで接続して作業します。

https://parsec.app/

あらかじめローカル環境でPersecのアカウントを作成しておきましょう。

サーバ上でブラウザから以下のリンクを開いて、PowerShellスクリプトをコピペして実行してください。

https://github.com/parsec-cloud/Parsec-Cloud-Preparation-Tool

```powershell
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" 
$ScriptWebArchive = "https://github.com/parsec-cloud/Parsec-Cloud-Preparation-Tool/archive/master.zip"  
$LocalArchivePath = "$ENV:UserProfile\Downloads\Parsec-Cloud-Preparation-Tool"  
(New-Object System.Net.WebClient).DownloadFile($ScriptWebArchive, "$LocalArchivePath.zip")  
Expand-Archive "$LocalArchivePath.zip" -DestinationPath $LocalArchivePath -Force  
CD $LocalArchivePath\Parsec-Cloud-Preparation-Tool-master\ | powershell.exe .\Loader.ps1  
```

コマンドラインのメッセージに従ってインストールを進めていきます。Persecのインストールが完了すると画面が開くので、作成したアカウントでログインします。

また処理の途中でGPUドライバーをS3からインストールするためにAWSのアクセスキーの入力を要求されます。`AmazonS3ReadOnlyAccess`だけを付与したIAMユーザーを作成して、その鍵を入力すればOKです。

![スクリーンショット 2021-08-29 22.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/b42443c9-96a0-e958-1822-41a068ee6e51.png)

ローカル環境に戻ってAWSコンソールのIAM>「ユーザー」>「ユーザーを追加」から適当な名前を入力し、「アクセスキー - プログラムによるアクセス」を選択、アクセス権は「既存のポリシーを直接アタッチ」から`AmazonS3ReadOnlyAccess`を選択します。作成完了画面でシークレットキーをダウンロードできるので保存しておき、アクセスキーと合わせてサーバのPowerShellにコピペしましょう。

![スクリーンショット 2021-09-27 15.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/43aee1de-87c8-1f3f-e4c8-f7d574d8ac0e.png)

以上が完了すればPersecで接続してWindows用のゲームをプレイする環境が整っています。以降はPersecで接続した方がレイテンシが低いのでおすすめです。

## Oculus Quest 2で接続

次にOculus Quest 2で接続してVRゲームを起動する手順をご紹介します。

まずVRゲームを起動するためのものをインストールしていきます。

- [Steam](https://store.steampowered.com/?l=japanese)

https://store.steampowered.com/?l=japanese

Steamは各種ゲームのプラットフォームです。この中でVR用ゲームを入手します。SteamアプリをインストールしたらSteam内で[Steam VR](https://store.steampowered.com/app/250820/SteamVR/?l=japanese)をダウンロードしてください。

- Oculusアプリ

https://www.oculus.com/setup/

またOculus Quest 2を接続するPCにはOculusのアプリをインストールしておく必要があります。上のリンクからダウンロードできます。

- [Virtual Desktop](https://www.vrdesktop.net/)

https://www.vrdesktop.net/

最後にOculus Quest 2からサーバにリモート接続するためにVirtual Desktopというアプリをインストールします。まずOculus Quest 2上のストアで購入して本体にインストールしておきます。

次にサーバ側にもデータ送信用のアプリをインスールします。サイトの「Download Streamer App」からダウンロードしてください。

インストールして起動するとOculusのユーザー名の入力を求められるので入力してください。Oculus Quest 2側からVirtual Desktopを起動してこのサーバに接続できれば成功です。

## VRゲーム起動

Virtual DesktopはWindows PC上でSteam VRを起動して、そのVR映像をOculus Quest 2に送信してくれます。つまりOculus Quest 2でSteam VRのゲームを遊ぶことができるということです。

Oculus Quest 2のVirtual Desktopのメニューの「Launch Steam VR」というボタンで起動することができます。Steamでお好きなVRゲームを入手して、Oculus Quest 2でプレイできるようになりました！

ゲームでマイクを使う際に音声を入力できないことがあります。その際はWindowsのマイクのプライバシー設定で「アプリがマイクにアクセスできるようにする」をオンにすると解決する場合があるのでお試しください。

![スクリーンショット 2021-09-04 3.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458395/8d08d45c-fced-84db-8662-2e6a3a0cc532.png)

https://www.drivereasy.com/knowledge/oculus-quest-2-mic-not-working-solved/

## ゲームをやり終えたら

スポットインスタンスとして起動しているので、「停止」/「起動」することができません。「終了」のみ可能ですが、インスタンスを終了するとストレージ内容が全て消えてしまいます。なのでその前にAMIイメージを作成するようにしましょう。次回起動時はそのAMIイメージからインスタンスを作成します。多少手間はかかりますがインスタンスの使用料は大幅に削減することができています。

## コスト

EC2の利用料金とData Transferを合わせて概ね1時間あたり$1ほどの料金がかかります。AMIを取る際にストレージのスナップショットが保存されますが、そちらも課金対象なので古いものは定期的に消していくといいでしょう。

ゲーミングPCが15万円くらいかかると想定すると、大体1,500時間以上利用するならPCを買ってしまった方が安いという計算になります。かなり本格的なプレイ時間なので、ほとんどの方はクラウド環境の方が大幅にコストを抑えられるでしょう。

## 参考文献

https://outoz.hatenablog.com/entry/2020/04/24/180130

[^2]

[^2]: VRChat内でこの記事の筆者の方にお会いして、VR温泉に浸かりながら参考にさせていただいたお礼を直接お伝えする機会がありました。面白い世界です。

https://dev.classmethod.jp/articles/parsec-gaming-on-aws/

https://djent.jp/game/aws-gaming-p

## 補足

このようなクラウドゲーミング環境を提供するサービスもいくつかあるようです。

https://shadow.tech/

https://www.paperspace.com/

ただしいずれも北米でのみサービスを展開しており、日本国内にサーバを立てることができません。AWSなどクラウドに馴染みのある方は自前で用意した方がレイテンシの低い環境を構築することができるでしょう。

また個人的には自前で環境を用意することでEC2などの使い方の勉強になってよかったです。