デイリーモニターで、アセット配信用の S3 バケットのひとつにおいて、 転送量が普段よりも明らかに増加していることに気付きました。
原因を特定するためには Server Access Logging の内容を確認する必要がありますが、 S3 のアクセスログは時間単位で分割されたオブジェクトとして大量に蓄積されるため、 手作業での確認や集計は現実的ではありません。
そこで、本記事では Athena を用いて S3 のアクセスログをクエリ可能な形で取り込み、 転送量の増加要因を分析するための手順を整理しておきます。
S3 アクセスログの所在確認
まずは、ログの所在を確認します。
Amazon S3>Buckets>(bucket名)
Properitesタブ
Server access logging
- Server access logging: Enabled
- Destination bucket: s3://(ログ保存先bucket名)
- Log object key format: [YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
Athena の初期設定
Athena は集計結果を画面で得る場合でも、Query result location をセットしておく必要があります。
Amazon Athena>Query editor
Query settingsタブ
Query result location をセット (適当な S3 ロケーション)
DB/テーブル作成
Athena に DB とテーブルを作成します。
CREATE DATABASE s3logs;
CREATE EXTERNAL TABLE s3_access_logs (
bucketowner STRING,
bucket_name STRING,
requestdatetime STRING,
remoteip STRING,
requester STRING,
requestid STRING,
operation STRING,
key STRING,
request_uri STRING,
httpstatus INT,
errorcode STRING,
bytessent BIGINT,
objectsize BIGINT,
totaltime INT,
turnaroundtime INT,
referrer STRING,
useragent STRING,
versionid STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex'='([^ ]*) ([^ ]*) \\[([^]]*)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) "([^"]*)" ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)" ([^ ]*).*'
)
LOCATION 's3://(ログ保存先bucket名)/';
アクセス分析
集計して必要な情報を得ます。
① IP別 転送量ランキング
SELECT
remoteip,
SUM(bytessent)/1024/1024 AS mb,
COUNT(*) AS requests
FROM s3_access_logs
WHERE requestdatetime LIKE '30/Jan/2026%'
GROUP BY remoteip
ORDER BY mb DESC
LIMIT 20;
② どのファイルが大量転送された?
SELECT
key,
SUM(bytessent)/1024/1024 AS mb,
COUNT(*) AS requests
FROM s3_access_logs
WHERE requestdatetime LIKE '30/Jan/2026%'
GROUP BY key
ORDER BY mb DESC
LIMIT 20;
③ User-Agent(bot判定)
SELECT
useragent,
COUNT(*) AS c
FROM s3_access_logs
WHERE requestdatetime LIKE '30/Jan/2026%'
GROUP BY useragent
ORDER BY c DESC
LIMIT 20;
④ Referer(どこから流入?)
SELECT
referrer,
COUNT(*) AS c
FROM s3_access_logs
WHERE requestdatetime LIKE '30/Jan/2026%'
GROUP BY referrer
ORDER BY c DESC
LIMIT 20;
⑤ 転送量トップ100リクエスト(生ログ確認)
「とにかく何が起きたか見たい」用
SELECT
requestdatetime,
remoteip,
key,
bytessent,
useragent
FROM s3_access_logs
WHERE requestdatetime LIKE '30/Jan/2026%'
ORDER BY bytessent DESC
LIMIT 100;