AWS EC2インスタンスからSteam Home Streamingでゲームをあそぶ
ハローーーーーー!!! プレジデンテ!!!!!!!(挨拶)
そろそろSteamでTropico 6が出るぞという昨今ですが、Cities: Skylines Industries DLCが出たばかりの市長の皆さんはいかがお過ごしでしょうか。私はDLCやらMODやらでモリモリになったCities: Skylinesを6年前のPCで遊ぶことにそろそろ限界を感じています。しかしいまPCを組むのは時期が悪い[要出典]。
ということで、AWSのEC2インスタンスにSteamをインストールして、ゲームをストリーミングプレイしてみたときのメモです。思っていたほどの遅延もなく、ある程度の妥協があれば快適にプレイができるようになりました。
やりたいこと
Cities: Skylinesというゲームがあります。要するにめちゃくちゃ広い土地でめちゃくちゃいろいろなことができるSimCityです。
いろいろな機能がMODにより追加できるのですが、いかんせんMODをいれるとCPUリソースやらメモリリソースやらをバカ喰いしてしまいますので、高性能なPCがないと快適に遊べません。いまはCPUは6年前のSandy Bridge、RAM16GB、GPUだけは新しめのGeForce GTX 1060という環境で遊んでいるのですが、さすがにそろそろ厳しくなってきました。
しかしこれのために今PCを組もうとすると20万円は吹っ飛んでしまいます。さすがにキツいです。初期投資をおさえつつ利用料金さえ払えばいい感じの環境を貸してくれるところはないでしょうか。ありますね。クラウドです。AWSです。
初期投資をおさえつついい感じの環境で遊ぶため、クラウド環境にゲームを遊ぶためのマシンを立てて、そこからストリーミングプレイを試してみることにしました。
必要なもの
AWSアカウント
今回はAmazon Web Serviceで環境を構築することにしました。Google Cloud PlatformやAzureでも似たようなことはできるとおもいます。
端末
ゲームを遊ぶ物理端末です。Steamホームストリーミングが動く環境、WindowsかMacOSかLinuxの端末が必要です。今回はWindows10のPCで遊びます。
Steam
ゲームを遊ぶためのプラットフォームです。SteamにはSteamホームストリーミングという機能があり、ストリーミングプレイが可能です。
VPN環境
Steamホームストリーミングは、同一LAN内でしか動作しません。そこでVPNで実際にゲームが稼働する環境と手元の端末をVPNでつなぎ、同一LAN内に見せかけるわけです。
ちょうどウチの無線ルータ( NETGEAR Nighthawk R7000 )にはVPNサーバ機能があり、今回はこの機能を使うことにしました。そういうのがなければSoftEtherを使うのが楽だと思います。
VNC
WindowsのRemote DesktopだけではSteamホームストリーミングを立ち上げることができません。VNCあるいは他のWindowsにリモートアクセスする方法が必要です。
今回はUltraVNCを使いました。
やりかた
EC2インスタンス作成
EC2インスタンスをつくります。詳細な手順はなんかググってさがしてください。
まずIAMロールをつくっておきます。あとからインスタンス内でドライバをインストールするときにS3からドライバをダウンロードしますので、EC2インスタンスにS3を読み込める権限が必要です。
そしたらEC2インスタンスを作ります。Windows Server 2016のBaseでつくります。
うわ〜〜〜CPU16コアRAM122GBだ〜〜〜〜〜〜〜〜〜
さっき作ったIAMロールをつけてあげましょう。
ストレージ、プロビジョンドIOPSのSSDを使うと結構値段が張ってしまいます。汎用SSDでもいいとはおもうのですが、今回はお試しと言うことでプロビジョンドIOPSのSSDを使いました。
FW、とりあえず端末からのアクセスにおいて全てのポートを許可しました。本来ならRDPとVPNとVNCで使うポートだけ開けるべきだと思います。考えるのがめんどくさいのでこうしてしまいましたが、端末が頻繁にアドレスが変わる環境にある場合やこのアドレスをもつ端末の信頼が十分でない場合にはきちんと制限をすべきです。
ではやっていきましょう。
NVIDIA Driver
RDPでインスタンスにログインできたら、ソフトウェアをインストールしてきます。まずはNVIDIA Driverを下記に従ってインストールします。
Windows での NVIDIA ドライバーのインストール - Amazon Elastic Compute Cloud
Steam
インストールしましょう。
Steam, The Ultimate Online Game Platform
Windows Server 2016でIEをつかうとドチャクソ強力な制限がかかっているので、すこしめんどくさいです。インターネットオプションから制限をゆるめたほうがやりやすいかとおもいます。
VPN
ウチの場合、無線ルータ Nighthawk R7000にVPNサーバの機能がありますのでそれをつかいます。ここで説明してもしょうがないかと思いますので詳細は書きません。
なお、公式の説明の通りにWindowsクライアントとしてOpenVPNの最新版を使ってしまうとセキュリティ上の制限により使えませんでした。今回はOpenVPN 2.4.0を使いました。必要だから制限を掛けているわけで、あまり褒められたものではありません。このクライアントを使って大事な通信はしないようにしましょう。
既存のVPN環境がない場合、Softetherとか使うのが楽だと思います。
VNC
ここまででSteamホームストリーミングうごくかなと思っていたのですが、動きませんでした。調べてみると、RDPのセッションではNVIDIA Driverが動いてくれないようです。VNCのセッションをつくっておけばNVIDIA Driverも動いてくれるようなので、それをつかいます。
Windows Server側にUltraVNC Serverを、クライアント側にUltraVNC Clientをインストールします。
UltraVNC VNC OFFICIAL SITE, Remote Access, Support Software, Remote Desktop Control Free Opensource
このままだと、RDPのセッション上でVNCが動いてしまうので、セッションが切れてもVNCが動くよう、サービス登録をします。
ここでいったんPCを再起動し、VNCで接続してください。Ctr+Alt+Del送出ボタンでログインをして、接続すると、デスクトップに入れるかと思います。
VPNクライアントを起動してSteamを起動、すると手元の端末のSteamでストリーミングするという選択肢が出てくるはずです。
接続
Steam Home Streamingではいってみました。
いま試すと結構画像粗くなっていますけど、深夜とかに試してみるともっときれいにできました。通信速度の違いでしょうか。
雑感
ここがすごいぞデータカードダス アイカツフレンズ!
みなさんおはようございます*1。アイドル活動、略してアイカツ! してますか?
この記事はアイカツ! Advent Calendar 2018 3日目の記事です。2日目の記事はid:romiogakuさんによるChrome拡張の記事でした。コード書いてるのまぶしいですしこのような仕事環境がうらやましいですね...
さてこの記事では、いきなり3日目に入れてしまったのにとくにネタの用意がないので、データカードダス アイカツフレンズ!のいいところを改めて紹介してきたいと思います。
*1:芸能界の挨拶は朝でも夜でも「おはようございます」です。
ロードバランサの配下にあるApache2.4系のアクセス制限
あけましておめでとうございます、今年も一年Apache2.4系でリクエストヘッダの値によってアクセス制御をしようとしたところ、いくつか嵌ったのでメモです。AWSでELB使いながらその下のApacheでアクセス制限したいみたいなときにあるヤツですね。
ロードバランサ等の配下にApache2.4のサーバがあり、このサーバで端末のIPアドレスによって制限をかけたい場合、下記のように書くことができます。 ロードバランサはクライアントのIPアドレスを、リクエストヘッダに「X-Forwarded-For」として付加してリクエストを投げているものとします。 X-Forwarded-Forというリクエストヘッダの値が12.34.56.78や123.45.0.0/16のうちどれかにマッチしていればOKという設定です。
<Location /> Require expr req('X-Forwarded-For') -ipmatch '12.34.56.78' Require expr req('X-Forwarded-For') -ipmatch '123.45.0.0/16' </Location>
Apache2.2だとSetEnvIfでX-Forwarded-Forの値が正規表現にマッチしているかどうかをみて環境変数をセットして環境変数がセットされていれば許可、みたいにすることが多かったので、断然わかりやすくなっていますね。
ヘッダの値が正規表現にマッチしているかどうかを見て制限をかけることもできます。 X-Forwarded-Forというリクエストヘッダの値が/^123.45./や12.34.56.78のうちどれかにマッチしていればOKという設定です。
<Location /> Require expr req('X-Forwarded-For') =~ /^123\.45\./ Require expr req('X-Forwarded-For') =~ /^12\.34\.56\.78$/ </Location>
もちろんX-Forwarded-For以外のヘッダでも同様です。たとえばUser-Agentでオタクアピールしてくる特異なオタクだけにアクセスを許可したい場合、下記のようになります。 今時UAでもろもろ制御なんてすることもあんまないかと思いますが、ヘルスチェックだけ許可するとかの用途には、まあまあ覚えておくと便利そうです。
<Location /> Require expr req('User-Agent') =~ /(i am|we are) otaku/i </Location>
またこのRequire expr、各種変数/関数をもつことができ、たとえば特定の時間にしかアクセスを許可しないみたいな設定もできます。 記法は https://httpd.apache.org/docs/2.4/expr.html を見ればわかる。
<Location /> Require expr %{TIME_HOUR} -gt 9 && %{TIME_HOUR} -lt 17 </Location>
で、嵌った所なんですけども。 正規表現で制御する設定をしようとしていたところ、 https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requiredirectives に記載の通り""で囲んで記載したらパースできないと怒られてしまい、無駄に時間を使いました。 よくわかんないですが、たぶん僕の理解が足りていないのだと思います。悲しいですね。 あと、表題みたいな用途にはX-Forwarded-Forヘッダの値使うより、RemoteIPHeader指定してCONN_REMOTE_ADDRの値使うほうがよいんですかね? これもよくわかんない。
実家に帰ってついでに出刃包丁を買ってきました / 年末とアンコウ
急に実家に用事ができたので、11月末頃、高知に帰っていました。
我々はまだ東京で消耗をしていますが、ジェットスターを使うことで、急な用事でも素早くかつ出費を抑えて四国に移動することができます。今回は成田から高松に向かう便に乗りました。機材繰りの影響により定刻から3時間遅れで成田を出発した飛行機は、定刻から3時間遅れで高松空港に降り立ちました。悲しいですね。
高松を出発して高知に向かった我々は、翌朝、なぜか岡山のホテルで目を覚まします。すべては乗り換えがわかりづらいように仕向けてきたJR四国のせいです。気づいたときには瀬戸内海を渡っていました。悲しいですね。
なんやかんやあってようやく高知に到着しました。結果としてみると、そんなに素早くもなかったですし、出費を抑えることもできませんでした。悲しいですね。
謎のキャラクターが全面に貼られた路面電車に揺られ、最寄り駅から3時間歩いて実家に帰りました。
いろいろと実家での所用を済ませ、土佐刃物流通センターに行ってきました。
高知県中部は刃物作りがそれなりに盛んな地域であり、江戸時代から続く「土佐打刃物」として有名です。土佐刃物流通センターは、特に刃物作りが盛んな地域にあり、土佐打刃物の商品が所狭しと並んでいます。
謎のナイフなどがあり、完全に欲しくなってしまいました。しかし今回探しているのは、前々から欲しい欲しいといっていた出刃包丁です。
6000円くらいで刃渡り6寸くらいの両刃の出刃包丁を買いました。さすが出刃包丁、つかっていて非常に重く疲れてしまいます。研ぐのも大変ですが、なんとかなれていきたいところです。
さて時は流れてクリスマスです。我々の地域では、クリスマスにはアンコウを食べるという習慣があります。この習慣の歴史は約3年前にさかのぼります。由来はとくになくなんとなくアンコウが食べたかったという流れですが、それ以来根付かせようとして地道に毎年アンコウを食べています。
この人は4.5kgのアンコウです。口の中が汚い。今回はお魚屋さんにアンコウをお願いしていまして、捌いておいてねと言ってみたわけですが、お魚屋さんにいってみると丸のままのアンコウが鎮座していました。捌く時間が無かったとのことで、まあアンコウはめんどくさいししかたないですね。
アンコウを捌くときには吊るし切りをしたりする文化がありますが、今回はふつうにまな板の上で捌いていきます。ああいった吊るし切りは、まな板にものせられないようなアンコウを捌くときに用いるものであり、このくらいの大きさであれば普通にまな板でなんとかなります。吊るし切りはしたことがないです。
アンコウを捌くと軟骨をぶった切ったりなんやかんやで包丁に無理をさせる場面が多いのですが、今回は出刃包丁を用いたことにより、包丁に力を加える際の安心感が生まれました。包丁自体の重さにより力の加え方も楽になり、非常によかったという感想です。
というわけで無事捌かれたアンコウくんは、美味しいドブ汁になりました。Twitterでのお知り合いと顔を合わせることもでき、この一年を総括するよいアンコウでした。
さてもう2017年も最終日。コミケ3日目にいかれるみなさんも、実家に帰るみなさんも、だらだらするみなさんも、よい一年を過ごされましたでしょうか。来年も、よいお年をお迎え下さい。
特定キーワードを含む過去のツイートを削除する
インターネットのオタクのみなさんこんにちは。今日もTwitterをしていますか?
我々のようなインターネット・ツイッター・オタクは、Twitterがないと死んでしまうことがあります。そんなTwitterでは今、凍結がブーム。皆さんカジュアルに凍結されておりますが、我々はアカウントが凍結されてしまうと生死に関わります。なぜなら我々はインターネット・ツイッター・オタクであるからです。
凍結の理由にはいろいろあるみたいなのですが、"殺す”だとか”死ね”だとかって投稿していると、それが他ユーザへの脅迫であるとして凍結されてしまうことがあるようです。長くインターネットを過ごしているといろいろとあるもので、そんな投稿をしていた人は少なくないと思います。そのような過去は削除して、クリーンなインターネットを目指していきましょう。