[レポート] [ワークショップ] ラスベガス カジノのテックマネージャーになりカジノにやって来る”ハイ・ローラー”の行動を Amazon MSK と Amazon Managed Service for Apache Flink で検知する #AWSreInvent #ANT401-R

2023.12.27

こんにちは、SHIOです。

数ヶ月前に DAS に合格したのですが、試験勉強の際に Amazon MSK と Amazon Managed Service for Apache Flink の連携について勉強をしました。今回こちらのサービスを使用したワークショップが re:Invent にあることを知り、実際にハンズオンをやってみたく参加をしてきました!シナリオが面白そうで興味をひかれたことも理由のひとつです。

ワークショップ:
ANT401-R | Event detection with MSK and Amazon Managed Service for Apache Flink

こちらのワークショップの様子をレポートします!

概要

In this workshop, take on the role of a technology manager for a Las Vegas casino. Learn how to create a stream-processing application that identifies historically “high roller” casino guests entering the casino and that sends you an email when they sit down at a gambling table. To do this, use Amazon MSK to capture events, Amazon Managed Service for Apache Flink to detect events of interest, and AWS Lambda with Amazon SNS to send you an email for any events. You must bring your laptop to participate.

 

このワークショップでは、ラスベガスのカジノのテクノロジー・マネージャーの役割を担います。カジノに入場する歴史的に「ハイローラー」なカジノ客を識別し、彼らがギャンブルテーブルに座ったときにメールを送信するストリーム処理アプリケーションの作成方法を学びます。これを行うには、Amazon MSKを使用してイベントをキャプチャし、Amazon Managed Service for Apache Flinkを使用して関心のあるイベントを検出し、AWS LambdaとAmazon SNSを使用してイベントがあればメールを送信します。参加にはラップトップが必要です。

レポート

ラスベガスのカジノのテックマネージャーになり、カジノに来る "ハイローラー" を識別し、行動(イベント)を記録&検知する仕組みをつくります。

ハイローラーとは、大金を賭ける人のことです。
この "ハイローラー" たちが、不正行為をしていないかも確認します。

アジェンダ

  • What challenge are we solving?
  • Stereaming concepts
  • Amazon MSK and Amazon Managed Service for Apache Flink
  • Architecture overview
  • Hands-on workshop
  • Lesson learned

What challenge are we solving?

Challenge statement

ゲーミング施設は、常連客にカジノに滞在してもらうためのインセンティブを提供することを好み、不正行為者を捕まえたいと考えています。

  • インセンティブの提供...例えば無料の食事?
  • 不正行為者の特定
  • テーブルが追加チップを必要とするタイミングを知るようにする

How?

  • Amazon Managed Streaming for Apache Kafka(Amazon MSK)へのリアルタイムイベントの取り込みと、Amazon Managed Service for Apache Flink Studioによるイベント処理
  • SQL がメイン。Pythonもすこし
  • Amazon Managed Service for Apache Flink、AWS Lambda、Amazon SNSなど

Streaming concepts

  • Stream storage
  • Stateful stream processing
  • Windowing
     - Tumbling, sliding, session global
  • Event time

Amazon MSK and Amazon Managed Service for Apache Flink

今回のワークショップのメインとなるサービスについての説明がありました。

Amazon MSK

  • Apache Kafka および Kafka コネクトクラスタのプロビジョニング、設定、チューニングを自動化する

  • 認証と認可のためにAmazon VPCへのネイティブな統合を使用して、セキュアでプロダクション対応のアプリケーションを簡単にデプロイできる

  • Apache Kafka(オープンソース) との完全な互換性

  • フルマネージドの Apache Kafka でコストを抑え、他のプロバイダーの1/13のコストで提供

Amazon Managed Service for Apache Flink

  • Amazon Managed Service for Apache Flinkは、Apache Flinkを使用してリアルタイムでストリーミングデータを変換・分析する最も簡単な方法

  • Apache Flink アプリケーションを継続的に実行し、セットアップ費用やサーバー管理なしで自動的に拡張する

  • Amazon Managed Service for Apache Flink Studioでマネージド Apache Zeppelin ノートブックを使用してストリーミングデータをインタラクティブに分析

  • SQL、Java、Python、Scala でアプリケーションを構築し、結合、フィルター、タイムウィンドウ上の集計などを実行する

Architecture overview

