[レポート]エイリアンアタック!インベーダーゲームで学ぶサーバーレス #reinvent

re:Invent 2019 ワークショップセッション GPSTEC406 - AWS Alien Attack workshopのレポートです。ゲームを題材に、サーバーレスアーキテクチャにおいて各レイヤーにどのような選択肢があるのか、またその選定方法について学べ、かつ手を動かして学ぶこともできたのでとても良いセッションだったと感じました。
2020.02.29

セッションは、会場中のラップトップから響く、ゲームのピコピコ音から始まりました…

re:Invent ワークショップセッションのイベントレポートです。

セッションタイトルと概要

GPSTEC406 - AWS Alien Attack workshop

このAWS Alien Attack workshopはサーバーレスアドベンチャーであり、サーバーレスゲーム環境を構築してリアルタイムデータ処理を活用する方法、および同じアーキテクチャを異なるコンテキスト(販売レポート、金融取引、IoTシナリオなど)に適用する方法をご紹介します。各レイヤー(セキュリティ/データの取り込み・消費/処理/保存)と、その各レイヤーでの適切なサービスの選択方法についてお伝えします。そこから、あなた独自のバージョンのゲームの構築プロセスへとご案内します。

スピーカー

  • Chaitra Mathur - Sr Partner SA, Amazon Web Services
  • Fabian Martins Da Silva - Senior Solutions Architect, Amazon Web Services

セッションレポート

まずは、サーバーレスアーキテクチャで構築された所謂インベーダーゲームを皆でプレイしました。単に個々人で遊ぶのではなく、制限時間内のハイスコアを競いあう形式になっていました。勝者には特製Tシャツを贈呈。

ゲームは、複数人のプレイヤーと一人の管理者で実施されます。管理者は専用の画面で参加プレイヤーの得点状況を確認できます。

その後、このゲームのアーキテクチャーの紹介がありました。

  • 管理者はSystem Managerでセッション(=複数人プレイヤーが得点を競い合う単位)を開始、セッション情報をDynamoDBのテーブルに保存
  • プレイヤーは、APIGateway経由でLambda関数を実行してセッションに参加
  • 管理者、プレイヤーとも認証にCognitoを使用
  • 各プレイヤーの発射段数、エイリアンキル数、残機などのデータが逐次Kinesis Data Streamsに送信される。管理画面ではリアルタイムでその途中経過を閲覧可能
  • ゲームデータはKinesis Firehose経由でS3に貯まる

ここから、セッション概要にあったとおり各レイヤーについて解説が入ります。

セキュリティレイヤー

Cognito

  • 認証処理実装したことある?またやりたいと思う?思わないよねー
  • Cognitoでサインイン、サインアップ、二要素認証、メール経由での確認などが簡単に実現できる
  • 50,000ユーザーまで無料
  • 今回のAlienAttackではプレイヤーグループと管理者グループとふたつのユーザーグループを作り、それぞれの権限を定義した。こういったグループごとの権限統制機能は金融はヘルスケア業界といった規制の厳しい業界でも役立つはずだ
  • たくさんのインテグレーションがある。API Gatewayをはじめとした各種AWSサービスとのインテグレーションはもちろんのこと、独自の認証システムや、ソーシャルログインなどとも統合可能

データの取り込み・消費レイヤー

データ取り込みレイヤーで選択肢となるサービスは上図の4つ(API Gateway / Kinesis Data Streams / IoT Core / AppSync)です。今回はAPI Gateway と Kinesis Data Streamsを選択しました。

API Gateway

API Gatewayを導入するとデータ取り込みレイヤーにおいて包括的なコントロールをすることができます。これが、今回IoT Coreを使わなかった、また直接Kinesis Data Streamsにアクセスさせなかった主な理由です。

以下図overviewにあるとおり、API Gatewayはエッジにデプロイすることも、オリジナルのエンドポイント(図内のRegionalの部分)を使うことも、Privateにデプロイすることもできます。

また、色々なものをAPI Gatewayのバックエンドに置くことができます(図内右列)。各種AWSサービスやオンプレミス、またあらゆるHTTPエンドポイントなどです。

APIサービスをスクラッチで作ると、こういった機能を実装するのは非常に大変です。特にスロットリングやセキュリティを考慮すると。ですのでAPIサービスを作る際はAPI Gatewayを使うことを検討しましょう。

Kinesis Data Streams

Kinesis Data Streamsのスケールの単位はシャードです。1シャードは 1MB/sec のinと 2MB/sec outの性能があります。もし50MB/sec のinが必要なのであれば、50個シャードを用意しましょう。

Kinesis Data Streamsは他のエンドポイントとの統合が簡単です。Lambdaでデータの取り出しができます。Kinesis Data Firehoseも使えます。Kinesis Data AnalyticsやKCL(Kinesis Client Library)も利用可能です。AlienAttackではLambdaとKinesis Data Firehoseを使っています。

データ処理レイヤー

  • LambdaがFargate とAnalyticsに勝る点はコスト。セッション終了後に課金されない
    • 将来四六時中プレイヤーが居るような状態になったらLambdaから移行するのはあり
  • Kinesis Data AnalyticsはSQLライクな処理が書けるので便利

ストレージレイヤー

たくさんの選択肢があります。

ですが、今回のAllien Attackで保存するデータの特長を考えてみましょう。以下のような特長があります。

  • 120バイトのJSONペイロード
  • セッションID、ゲーマー(プレイヤー)ID、もしくはそれらをタイムスタンプと組み合わせたデータを使用する
  • SQL(RDS)的な処理、LIKE句を使って検索とか、GROUP BYとかJOINとか、は不要。シンプル

こういった理由から今回我々はDynamoDBを採用しました。

他には

  • Systems Manager(のParameter Store)を使って一部データを保存しています。
  • S3をKinesis Firehoseと組み合わせて使ってデータレイクを実現します。
  • Kinesis Streamsを再度使用しています。ストレージ用途として。Kinesis Streamsはデフォルトで24時間データを保存しますが、最大7日まで引き伸ばすことができます。これによりキャッシュレイヤーとして使うことができます。これは非常に重要です。もしデータ処理レイヤーで問題が起きたとしても、データ損失を防ぐことができます。

この先はもくもくタイムです。各自ワークショップに取り組みました。ワークショプの内容は以下で公開されています。

二部構成になっていて、レベル1はゲームのバグを逐次修正していく内容です。修正の過程で以下を学ぶことができます。

  • CDKの使い方
  • RBAC (Role-Based Access Control) - CognitoユーザーグループとIAM Roleを紐付けてCognitoユーザーに各AWSリソースへのアクセス権限を与える / グループごとに与える権限を分ける方法
  • Cognitoユーザーをグループに追加する方法
  • Systems Manager Paremeter Storeの使い方
  • Kinesis Data StreamsとLambda関数の連携方法
  • Kinesis Data Firehoseのdelivery streamsの作成方法

レベル2では新機能を実装します。過程で以下を学ぶことができます。

  • API GatewayのバックエンドにLambda関数を追加
  • API GatewayでのWebSocket API作成方法
  • フロントエンドのデプロイ方法。CloudFront経由か S3バケットをパブリックにするか

感想

ゲームというとっつきやすいものを題材に、サーバーレスアーキテクチャにおいて各レイヤーにどのような選択肢があるのか、またその選定方法について学べ、かつ手を動かして学ぶこともできたのでとても良いセッションだったと感じました。

スライド