0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Auth0のログをLambdaで加工してからCloudWatch Logsに転送する

Last updated at Posted at 2023-04-11

この記事について

Auth0のログは最も上位のEnterpriseプランにおいても30日間とかなり短いです。

image.png

30日間以上長期保存がしたい場合はCloudwatch LogsやS3などに転送する必要があります。

EventBridgeを利用すれば、Auth0のログを簡単にCloudwatch Logsに転送することができます。
さらに、EventBridgeは受け取ったデータをLambdaに渡すことができます。Auth0のログをLambdaで加工してCloudwatch Logsに転送する手順も記載します。

やること

  • [基本] Auth0のログをCloudwatch Logsに転送する
  • [応用] Auth0のログを Lambdaで加工してCloudwatch Logsに転送する

前提

  • Auth0のアカウントを所有していること(プランはFreeで良いです)
  • AWSアカウントを所有していること

[基本] Auth0のログをCloudwatch Logsに転送する

Auth0側の設定

Auth0にログインします。
image.png

Monitoring-> Streams -> Create Log Streamに移動します。
image.png

Amazon EventBridgeを選択します。
image.png

名前はなんでも良いです
image.png

AWSアカウントID、リージョン、を入力します。それ以外はデフォルトで良いです。
image.png

これでAuth0側の設定は完成です。

EventBridgeの設定

AWSマネジメントコンソールからEventBridgeの画面を開きます。
パートナーイベントソースを見ると、auth0のイベントソースが表示されています。

image.png

「イベントパスと関連づける」をクリックします。
image.png

チェックはしないで「関連づける」をクリックします。
image.png

カスタムイベントパスが作成されます。
image.png

Cloudwatch Logsの設定

Cloudwatch Logsの画面に移動して、ロググループを作成します。
(ロググループ名は/aws/eventsという名前からはじまる必要があります)

image.png

EventBridgeの画面から、ルールを作成します。(イベントパスをdefaultから作成したauth0のものに変更します)
image.png

名前はなんでも良いです。
image.png

特に入力は不要です。
image.png

こちらも入力は不要です。
image.png

ターゲットタイプをCloudwatch Logsロググループにして、先ほど作成したロググループを選択します。
image.png

それ以外はデフォルトで良いので、全て入力してルールが作成されたことを確認します。

動作確認

イベントパスの「検出を開始する」をクリックします。
image.png

そしてAuth0にてUsersからユーザを作成します。((Auth0にてロギングされることがメインなので、それができれば何をしてもいいですいいです。)
image.png

Cloudwatch Logsにてログが転送されていることを確認します。
image.png

[応用] Auth0のログを Lambdaで加工してCloudwatch Logsに転送する

Auth0からEventBridgeに転送されるログイベントは以下の形式をもつJSONです。

{
  "id": "623053cf-8e0f-9203-f464-e789cf18b0e2",
  "detail-type": "Auth0 log",
  "source": "aws.partner/auth0.com/example-tenant-635d694a-8a5a-4f1a-b223-1e0424edd19a/auth0.logs",
  "account": "xxxxxxxxxxxx",
  "time": "2020-01-29T17:26:50Z",
  "region": "us-west-2",
  "resources": [],
  "detail": {
    "log_id": "",
    "data": {
      "date": "2020-01-29T17:26:50.193Z",
      "type": "sapi",
      "description": "Create a log stream",
      "client_id": "",
      "client_name": "",
      "ip": "",
      "user_id": "",
      "log_id": ""
    }
  }
}

1階層目のdetail以外のフィールドはEventBridgeに関連するフィールドでAuth0のログに関するものではありません。detail.data内のデータがAuth0のログになります。

ここでは、このdetail.dataだけCloudwatch Logsに転送されるようにログを加工します。

EventBridgeのターゲットをCloudwatch Logsではなく、Lambdaにして、そのLambdaにてログの加工とCloudwatch Logsへの転送を行います。

(ちなみに、EventBridgeの入力トランスフォーマー機能を利用すれば、Lambdaを利用することなくdetail.dataだけを取得することができそうです。ただ今回はあくまでサンプルケースなのでLambdaを使います。)

[基本]Auth0のログをCloudwatchLogsに転送するの構成
Auth0 -> EventBridge -> Cloudwatch Logs
[応用]Auth0のログをLambdaで加工してCloudwatchLogsに転送するの構成
Auth0 -> EventBridge -> Lambda -> Cloudwatch Logs

Lambda関数の作成

以下のコードでLambda関数を作成します。

lambda_function.py
import json
import boto3
import time
import datetime

client = boto3.client('logs')

def lambda_handler(event, context):

    now = datetime.datetime.now()
    now_time = now.strftime('%Y%m%d%H%M')
    
    log_group_name = 'auth0/log'
    log_stream_name = now_time

    # ロググループの作成(存在していない場合)
    response = client.describe_log_groups(logGroupNamePrefix=log_group_name)
    if not response['logGroups']:
        client.create_log_group(logGroupName=log_group_name)
    
    # ログストリームの作成(存在していない場合)
    response = client.describe_log_streams(logGroupName=log_group_name, logStreamNamePrefix=log_stream_name)
    if not response['logStreams']:
        client.create_log_stream(logGroupName=log_group_name, logStreamName=log_stream_name)

    # ログイベントからdetail.dataを取得する
    try:
        message = event["detail"]["data"]
    except KeyError: # detail.dataフィールドがない場合はログストリームへの書き込みを行わず終了
        return {
            'statusCode': 400,
        }

    # Cloudwatch Logsログストリームへ書き込む        
    log_events = [{'timestamp': int(round(time.time() * 1000)), 'message': str(message).replace("\'", "\"")}]
    client.put_log_events(logGroupName=log_group_name, logStreamName=log_stream_name, logEvents=log_events)
    
    return {
        'statusCode': 200,
    }

Lambdaの実行ロールにはCloudWatchLogsFullAccessポリシーをアタッチしておきましょう。(本来ならもう少し厳しいカスタムポリシーを付与すべきですが、あくまで検証ということで緩い管理ポリシーを付与します)

EventBridgeルールの作成

EventBridgeのルール画面から、イベントバスをauth0のものにして、ルールを作成します。
image.png

名前は任意です。
image.png

イベントパターンをAuth0の全てのイベントにします。
image.png

image.png

ターゲットに作成したLambda関数を指定します。
image.png

これ以外はデフォルトでルールを作成します。

以上で実装は完了です。

動作確認

再度Auth0にてユーザを作成します。(Auth0にてロギングされることがメインなので、それができれば何をしてもいいですいいです。)

Cloudwatch LogsにてLambdaにて書き込み先として指定したログストリームを確認します。
image.png

ご覧の通り、detail.data配下のフィールドのみに絞られました。

参考:加工前のログ

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?