Amazon EventBridgeとAuth0を連携!S3にイベントログを格納する #reinvent #Auth0JP #Auth0アドカレ

Amazon EventBridgeとAuth0が連携!

re:Invent 2019の期間中、Amazon EventBridgeにアップデートがあり Auth0との連携がサポートされました! 現在はBETAリリースとなっています。

個人的にはAmazon EventBridgeがローンチされてから首を長くして待っていたアップデートで、Auth0が公式にサポートされたことを非常に嬉しく思います。

本記事では、Amazon EventBridgeとAuth0を連携し「Auth0のイベントログをS3に格納する」という機能を試してみました。

改めて「EventBridge」とは?

EventBridge自体が比較的新しいサービスですので、まずは改めて前提知識をざっくり学びましょう。

Amazon EventBridge は、独自のアプリケーション、SaaS (Software-as-a-Service) アプリケーション、AWS のサービスからのデータを使用してアプリケーションどうしを簡単に接続することを可能にするサーバーレスイベントバスです。EventBridge は、Zendesk、Datadog、Pagerduty などのイベントソースからリアルタイムデータのストリームを配信し、そのデータを AWS Lambda などのターゲットにルーティングします。お客様は、データの送信先を判断するためのルーティングルールを設定して、すべてのデータソースにリアルタイムで反応するアプリケーションアーキテクチャを構築できます。EventBridge では、イベントの取り込みと配信、セキュリティ、承認、エラー処理が自動的に行われるため、イベントドリブンアーキテクチャを簡単に構築することができます。

AWS公式ページ より引用

シンプルな名前を付けるとするならば マネージドイベントバスサービス です。あるサービスにおけるあるイベントを契機としたLambda処理などを丸っと構成することができます。

EventBridgeが登場するまではどうしてもピタゴラスイッチ的になりがちだったサーバーレスアーキテクチャ(あるいはイベント駆動型のアーキテクチャ)をよりマネージドにすることができるというわけです。

イベントソースには、AWSの各サービス、SaaSアプリ、独自アプリなどを用いることができ、Ruleによってイベントのフィルタリングをした上でAWS Lambda、Amazon Kinesis Data Firehose、Amazon SNS、またはそれ以外のターゲットに流すことができます。

AWS公式ページ より引用

Amazon EventBridgeとAuth0の連携でできること

Amazon EventBridgeとAuth0を組み合わせることで、Auth0のイベントが発生するたびにイベントログがEventBridgeにプッシュされるようになります。EventBridgeを経由してAWSの各サービスと接続し、様々なユースケースに簡単に対応できるようになります。

Auth0公式ブログ より引用

例えば以下のようなユースケースに対応できます。

カスタマーエクスペリエンスの強化

AWS Lambdaと連携することで、Auth0のイベントを契機にカスタマイズされたエクスペリエンスを提供することができます。例えば初回ログイン時に製品を紹介するフローを提示したり、ログインの動作に応じてユーザーが関心のあるコンテンツを強調したりするなどといったことができます。

より細やかなユーザーの分析

Amazon QuickSightと連携することで、ユーザーのログインイベントから得られる情報(例えばデバイス、ブラウザ、言語、トラフィックなど)を集約し、ダッシュボードやML Insightなどを作成することができます。ログインや会員登録といったユーザーにとっての「はじめの一歩」について、より細やかなユーザー分析が行えるようになります。

ユーザーデータの管理

昨今のGDPR(EU一般データ保護規則)に見るように、プライバシー法に準拠するためのユーザーアクションの保持と監査は非常に重要です。Auth0単体ではイベントログの保持期間は限定的であるため、Amazon S3と連携することで、Auth0のイベントログを永続化できます。またAmazon Athenaと組み合わせることで、永続化したイベントログデータをクエリ言語を使って簡単に検索できるようになります。

Auth0のイベントログをS3に格納してみよう

それでは、今回はAmazon EventBridgeを使ってAuth0のイベントログをS3に格納してみたいと思います。

Auth0のLog Integration設定

まずはAuth0のダッシュボードのサイドメニューから「Log」を開きます。NEW として「Integrations」が表示されていることが確認できると思います。AWS Account IDとAWS Regionを設定します。

StatusがActiveになれば接続成功です。Auth0側の設定はこれだけです!

Partner event sourcesの確認とEvent Busの作成

