bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. S3のアクセスログをAthenaで分析する

S3のアクセスログをAthenaで分析する

Jan 30, 2026 AWS bucket-sort

デイリーモニターで、アセット配信用の 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;
S3 Athena AWS 監視
← Lambdaの費用・無料枠をざっくり調査 C#と .NETの関係を整理する(SDKと言語バージョンの仕組み) →

Related Posts

  • MySQLでレコードの平均サイズを求める Jan 8, 2026
  • AWS SQSで監視必須のメトリックスを整理する Jan 4, 2026
  • 監査ログをDynamoDBに保存するlaravel-dynamodb-auditingパッケージの概要まとめ Mar 3, 2026
  • RDBのつもりでlaravel-dynamodbを使うとハマりそうなポイントを整理する Mar 1, 2026

Table of Contents

  • S3 アクセスログの所在確認
  • Athena の初期設定
  • DB/テーブル作成
  • アクセス分析
    • ① IP別 転送量ランキング
    • ② どのファイルが大量転送された?
    • ③ User-Agent(bot判定)
    • ④ Referer(どこから流入?)
    • ⑤ 転送量トップ100リクエスト(生ログ確認)

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.