署名バージョン2のS3 APIログをCloudWatch Logs Insights で集計してみた

2019.03.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSチームのすずきです。

署名バージョン 2 のS3 API ログを CloudWatch Logs に転送し、CloudWatch Logs Insights による可視化、利用状況の確認を行う機会がありましたので、紹介させて頂きます。

【超重要】対応しないと使えなくなるかも?!今、全S3ユーザがチェックすべき署名バージョン2の廃止について

構成図

設定

以下記事で紹介させて頂いた設定に、CloudWatch Logsへの出力を行うLambda関数と、関連する設定を追加しています。

廃止予定のS3署名バージョン2API利用をCloudWatchEventで検出してみた

SNS

  • サブスクリプションとしてLambdaを追加しました。

Lambda

トリガー

  • ログ発生量が多くCloudWatchLogsの費用が問題となる場合、Lambdaのトリガーを無効化してください。

コード

  • ブループリントとして事前設定されたテンプレートに、ログ項目の絞り込み処理を追加しました。
  • ログ解析時に Lambda に関連するログは除外するものとして、標準出力のみを利用する実装としました。
  • 解析対象となるS3のログと、Lambdaの実行ログの混在が問題となる場合、SDK(Boto3)を利用して別ロググループへの出力をお試し下さい。
import json
def lambda_handler(event, context):
  a = json.loads(event['Records'][0]['Sns']['Message'])['detail']
  b = {}
  b["eventTime"] = a['eventTime']
  b["eventSource"] = a['eventSource']
  b["eventName"] = a['eventName']
  b["sourceIPAddress"] = a['sourceIPAddress']
  b["userAgent"] = a['userAgent']
  b["requestParameters"] = a['requestParameters']
  b["userIdentity"] = a['userIdentity']
  b["additionalEventData"] = a['additionalEventData']
  print(json.dumps(b))
  return b

ログ設定

  • Lambda標準出力されたログ(ロググループ)は、「CloudWatchのログを表示」から確認可能です。

動作確認

署名バージョン 2 のS3 API 利用で発生したログをCloudWatchのダッシュボードで確認しました。

イベントの検索

ロググループの「イベントの検索」より、該当するログを確認する事が可能です。

CloudWatch Logs Insights

  • ロググループを指定後、任意のクエリ、期間を指定して指定で解析を行います。
  • スキャン対象となったログ、1 GB あたり 0.0076 $の従量課金が発生する点に留意してご利用ください。

個別ログ確認

  • @message 指定によりログレコードの全体の確認が可能です。
  • ログレコードを展開する事で詳細が確認可能です。認識したカラムは後述の集計やフィルタ対象として利用可能です。

  • SigV2 S3 API 利用 ログ、20件の抽出
fields @timestamp, @message
| sort @timestamp desc
| filter additionalEventData.SignatureVersion = 'SigV2'
| filter eventSource = 's3.amazonaws.com'
| limit 20

集計

ソースIP、接続先のS3情報などを指定した集計処理も可能です。

  • SigV2 S3 API 利用 ログ、実行元ソースIPとS3バケット名別集計
stats count(*) by sourceIPAddress, requestParameters.bucketName
| filter additionalEventData.SignatureVersion = 'SigV2'
| filter eventSource = 's3.amazonaws.com'
  • UserAgent、S3バケット 別集計
stats count(*) by userAgent, requestParameters.bucketName
| filter additionalEventData.SignatureVersion = 'SigV2'
| filter eventSource = 's3.amazonaws.com'

まとめ

CloudWatch Logs Insights を利用する事で、CloudTrailの証跡ログを効率よく確認する事が出来ました。

CloudTrailの証跡ログ、CloudWatch Logsに直接保存する事も可能ですが、 ログ発生量が多い場合 CloudWatchLogs のコストが問題となる事がありました。

CloudTrailとCloudWatch Logsの連携によるログのアラーム設定

Amazon CloudWatch の料金

今回の様にログの解析要件が明確な場合、CloudWatch Event、SNS、Lambda などを用いた前処理を行う事で、 コスト効率の良い利用が実現できる可能性がありますので、ぜひお試し下さい。

テンプレート

以下の記事で紹介したテンプレートに、Lambda関数とその関連設定を追加したものです。

廃止予定のS3署名バージョン2API利用をCloudWatchEventで検出してみた