Athena を使用して Amazon S3 サーバーのアクセスログを分析するにはどうすればよいですか ?

最終更新日: 2019 年 5 月 16 日

Amazon Athena で Amazon Simple Storage Service (Amazon S3) サーバーアクセスログをクエリするにはどうすればよいですか ?

解決方法

Amazon S3 はサーバーアクセスログをオブジェクトとして S3 バケットに保存します。Athena を使用すると、S3 アクセスログをすばやく分析してクエリすることができます。

1.    まだ行っていない場合は、S3 バケットのサーバーアクセスログを有効にします。[Target bucket] と [Target prefix] の値にご注意ください。Athena クエリで S3 の場所を指定するには、いずれも必要になります。

s3://awsexamplebucket-logs/prefix

2.    Athena コンソールを開きます。

3.    クエリエディタで、次のようなコマンドを実行してデータベースを作成します
注 : S3 バケットと同じ AWS リージョンにデータベースを作成することをお勧めします。

create database s3_access_logs_db

4.    クエリエディタで、手順 3 で作成したデータベースにテーブルスキーマを作成するには、次のようなコマンドを実行します。STRING および BIGINT データ型の値はアクセスログのプロパティです。これらのプロパティは Athena でクエリできます。[LOCATION] で、手順 1 の 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'

5.    左ウィンドウ枠の [Tables] で、テーブル名の横にあるメニューボタンから [Preview table] を選択します。

サーバーアクセスログのデータが [Results] ウィンドウに表示されている場合 (bucketownerbucketrequestdatetime など) 、Athena テーブルは正常に作成されています。これで、S3 サーバーのアクセスログをクエリできます。

クエリの例

削除されたオブジェクトのログを確認するには :

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
key = 'images/picture.jpg' AND operation like '%DELETE%';

誰がいつオブジェクトを削除したか (タイムスタンプ、IP アドレス、AWS Identity and Access Management (IAM) ユーザー) を表示するには :

SELECT requestdatetime, remoteip, requester, key FROM s3_access_logs_db.mybucket_logs WHERE 
key = 'images/picture.jpg' AND operation like '%DELETE%';

IAM ユーザーによって実行されるすべてのオペレーションを表示するには :

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
requester='arn:aws:iam::123456789123:user/user_name';

特定の期間内にオブジェクトに対して実行されたすべての操作を表示するには :

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg' AND
parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2017-02-18:08:00:00','yyyy-MM-dd:HH:mm:ss');

特定の期間に特定の IP アドレスによって転送されたデータ量を表示するには :

SELECT SUM(bytessent) as uploadtotal, 
SUM(objectsize) as downloadtotal, 
SUM(bytessent + objectsize) AS total FROM s3_access_logs_db.mybucket_logs WHERE remoteIP='1.2.3.4' and parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-06-01','yyyy-MM-dd') and parse_datetime('2017-07-01','yyyy-MM-dd');

サーバーアクセスログバケットに S3 ライフサイクルポリシーを作成することをお勧めします。ログファイルを定期的に削除するようにライフサイクルポリシーを設定します。そうすることで、Athena が各クエリについて分析するデータ量が削減されます。


この記事は役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合