ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2013年11月3日日曜日

JavaScriptからAWSのSDKを使って格安ブラウザゲー運用を目論む

ブラウザからAWSのサービスが使えたらどうなの?

先日、ブラウザのJavaScriptに対応したAWSのSDKのプレビューが公開された。
JavaScriptではこれまでもNode.js版は用意されていたがこっちはブラウザ用である点が違う。現在のところS3、DynamoDB、SQS、SNSが対応している。公式ドキュメントはNode.jsと共通なのでぱっと見ほかも使えそうに見えるが、ブラウザ版を利用したときはクラスが存在せず使えない。

で、これが何に使えるのかっていうと、EC2を使わないでもデータやファイルの保存なんかが出来るっていうことだ。それができれば、個人でやるような小規模なプロジェクトならかなり安く運用できる可能性が出てくる。たとえば艦隊くりっかーはクッキーに保存しているので破損しやすく、容量もそう増やすわけにはいかないけど、もしかするとこれをさほどのコストをかけずに安定した大容量のセーブに対応させられるかもしれない。さらにログインに対応させて、複数の機器や、出先でもセーブデータを共有するようなことだって可能だろう。

それって今までだって出来たんじゃね?

もちろんこれまでだって、EC2を使えば同じことは達成できた。
しかしAWSではEC2を使うとすぐに課金額が大きくなってしまう上、時間で課金されるのでなかなかその部分を圧縮するのは難しい。収益が見込めるような事業で使うならEC2は便利でコストメリットもある程度あるし、一時的に大量のサーバーが必要なんて用途にはばっちりくる。だが個人が24時間落とさないで稼動させる用途で使おうと思うと、驚くほど安いとかそういう感じではなくなる。

たとえば個人でブラウザゲームを作って、それを安定稼動させようとすると一台では障害時に安定稼動しないし、かといって複数台構成にしてELB使うなんてことになるとさらにに金も手間もかかってしまう。一番小さなマイクロインスタンス一台だけでも月1,000円近くかかる。
思いつきでアホなゲームを公開するのに月に3,000円も4,000円も継続的にかかっていては寛容な我が家の大蔵省だってあまりいい気はしないだろう。しかもこれは稼動させている限りずっとかかる。

艦隊くりっかーはどうしているのか、というとあれはサーバーサイドとの通信がまったくないのでS3についているホスティングサービスを使っている。これはファイルさえ置いておけばホスティングをしてくれるというもので、1GBあたり月10円支払っておけばあとは転送料分だけ支払えばよい。これの何がいいのかというと、ウケなくて誰も使わなければお金がかからないという部分だ。これが上記みたいにEC2を動かしたりすると、誰もやっちゃいないのに月に何千円も支払うことになる。こんなに悲しいことはない。
そのあたりは以前詳しく書いた。

AWS S3で安くて頑丈なWebサーバーを立てる/艦くりのバックボーン - ばかおもちゃ製作所

これがEC2抜きで、たとえばファイルならS3、データならDynamoDBに直接アクセスして利用できるようになれば管理の手間もコストもぐっと下がる。もちろんそれぞれのサービスに利用するための費用は必要だがS3はもともとかなり安いし、DynamoDBは人気がなければ予約帯域みたいなもんを無料枠まで引き下げればタダで使うことができる。

DynamoDBってなんなん?

高速なNoSQLでつまりセーブデータを保存するような用途に結構向く感じのサービス。
課金はデータの保存量と一秒間にどれくらい書き込み・読み込みできるかという性能で決まる。一秒間に5KB(5ユニット)の書き込みと10KB(10ユニット)の読み込みまでは無料。書き込みは10、読み込みは50増やすごとに月600円弱くらいかかるっぽい。
それで実際どれくらい動かせるのかは、正直やってみないとわからない。
艦隊くりっかーの多かった時期で同時アクセス400弱くらいだったので、まあ昔ながらのRPGみたいな10分に一回くらい保存するものなら、400人が6000秒に一回保存するわけで、1セーブデータを1KBに納められたなら無料枠で大丈夫じゃないかという気がする。

ブラウザから直接アクセスって危なくないのん?

そこが今回の発表で一番大事なところ。
というか私が今回知っただけで実際には今回の発表より以前にAWSはIAMという権限管理のシステムで、facebook、Amazon(たぶんアメリカのアカウントのみ)、Googleの認証情報でログインできるという拡張を行っていた。見たことがあると思うが、ツイッターアカウントでログインするとか、そういう感じのやつのことだ。これを設定しておいて、各サービスの認証画面を呼び出し、承認後帰ってきたトークンをAWSに渡せばあらかじめ付与しておいた権限が与えられる。つまりAWSへのアクセス権限のある鍵をブラウザ上から送る必要はなくなり、鍵が流出してS3を誰かのエロ画像の保管庫にされたり、テロリストの情報交換用の掲示板を作られたりする心配をしなくていい。
さらに各サービスで認証IDに紐付いた権限を設定できるようになっているので、正規アクセス権のある人がDynamoDBへのリクエストを書き換えてほかの人のゲームデータを横取りしようとしても、それは出来ないようにすることができる。これはS3でも同様だ。パスの一部にアカウントIDを含めて、その認証アカウントじゃない場合はアクセスできないようにすることができる。

具体的にどうやんの?

次回書く。というか一日かけてやっとある程度わかったので前置きだけですごい長くなっちゃった。