S3のサーバーアクセスログから、接続失敗ログを洗い出す

S3のサーバーアクセスログをAthenaで確認し、アクセスに失敗したログを洗い出す方法をご紹介します。ユーザーからS3に接続できないと連絡があった場合などにご活用ください。
2019.10.15

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

S3のサーバーアクセスログをAthenaで確認し、アクセスに失敗したログを洗い出す方法をご紹介します。ユーザーからS3に接続できないと連絡があった場合などにご活用ください。

S3のサーバーアクセスログを有効にする

S3コンソールから、バケットを選択しプロパティからサーバーアクセスのログ記録を有効にします。

Athenaでテーブルを作成する

Athenaコンソールを開き、データベースを作成します。

create database s3_access_logs_db

作成すると、リストに"s3_access_logs_db"が追加されるので選択します。

テーブルを作成します。「LOCATION 's3://awsexamplebucket-logs/prefix'」を実環境に合わせて、実行します。具体的にはS3のサーバーアクセスログの設定で指定したバケットとプレフィックスを指定します。

CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.mybucket_logs(
BucketOwner STRING,
Bucket STRING,
RequestDateTime STRING,
RemoteIP STRING,
Requester STRING,
RequestID STRING,
Operation STRING,
Key STRING,
RequestURI_operation STRING,
RequestURI_key STRING,
RequestURI_httpProtoversion STRING,
HTTPstatus STRING,
ErrorCode STRING,
BytesSent BIGINT,
ObjectSize BIGINT,
TotalTime STRING,
TurnAroundTime STRING,
Referrer STRING,
UserAgent STRING,
VersionId STRING,
HostId STRING,
SigV STRING,
CipherSuite STRING,
AuthType STRING,
EndPoint STRING,
TLSVersion STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
LOCATION 's3://awsexamplebucket-logs/prefix'

テーブルが作成されたら、3点アイコンを選択しテーブルのプレビューを選びます。

以下のようにプレビューされます。

アクセスに失敗したログを洗い出す

ステータスコードが200以外かつ、ユーザーエージェントがAWSに関するもの以外のログを100件表示します。useragentlimitは必要に応じて変更、削除してください。

SELECT *
FROM s3_access_logs_db.mybucket_logs
where httpstatus != '200'
AND useragent != '"AWSConfig"'
AND useragent NOT Like '%aws-internal%'
ORDER BY parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') DESC
limit 100

クエリの結果をみてみましょう。IPアドレスや接続に利用したIAMロールやIAMユーザー情報を確認できます。

操作や操作したパスを確認できます。例として、バケットポリシーで特定の操作のみ許可している場合にアクセスできない場合はこちらに注目します。

ユーザーエージェントを確認できるので、aws cli、python sdk、ブラウザなど接続に使ったツールを確認できます。

おわりに

S3のサーバーアクセスログをAthenaで確認し、アクセスに失敗したログを洗い出す方法を紹介しました。クエリの内容を変更すれば、他の情報も参照できます。参考リンクをご覧ください。

参考