この記事について
Auth0のログは最も上位のEnterpriseプランにおいても30日間とかなり短いです。
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側の設定
Monitoring-> Streams -> Create Log Streamに移動します。
AWSアカウントID、リージョン、を入力します。それ以外はデフォルトで良いです。
これでAuth0側の設定は完成です。
EventBridgeの設定
AWSマネジメントコンソールからEventBridgeの画面を開きます。
パートナーイベントソースを見ると、auth0のイベントソースが表示されています。
Cloudwatch Logsの設定
Cloudwatch Logsの画面に移動して、ロググループを作成します。
(ロググループ名は/aws/eventsという名前からはじまる必要があります)
EventBridgeの画面から、ルールを作成します。(イベントパスをdefaultから作成したauth0のものに変更します)
ターゲットタイプをCloudwatch Logsロググループにして、先ほど作成したロググループを選択します。
それ以外はデフォルトで良いので、全て入力してルールが作成されたことを確認します。
動作確認
そしてAuth0にてUsersからユーザを作成します。((Auth0にてロギングされることがメインなので、それができれば何をしてもいいですいいです。)
Cloudwatch Logsにてログが転送されていることを確認します。
[応用] 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 -> EventBridge -> Cloudwatch Logs
Auth0 -> EventBridge -> Lambda -> Cloudwatch Logs
Lambda関数の作成
以下のコードでLambda関数を作成します。
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のものにして、ルールを作成します。
これ以外はデフォルトでルールを作成します。
以上で実装は完了です。
動作確認
再度Auth0にてユーザを作成します。(Auth0にてロギングされることがメインなので、それができれば何をしてもいいですいいです。)
Cloudwatch LogsにてLambdaにて書き込み先として指定したログストリームを確認します。
ご覧の通り、detail.data配下のフィールドのみに絞られました。
参考:加工前のログ