ワークショップのアーキテクチャです。
大金を賭けているカジノに入場する顧客を識別して、大金を賭ける顧客がゲームテーブルに座ったときにEメールを送信するストリーム処理アプリケーションです。また、チップの補充が必要なテーブルを特定し、ベットや勝利パターンからカジノの潜在的な不正者を特定します。

  • Managed Streaming for Apache Kafkaを活用してイベントをキャプチャする
  • Managed Service for Apache Flink Studioを活用して興味のあるイベントを検出
  • Amazon Lambda と Simple Notification Service を活用してイベントがあればメールを送信する

Hands-on workshop

下記、ワークショップのモジュールです。

Module1: Produce Events using Managed Service for Apache Flink Studio
Module2: Identifying Events using Managed Service for Apache Flink Studio
Module3: Using AWS Lambda and SNS to trigger alerts
Module4: Promote your notebook to Managed Service for Apache Flink

Module1: Produce Events using Managed Service for Apache Flink Studio

Apache Flink Studio のマネージドサービスを使用し、Apache Kafka のマネージドストリーミングクラスターにゲームイベントを生成します。

Amazon Managed Service for Apache Flink コンソールに移動します。

今回は必要なものは全てAWS側にて用意してくれているため、すでにノートブックが起動しています。自分でワークショップを行うときは、用意されている CloudFormation を使います。

Studio notebook name をクリックすると、ノートブックに関する詳細情報が表示されます。右上にある Open in Apache Zeppelin をクリックします。

Apache Zeppelin: webベースのデータ分析ノートブック

Apache Zeppelin ノートブック が表示されるので、ワークショップのインストラクションに従い、Apache Kafka publisher notebook をダウンロードします。(これを使用して MSK クラスターにイベントを発行)

Import note からダウンロードしたファイルをインポートします。

インポート後、インポートされたファイル msk-data-publisher が表示されるのでそちらをクリックすると Apache Zeppelin ノートブック が起動します。

ノートブックに表示されている BROKERS 文字列を設定して、MSK クラスターへのメッセージのパブリッシュを開始します。

BROKERS 文字列は、MSK の方で確認します。
Amazon MSK -> Cluster name (MSKClusterForKDAStudio) -> view client information

"Bootstrap servers" の箇所から Plaintext の Private endpoint をコピーします。

Apache Zeppelin ノートブックに戻り、マークダウンヘッダー下の最初の段落で以下のように置き換えます。置き換えたあと、SHIFT + ENTER キー を押して、該当の段落を実行します。

BROKERS = "<< BROKER STRING GOES HERE >>"

* Syntax Error が出ないように、 BROKERS を設定したら実行前に記述が間違っていないか確認しましょう!(記述を間違えてしばらくハマりました)
* ノートブックの最初の段落の実行には開始されるまでしばらく時間がかかる場合があるとのこと(1分くらい。5分以上かかる場合は何か問題があります)

段落が正常に実行されると、ライブラリがダウンロードされ、変数が定義されていることが表示されます。

MSF Studio ノートブックから Kafka を管理をします。やり方はすべてノートブックに記載されているので、ディスクリプションを読む -> 実行していく を繰り返していきます。実行する内容は以下です。

  • トピックの作成
  • メソッドの定義
  • 顧客データの送信
  • カジノイベントの送信

Module2: Identifying Events using Managed Service for Apache Flink Studio

Module1 で MSK クラスターのマネージメントストリーミングを介してデータが流れるようになったので、次は Managed Service for Apache Flink Studio で Flink アプリケーションを実行します。

先ほどと同じようにノートブック(msk-data-analysis)のダウンロード&インポートを行います。

Managed Service for Apache Flink でインメモリテーブルを作成します。ステートメントを読んでから段落を実行します。Glueデータカタログ内のテーブルを確認していきます。

Glueデータカタログにある msfstudio データベースを選択します。2 で作成したテーブルがあるので、テーブルをクリックし Advanced properties を確認します。テーブルプロパティが表示されればOKです。

メモリ内のテーブルに対して Flink SQL、テーブル API コマンドを実行してイベントの検出を開始します。使用するノートブックは msk-data-analysis です。

クエリ1 - customer_data からすべてのデータを表示する

%flink.ssql(type=update)
SELECT * FROM customer_data;

クエリ2 - customer_data から active_user が True に設定されているデータを表示する

%flink.ssql(type=update) 
SELECT * FROM customer_data where active_user=true;

クエリ3 - casino_events と customer_data の間で結合を実行してアクティブな顧客 (active = true) のすべての カジノイベント を表示する

%flink.ssql(type=update)
SELECT * from casino_events 
JOIN customer_data 
on casino_events.customer_id = customer_data.customer_id
WHERE active_user = true;

どの顧客がどのゲームをプレイしているかが分かりますね。

クエリ4 - 顧客が短期間に多くのベットを獲得しているテーブルをすべて特定する

