

# Amazon S3 アクセスログを使用したリクエストの識別
<a name="using-s3-access-logs-to-identify-requests"></a>

Amazon S3 アクセスログを使用して、Amazon S3 リクエストを識別できます。

**注記**  
Amazon S3 リクエストを識別するには、Amazon S3 アクセスログの代わりに AWS CloudTrail データイベントを使用することをお勧めします。CloudTrail データイベントは、設定が容易で、より多くの情報が含まれています。詳細については、「[CloudTrail を使用した Amazon S3 リクエストの識別](cloudtrail-request-identification.md)」を参照してください。
取得したアクセスリクエスト数に応じて、ログの分析にリソースや時間がさらに必要になる場合があります。

**Topics**
+ [

## Amazon Athena を使用したリクエストのアクセスログのクエリ
](#querying-s3-access-logs-for-requests)
+ [

## Amazon S3 アクセスログを使用した Signature Version 2 リクエストの識別
](#using-s3-access-logs-to-identify-sigv2-requests)
+ [

## Amazon S3 アクセスログを使用したオブジェクトアクセスリクエストの識別
](#using-s3-access-logs-to-identify-objects-access)

## Amazon Athena を使用したリクエストのアクセスログのクエリ
<a name="querying-s3-access-logs-for-requests"></a>

Amazon Athena を使って、Amazon S3 のアクセスログで、Amazon S3 リクエストを識別できます。

Amazon S3 は、サーバーのアクセスログを S3 バケット内のオブジェクトとして保存します。多くの場合、Amazon S3 のログを分析できるツールを使用する方が簡単です。Athena は S3 オブジェクトの分析をサポートしてしるため、Amazon S3 アクセスログに対してクエリを実行するのに使用できます。

**Example**  
次の例は、Amazon Athena で Amazon S3 サーバーアクセスログをクエリする方法を示しています。次の例を実行するには、`user input placeholders` をユーザー自身の情報に置き換えます。  
Athena クエリで Amazon S3 のロケーションを指定するには、ログの送信先となるバケットの S3 URI を指定する必要があります。この URI には、次の形式でバケット名とプレフィックスを含める必要があります。`s3://amzn-s3-demo-bucket1-logs/prefix/`

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) で Athena コンソールを開きます。

1. クエリエディタで、次のようなコマンドを実行します。`s3_access_logs_db` は、データベースにつける名前に置き換えます。

   ```
   CREATE DATABASE s3_access_logs_db
   ```
**注記**  
ベストプラクティスとして、データベースは、S3 バケットと同じ AWS リージョンで作成することをお勧めします。

1. クエリエディタで次のようなコマンドを実行して、ステップ 2 で作成したデータベースでテーブルスキーマを作成します。`s3_access_logs_db.mybucket_logs` は、テーブルにつける名前に置き換えます。`STRING` および `BIGINT` データ型の値はアクセスログのプロパティです。これらのプロパティは Athena でクエリできます。`LOCATION` の場合は、前述のように S3 バケットとプレフィックスパスを入力します。

------
#### [ Date-based partitioning ]

   ```
   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,
    `accesspointarn` STRING,
    `aclrequired` STRING,
    `sourceregion` STRING)
    PARTITIONED BY (
      `timestamp` 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://bucket-name/prefix-name/account-id/region/source-bucket-name/'
    TBLPROPERTIES (
     'projection.enabled'='true', 
     'projection.timestamp.format'='yyyy/MM/dd', 
     'projection.timestamp.interval'='1', 
     'projection.timestamp.interval.unit'='DAYS', 
     'projection.timestamp.range'='2024/01/01,NOW', 
     'projection.timestamp.type'='date', 
     'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
   ```

------
#### [ Non-date-based partitioning ]

   ```
   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,
     `accesspointarn` STRING,
     `aclrequired` STRING,
     `sourceregion` 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://amzn-s3-demo-bucket1-logs/prefix/'
   ```

------

1. ナビゲーションペインにある、[**データベース**] で、データベースを選択します。

1. [**テーブル**] で、テーブル名の横にある、[**Preview table (テーブルのプレビュー)**] を選択します。

   [**結果**] ペインに、サーバーアクセスログのデータ (`bucketowner`、`bucket`、`requestdatetime` など) が表示されます。これは、Athena テーブルが正常に作成されたことを意味します。これで Amazon S3 サーバーアクセスログのクエリを実行できるようになりました。

**Example − 誰がいつオブジェクトを削除したか (タイムスタンプ、IP アドレス、および IAM ユーザー) を表示する**  

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

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

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

**Example − 特定の期間にオブジェクトに対して実行されたすべてのオペレーションを表示する**  

```
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');
```

**Example − 特定の期間、特定の IP アドレスに送信されたデータの量を表示する**  

```
SELECT coalesce(SUM(bytessent), 0) AS bytessenttotal
FROM s3_access_logs_db.mybucket_logs
WHERE remoteip='192.0.2.1'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2022-06-01','yyyy-MM-dd')
AND parse_datetime('2022-07-01','yyyy-MM-dd');
```

**Example — 特定の期間内の HTTP 5xx エラーに対応するリクエスト ID を検索する**  

```
SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid 
FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus like '5%' AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
```

**注記**  
ログを保持する時間を短縮するために、サーバーアクセスログバケットの Amazon S3 ライフサイクル設定を作成できます。ライフサイクル設定ルールを作成して、定期的にログファイルを削除します。これにより、各クエリで Athena が分析するデータの量が減ります。詳細については、「[バケットに S3 ライフサイクル設定を設定する](how-to-set-lifecycle-configuration-intro.md)」を参照してください。

## Amazon S3 アクセスログを使用した Signature Version 2 リクエストの識別
<a name="using-s3-access-logs-to-identify-sigv2-requests"></a>

Signature Version 2 の Amazon S3 サポートがオフになります (非推奨)。その後、Amazon S3 は署名バージョン 2 を使用するリクエストを受け入れず、すべてのリクエストに Signature Version 4 署名を使用する必要があります。Amazon S3 アクセスログを使用して、Signature Version 2 アクセスリクエストを識別できます。

**注記**  
Signature Version 2 リクエストを識別するには、Amazon S3 アクセスログの代わりに AWS CloudTrail データイベントを使用することをお勧めします。CloudTrail データイベントは、サーバーアクセスログと比べ、設定が容易で、より多くの情報が含まれています。詳細については、「[CloudTrail を使用した Amazon S3 Signature Version 2 リクエストの識別](cloudtrail-request-identification.md#cloudtrail-identification-sigv2-requests)」を参照してください。

**Example − 署名バージョン 2 トラフィックを送信しているすべてのリクエスタを表示する**  

```
SELECT requester, sigv, Count(sigv) as sigcount 
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, sigv;
```

## Amazon S3 アクセスログを使用したオブジェクトアクセスリクエストの識別
<a name="using-s3-access-logs-to-identify-objects-access"></a>

Amazon S3 サーバーアクセスログに対するクエリを使用して、`GET`、`PUT`、`DELETE` などのオペレーションに対する Amazon S3 オブジェクトアクセスリクエストを識別し、それらのリクエストに関する詳細情報を確認することができます。

次の Amazon Athena クエリの例は、サーバーアクセスログから Amazon S3 に対するすべての `PUT` オブジェクトリクエストを取得する方法を示しています。

**Example − 一定期間内に `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 parse_datetime('2019-07-01:00:42:42',yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
```

次の Amazon Athena クエリの例は、サーバーアクセスログから Amazon S3 に対するすべての `GET` オブジェクトリクエストを取得する方法を示しています。

**Example − 一定期間内に `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 parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
```

次の Amazon Athena のクエリの例は、S3 バケットへのすべての匿名リクエストをサーバーアクセスログから取得する方法を示しています。

**Example − 特定の期間にバケットにリクエストを行っているすべての匿名リクエスタを表示する**  

```
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 parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
```

次の Amazon Athena のクエリは、承認のためにアクセスコントロールリスト (ACL) が必要な S3 バケットへのすべてのリクエストを特定する方法を示しています。この情報を使用して、これらの ACL 権限を適切なバケットポリシーに移行し、ACL を無効にすることができます。これらのバケットポリシーを作成したら、これらのバケットの ACL を無効にできます。ACL の無効化の詳細については、「[ACL を無効にする前提条件。](object-ownership-migrating-acls-prerequisites.md)」を参照してください。

**Example — 承認に ACL が必要なリクエストをすべて特定する**  

```
SELECT bucket_name, requester, key, operation, aclrequired, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE aclrequired = 'Yes' 
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2022-05-10:00:00:00','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2022-08-10:00:00:00','yyyy-MM-dd:HH:mm:ss')
```

**注記**  
ニーズに合わせられるように、必要に応じてデータ範囲を変更することができます。
このクエリの例は、セキュリティのモニタリングにも役立つ場合があります。予期しないまたは不正な IP アドレスやリクエスタからの `PutObject` または `GetObject` コールの結果を確認し、バケットへの匿名リクエストを特定できます。
このクエリでは、ログ記録が有効になった時間以降の情報のみ取得されます。
AWS CloudTrail ログを使用している場合は、「[CloudTrail を使用した S3 オブジェクトへのアクセスの識別](cloudtrail-request-identification.md#cloudtrail-identification-object-access)」を参照してください。