[レポート] サーバーレスのオンラインゲームとリアルタイムのリーダーボードを構築する #SVS302 #reinvent

2019.12.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部@札幌の佐藤です。現地時間 12/2 ~ 12/6 まで行われている re:Invent 2019 に参加するためラスベガスに来ています。 re:Invent2019 のワークショップ「Build a serverless online game and real-time leaderboard」レポートです。

ワークショップ概要

Many workloads have a common pipeline for ingesting, processing, storing, and consuming data. If you are trying to ingest data in real time, what options are available to you? Join this workshop to implement a serverless streaming architecture. While playing Alien Attack, you learn about how to select the appropriate services for your needs and how to leverage the same architecture for near-real-time processing in scenarios such as sales reporting, financial transactions, IoT applications, and many more.

多くのワークロードには、データの取り込み、処理、保存、および消費のための共通のパイプラインがあります。 リアルタイムでデータを取り込もうとする場合、どのようなオプションが利用可能ですか? このワークショップに参加して、サーバーレスストリーミングアーキテクチャを実装してください。 Alien Attackをプレイしながら、ニーズに適したサービスを選択する方法と、販売レポート、金融取引、IoTアプリケーションなどのシナリオでほぼリアルタイムの処理に同じアーキテクチャを活用する方法について学習します。

ワークショップURL

ワークショップで使った資料とソースコードです。個人のAWS環境などにデプロイしてワークショップを体験することができます。興味がある方は以下のURLからお願いします。注意としては Kinesis Data Streams、Firehose、DynamoDBなど多くのリソースをCloudFormationで作成するので、そのまま放置しておくと課金が発生してしまいますのでご注意ください。ワークショップが終わったらすぐにCloudFormationを削除して、余計な課金がかからないようにしましょう。

Serverless alian attack workshop URL

https://alienattack.workshop.aws/

https://serverless.alienattack.ninja/

ソースコード

https://github.com/dwmkerr/spaceinvaders

レポート

インベーダーゲームをベースにサーバーレスアーキテクチャを学ぶ

上のようなWebベースのインベーダーゲームをベースに、オンラインでインベーダーゲームのスコアを競い合うサーバーレスバックエンドを作成するワークショップでした。サーバーレスのアーキテクチャの中でも特にストリーミングにフォーカスした内容になっています。スコアはリーダーボードとしてブラウザ上にリアルタイムで反映されていきます。

インベーダーゲームの要件

今回のインベーダーゲームでは、以下の4つの要件があります。

  • セキュリティ(RBAC: ロールベースアクションコントロール)
    • Congito
    • IAM
  • リアルタイムプロセッシング
    • Kinesis Data Streams
  • 長期保管するストレージ
    • S3
  • インフラストラクチャのコストを最小限に抑える
    • サーバーレスアーキテクチャ

メッセージプロセッシング VS ストリームプロセッシング

メッセージプロセッシングとストリームプロセッシングの違いについてです。

メッセージプロセッシング

こちらはメッセージキューサービスであるSQSなどが該当します。

  • 個々のメッセージは処理単位
  • メッセージごとに計算/処理
  • メッセージの発生はさまざま
  • 組み込みのDLQ(デッドレターキュー)機能
  • メッセージは処理後に削除されます
  • 処理したデータの位置を追跡する必要はありません

ストリームプロセッシング

こちらはストリーム処理なので、Kinesis Data StreamsやDynamoDB Streamsが該当します。

  • メッセージストリームは処理単位です
  • 多くのメッセージの複雑な計算
  • メッセージの一定の流れ(ストリーミングなので、データが常に流れています)
  • 組み込みのDLQ(デットレターキュー)機能はありません
  • メッセージは消費後、有効期限まで利用可能です(Kinesis Stremasは最低24時間データが保持されます)
  • 各クライアントは、ストリーム内の現在の位置を追跡する必要があります

リアルタイムとニアリアルタイム

  • データは時間とともに急速に価値を失います
  • タイムクリティカルなもの
  • 従来の「バッチ」ビジネスインテリジェンス
  • 意思決定に対するデータの価値
  • 意思決定における情報の半減期
  • 予防/予測

時間と共に急激に価値を失ってしまうデータ、意思決定に使用するデータなどデータに鮮度がある場合にリアルタイム処理は役立ちます。従来ではバッチ処理後にビジネスインテリジェンス(BIツール)で分析などを行っていたが、最近では、リアルタイム/ニアリアルタイムで処理・分析するアーキテクチャがが注目されています。

なぜサーバーレスで作るのか

  • インフラストラクチャのプロビジョニングなし、
  • 管理なし
  • 自動スケーリング
  • 使った分の従量課金性
  • 高可用性と安全性

インベーダーゲームアーキテクチャ

以下のような本格的なサーバーレスアーキテクチャをデプロイします。

以下、解説です。

  • インベーダーゲーム自体は、WebベースのSPA(シングルページアプリケーション)で作られているため、S3 + CloudFront + Route53でホスティングしています。
  • Gamers(ゲームをプレイするエンドユーザー)はSPAのログイン画面から、AWS SDKを使用してCognitoで認証を行いログインします。
  • ゲーム参加者のセッション情報、設定値などは、API Gatewayから直接Systems Managerのパラメータストアの値を更新しています。(こんな使い方もあるのかと参考になりました)
  • 以下のようにインベーダーに対して弾を発車したタイミングでAPI Gatewayにリクエストが投げられます。

  • API Gatewayは受けとった弾丸情報をそのままKinesis Data Streamsに投げます。Kinesis Data StreamsからLambdaを起動して、弾の発射回数、スコアの情報(インベーダーに弾が当たったのか外れたのかなど)をDynamoDBに保存しています。DynamoDBには常にスコア上位10位が保存されるようになっています。
  • 全参加者のデータもちゃんと保存されています。Kinesis Data StreamsからKinesis Firehose を経由してS3に全てのデータを保存しています。
  • Manager(スコアボードをみるWebサービス)が別で用意されていて、ここにリアルタイムで上位10位の参加者のランキングが反映されています。このサービスもSPAになっているため、S3 + CloudFront + Route53でホスティングされています。
  • Managerは AWS SDKを使用して、DynamoDBから直接データを受け取り、リアルタイムにランキングに反映しています。

ワークショップ内容

実際にやっていただきたいので、詳細は記述しません!

感想

インベーダーゲームを題材に、これでもかとサーバーレスのアーキテクチャを詰め込んだ素晴らしいワークショップでした。サーバーレスを学んでいる中で、API Gateway + Lambda + DynamoDBのアーキテクチャは理解できた、次のステップを理解したいとなった方にとても参考になるかと思います。API GatewayやLambdaはなんとなくサービスのイメージがつきやすいかと思います。私もそうでしたが、Kinesis Data Streams や Kinesis Data Firehoseなど、サービス名は知ってるけど具体的に何に使えるの?これを使ったら何がうれしいの?とわからないことだらけでした。このようなサービスは実際に使ってみないとイメージが沸きづらいサービスかと思いますので、このようなワークショップを実際にデプロイして動かして、勉強していくのが良いと思いました。