Amplify ConsoleのアクセスログをS3にアップロードする(EventBridge+Lambda)

2020.10.21

はじめに

Amplify Consoleでデプロイした静的ウェブサイトのアクセスログはユーザガイドにもある通り、コンソール画面から2週間のログを表示して確認することができます。アクセス数などログの分析するには、アクセスログをダウンロードする必要があるので日々のアクセスログをS3にアップロードできるように設定してみます。

構成

構成のポイントは、「ダウンロードURLを生成」です。generate_access_logsでダウンロードURLを生成し、Lambda関数の/tmp/配下にダウンロードしたアクセスログをS3にアップロードします。

Lambda関数の作成

関数名は任意、ランタイム「Python3.8」でLambda関数を作成します。

Lambda関数にアタッチされたロールにAmplifyおよびS3の権限を付与します。S3はAmazonS3FullAccess、Amplify関連はAWS管理ポリシー(FullAccessなど)がない為、ダウンロードURLを生成する権限(amplify:GenerateAccessLogs)を許可したポリシーを作成し、ロールにポリシーをアタッチします。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "amplify:GenerateAccessLogs",
            "Resource": "*"
        }
    ]
}

タイムアウトのデフォルト「3秒」は、何度かタイムアウトしてしまったのでタイムアウトを10秒とします。タイムアウトやメモリは、アクセスログのサイズにより変動しますので検証をオススメします。

Lambda関数のコードは、以下の通りです。


import datetime
import boto3
import urllib.request
import os

today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
local_path = '/tmp/'
upload_path = 'AmplifyLogs/'
file_name = '-accesslog'
file_full_name = str(yesterday)+file_name
file_full_path = local_path+file_full_name
file_upload_full_path = upload_path+file_full_name

def lambda_handler(event, context):
        amplify = boto3.client('amplify')
        amplify_logurl = amplify.generate_access_logs(
                startTime = datetime.datetime(year=today.year, month=today.month, day=yesterday.day, hour=0, minute=0,second=0),
                endTime = datetime.datetime(year=today.year, month=today.month, day=yesterday.day, hour=23, minute=59,  second=59),
                domainName = os.environ['APP_DOMAIN'],
                appId = os.environ['APP_ID']
        )
        logurl = amplify_logurl['logUrl']
        urllib.request.urlretrieve(logurl, file_full_path)

        s3_resource = boto3.resource('s3')
        s3_resource.Bucket(os.environ['S3_BUCKET']).upload_file(file_full_path, file_upload_full_path)

Lambda関数実行時の前日の0時0分0秒〜前日の23時59分59秒のアクセスログのダウンロードURLを生成→Lambdaリソースの/tmp/配下に格納→S3バケットにアップロードされます。また、Lambdaの環境変数に以下の3つを設定しております。

  • AmplifyのID:APP_ID
  • Amplify アクセスログ対象のドメイン:APP_DOMAIN
  • アップロード先S3バケット:S3_BUCKET

AmplifyのIDはAmplifyConsoleの全般画面から確認できます。(以下赤枠のapps/配下の文字列)

環境変数を設定後、この関数をテストイベントから実行してみるとS3にアップロードファイルが存在していることが確認できます。

EventBridgeの設定

EventBridgeのスケジュール式で設定します。Lambdaのタイムゾーン(環境変数 TZ)はUTCであることと、Access logの表示に最大で1時間かかることがある為、毎日1:00(UTC)にS3にアップロードするように設定します。

Lambda関数の「トリガーを追加」から、以下の内容でEventBridgeを設定ます。

設定したスケジュールでLambda関数が実行されてS3にアクセスログがアップロードされます。

終わりに

AmplifyのアクセスログをS3にアップロードする方法の紹介でした。S3にアップロードしておくことでログ分析に利用できるようになるのでご活用ください。

この設定の注意点が一点あります。Lambdaリソースの/tmpディレクトリの上限は512MBで変更できません。ご注意ください。

AWS Lambda のクォータ