%flink.ssql(type=update)
SELECT * from (
SELECT table_id, SUM(gaming_event) as money_out
FROM casino_events
GROUP BY TUMBLE(PROCTIME(), INTERVAL '10' seconds), table_id)
WHERE money_out > 2000

money_out を 2000 にしていますが、これは $2000 を超える場合に結果を限定しています。これはテーブルにチップを補充する必要があることを意味しています。

クエリ5 - Match Recognize を使用して、データストリーム内の潜在的な不正行為者を特定する

不正行為者の特定は、プレイヤーが5回以上連続で勝った場合は不正行為である可能性が高いと定義しているようです。
ブラックジャックやスロットマシンなど、個々のハンドの勝率はランダムな確率ですが、5回連続で勝つのは疑わしいとのことで...面白いですねぇ。

そんなわけで上記のクエリ結果では、5回連続で勝っている顧客の一覧が表示されています。

クエリ6 - ゲームイベントの10秒のウィンドウを作成し、この10秒間のすべてのアクティビティを合計する

ここでは顧客の勝敗には関係なく、交換されるお金の急増を確認します。
※ INSERTステートメントのため、画面に結果は表示されません。

クエリ7 - 集計を視覚化させる

%flink.ssql(type=update)
SELECT * FROM customer_betting_aggregates;

ゲームイベントの10秒ごとの集計をグラフで確認できます。約1分間実行すると顧客の中で誰が最も多くの支出を行なっているかが判明します。(グラフのスクリーンショットを取っていなかったのでグラフ情報がありません...。)

Module3: Using AWS Lambda and SNS to trigger alerts

このセクションでは、高額支出のユーザが検出されるたびにEメールが送信されるようにします。

SNS (Amazon Simple Notification Servide) コンソールへいき、トピックを作成します。

次に Lambda 関数を作成します。
Labmda を使って MSK から読み込み、if文 で閾値を設定して高額消費ユーザを特定します。その結果を定義した SNS トピックに送信します。

Apache Flink Studio Zeppelin へ再度アクセスし、msk-data-analysis を開きます。Query 6 の段落を実行します。

1分以内にカジノ高額支出者に関するメールが届くはずなのですが、ここで結構つまずいてしまいました。メールが届かなかったです。。。
設定を確認したところ、有効にしたはずの Activate trigger が有効化されておらず再度オンにしましたがメールが届かないまま、タイムオーバー (ワークショップ終了) となってしまいました。あと少しだったのに残念です...。   

実際にハンズオンができたのはここまでですが、Module4 について簡単にまとめます。

Module4: Promote your notebook to Managed Service for Apache Flink

このセクションでは、 Managed Service for Apache Flink Studio notebook を Managed Service for Apache Flink にデプロイをする という内容です。

  1. Apache Flink Studio Zeppelin へアクセスし、msk-data-analysis を開きます。ここに最後のノートをインポートします。deploy-note-to-msf.zpln というメモをダウンロードし、Apache Flink Studio Zeppelin へアップロードします。

  2. ノートブック(deploy-note-to-msf) を開きます。ここからはまたノートブックにあるデプロイ方法の指示に従って対応していきます。

  3. Managed Service for Apache Flink にアプリケーションをデプロイします。

ワークショップの内容は以上です。

(余談ですが...)
クエリ5で、5回以上連続で勝っている不正行為をしている可能性がある顧客を特定しましたが、あまりカジノのことをよくイメージきておらず、どうやったら顧客がどのゲームをプレイしているのが分かるのだろう?と疑問に思っていました。
AWSの方に聞いたところ、各ゲームのテーブルにはマシンラーニングの技術が使われていてIoTと連携しているためそこで特定することができるとのことでした。(テーブルに名前を登録する箇所があってそこからトラッキングするとのこと...) カジノの中でも大金を賭ける場所って限られていると思うので、そういう場所はそのような仕組みが組まれているだなと思いました。

まとめ

ワークショップを通して、Amazon MSK と Amazon Managed Service for Apache Flink を実際に詳細な設定まで行えたことと、カジノという場所で特定の人々を検知するという仕組みを学ぶことができました。また、このレポートを書く際に再度調べ直しながら書いているので、ワークショップ時によく分からなかったことなどが明確になってさらに勉強になりました。
ワークショップ中の疑問はすべてAWSの方に聞けてクリアにすることが出来て良かったです。エキスパートがいるワークショップのメリットですね。

レポートは以上となります。
ここまで読んで頂きありがとうございました。

下記にワークショップのURLを貼りますので、興味のある方は是非試してみてください!

資料

Workshop | Event Detection with Managed Service for Apache Flink