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

最終更新日: 2021 年 2 月 9 日

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

解決方法

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

1.    S3 バケットのサーバーアクセスのログ記録を有効にします (まだ有効にしていない場合)。[Target bucket] (ターゲットバケット) と [Target prefix] (ターゲットプレフィックス) の値を書き留めます。Athena クエリで Amazon S3 の場所を指定するときに必要になります。

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

3.    クエリエディタで、DDL 文を実行してデータベースを作成します。ベストプラクティスとして、S3 バケットと同じリージョンでデータベースを作成することをお勧めします。

create database s3_access_logs_db

4.    データベースにテーブルスキーマを作成します。次の例では、STRING および BIGINT データ型の値は、アクセスログのプロパティです。これらのプロパティは Athena でクエリできます。LOCATION では、ステップ 1 で書き留めた S3 バケットおよびプレフィックスのパスを入力します。プレフィックスの最後にスラッシュ (/) を含めるようにしてください (例: s3://doc-example-bucket/prefix/)。

CREATE EXTERNAL TABLE `s3_access_logs_db.mybucket_logs`(
  `bucketowner` STRING,
  `bucket_name` STRING,
  `requestdatetime` STRING,
  `remoteip` STRING,
  `requester` STRING,
  `requestid` STRING,
  `operation` STRING,
  `key` STRING,
  `request_uri` 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 (
  'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://awsexamplebucket1-logs/prefix/'

5.    左側のペインの [Tables] (テーブル) で、テーブル名の横にあるメニューボタンから [Preview table] (テーブルのプレビュー) を選択します。[Results] (結果) ウィンドウに、サーバーのアクセスログからのデータ (bucketownerbucketrequestdatetime など) が表示される場合、Athena テーブルは正しく作成されています。これで Amazon 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('2020-09-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2020-09-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('2020-07-01','yyyy-MM-dd') and parse_datetime('2020-08-01','yyyy-MM-dd');

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


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


請求に関するサポートまたは技術サポートが必要ですか?