Athena を使用して Amazon S3 サーバーアクセスログを分析する方法を教えてください。

所要時間3分
0

Amazon Athena で、Amazon Simple Storage Service (Amazon S3) のサーバーアクセスログをクエリしたいと考えています。

解決策

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

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

2.    Amazon Athena コンソールを開きます。最初のクエリを実行する前に、Athena の初回セットアップを行う必要がある場合があります。

3.    [クエリエディタ] で、DDL ステートメントを実行してデータベースを作成します。S3 バケットと同じ AWS リージョンにデータベースを作成するのがベストプラクティスです。

create database s3_access_logs_db

4.    データベースにテーブルスキーマを作成します。次の例では、STRINGBIGINT データ型の値がアクセスログのプロパティです。これらのプロパティは Athena でクエリできます。[LOCATION] に、手順 1 の S3 バケットおよびプレフィックスのパスを入力します。プレフィックスの末尾にはフォワードスラッシュ (/) を含めてください (例: s3://doc-example-bucket/prefix/)。プレフィックスを使用しない場合は、バケット名の末尾にフォワードスラッシュ (/) を含めてください (例: s3://doc-example-bucket/)。

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.    左側のペインの [テーブル] で、テーブル名の横にあるメニューボタンから [テーブルのプレビュー] を選択します。[結果] ウィンドウにサーバーアクセスログのデータが表示されていれば、Athena テーブルは正常に作成されています。データは、bucketownerbucket_namerequestdatetime などの値です。これで、Amazon S3 サーバーアクセスログをクエリできます。

クエリの例

削除済みオブジェクトのリクエストを検索するには、次のクエリを使用します。

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

403 Access Denied エラーが発生したリクエストの Amazon S3 リクエスト ID を表示するには、次のクエリを使用します。

SELECT requestdatetime, requester, operation, requestid, hostid
FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus = '403';

特定の期間の HTTP 5xx エラーの Amazon S3 リクエスト ID (キーとエラーコードを含む) を検索するには、次のクエリを実行します。

SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid
FROM s3_access_logs_db.mybucket_logsWHERE httpstatus like '5%'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 07:00:00'
AND timestamp '2021-09-18 08:00:00'

タイムスタンプ、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_logsWHERE Key='prefix/images/picture.jpg'     
AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z')    
BETWEEN timestamp '2021-09-18 07:00:00'    
AND timestamp '2021-09-18 08:00:00'

特定の期間に IP アドレスに転送されたデータ量を表示するには、次のクエリを使用します。

SELECT coalesce(SUM(bytessent), 0) AS bytessentTOTAL,
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 timestamp '2020-01-01'
AND timestamp '2024-01-01'

特定の期間にライフサイクルルールによって実行された有効期限切れの操作をすべて表示するには、次のクエリを使用します。

SELECT *FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 00:00:00'
AND timestamp '2021-09-19 00:00:00'

特定の期間に有効期限切れになったオブジェクトの数をカウントするには、次のクエリを使用します。

SELECT count(*) as ExpireCount
FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 00:00:00'
AND timestamp '2021-09-19 00:00:00'

特定の期間にライフサイクルルールによって実行された移行の操作をすべて表示するには、次のクエリを使用します。

SELECT \* FROM s3\_access\_logs\_db.mybucket\_logs
WHERE operation like 'S3.TRANSITION%'
AND parse\_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 00:00:00'
AND timestamp '2021-09-19 00:00:00'

署名バージョン別にグループ化されたすべてのリクエスタを表示するには、次のクエリを使用します。

SELECT requester, Sigv, Count(Sigv) as SigCount
FROM s3_access_logs_db.mybucket_logsGROUP BY requester, Sigv;

特定の期間にリクエストを行っているすべての匿名リクエスタを表示するには、次のクエリを使用します。

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'

特定の期間に PUT オブジェクトリクエストを送信しているすべてのリクエスタを表示するには、次のクエリを使用します。

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'

特定の期間に GET オブジェクトリクエストを送信しているすべてのリクエスタを表示するには、次のクエリを使用します。

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'

特定の期間におけるターンアラウンド時間が長い順にすべてのリクエスタを表示するには、次のクエリを使用します。

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE NOT turnaroundtime='-'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'
ORDER BY CAST(turnaroundtime AS INT) DESC;

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

関連情報

Amazon OpenSearch Service を使用して Amazon S3 サーバーのアクセスログを分析する

Amazon S3 サーバーアクセスログの形式

AWS サービスのログのクエリ

AWS公式
AWS公式更新しました 8ヶ月前
コメントはありません

関連するコンテンツ