Auth0のLog Integration設定が完了すると、EventBridgeのコンソールの「Partner event sources」でAuth0との連携したリソースが確認できます。表示されない場合は、リージョン違いなどをしていないか注意いただいた方が良いかと思います。

詳細を開き Associate with event bus をクリックするとEvent Busが作成され、Auth0のイベントがEvent Busに送信されるようになります。

Event Busが作成できました。

Kinesis Firehoseの作成

次にイベントストリームデータをS3に格納するためにKinesis Firehose delivery streamsを作ります。

本記事ではdelivery streamsの作り方は割愛します。以下の記事を参考に作成してください。

[新機能]Amazon Kinesis FirehoseでS3にデータを送ってみた #reinvent

Ruleの作成

次にRuleを作成します。ここでのRuleはAuth0のRuleではなく、EventBridgeのRuleなのでご留意ください。「Create rule」をクリックします。

Name は適当に auth0-event-logs としました。

Define pattern では Event pattern を選択、Event matching patternPre-defined pattern by service を選びます。Service providerService partnersService nameAuth0 を選ぶと、Auth0のイベントパターンをマッチングさせた設定が自動で行われます。

Select event busCustom or partner event bus を選び、先ほど作成したEvent Busを設定します。

Select targets は、イベントの送信先を設定します。今回はFirehose経由でS3に格納したいので、Firehose delivery stream を選びます。Service Roleも新規に作成しましょう。

以上で設定が完了です。

ログの確認

Auth0のテナントでログインイベントなどが発生すると、Firehose経由でS3にログデータが格納されます。パスは YYYY/MM/DD/HH の形式で切られています。

ログデータを整形し、確認してみました。ログインしたユーザーおよびデバイスの数多くの情報が含まれていることが確認できます。

{
  "version": "0",
  "id": "192b4321-d34a-2b8e-3c87-819434be53c4",
  "detail-type": "Auth0 log",
  "source": "aws.partner/auth0.com/classmethod-demo-1cfb5c33-a2af-4ea4-a6ee-799de196b362/auth0.logs",
  "account": "486094815342",
  "time": "2019-12-12T15:58:23Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "log_id": "90020191212155725426000495718238468680099562393941573746",
    "data": {
      "date": "2019-12-12T15:57:22.903Z",
      "type": "s",
      "connection": "line",
      "connection_id": "con_dcj11Ny8YpQD7GKV",
      "client_id": "4hPgW4Y3AdCmPU0nDJHs9KDBLdbaEvZ0",
      "client_name": "All Applications",
      "ip": "xx.xxx.xxx.xx",
      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
      "details": {
        "prompts": [
          {
            "name": "federated-authenticate",
            "initiatedAt": 1576166223711,
            "completedAt": 1576166242861,
            "connection": "line",
            "connection_id": "con_dcj11Ny8YpQD7GKV",
            "strategy": "line",
            "identity": "U86761307f1f12c8ea346d5d79d712fe0",
            "stats": {
              "loginsCount": 11
            },
            "elapsedTime": 19150
          },
          {
            "name": "login",
            "flow": "universal-login",
            "initiatedAt": 1576166223706,
            "completedAt": 1576166242863,
            "user_id": "line|U86761307f1f12c8ea346d5d79d712fe0",
            "user_name": "Yuki Suwa",
            "elapsedTime": 19157
          }
        ],
        "initiatedAt": 1576166223698,
        "completedAt": 1576166242903,
        "elapsedTime": 19205,
        "session_id": "NnaJ4MVXPZ6XPDXr34Tu-6AUumiR0D7E",
        "device_id": "v0:6ff0d550-f633-11e9-b714-f70e63990815",
        "stats": {
          "loginsCount": 11
        }
      },
      "hostname": "classmethod-demo.auth0.com",
      "user_id": "line|U86761307f1f12c8ea346d5d79d712fe0",
      "user_name": "Yuki Suwa",
      "strategy": "line",
      "log_id": "90020191212155725426000495718238468680099562393941573746"
    }
  }
}

Auth0のイベントデータをフル活用したい場合はかなり有用!

Auth0の全てのログデータを永続化し、いつでも活用できる状態にしておく方法としては最適なのではないでしょうか。 さらにはS3 Glacierと組み合わせると、膨大に溜まり行くログのコスト削減も行うことができます。Auth0とAWSを組み合わせてシステムを構築されている場合は、ぜひEventBridgeも活用することをおすすめします。