

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Lightsail で Amazon Athena を使用してバケットアクセスログを分析する
<a name="amazon-lightsail-using-bucket-access-logs"></a>

このガイドでは、アクセスログを使用したバケットへのリクエストの識別方法を説明します。詳細については、「[バケットアクセスのログ](amazon-lightsail-bucket-access-logs.md)」を参照してください。

**目次**
+ [Amazon Athena を使用してリクエストのアクセスログをクエリする](#querying-access-logs-for-requests)
+ [Amazon S3 アクセスログを使用してオブジェクトアクセスリクエストの識別する](#identifying-object-access-requests)

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

Amazon Athena を使用して、アクセスログのバケットへのリクエストをクエリ、識別することができます。

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

**例**

次の例は、Amazon Athena でバケットサーバーアクセスログをクエリする方法を示しています。

**注記**  
Athena クエリでバケットの場所を指定するには、ログが配信されるターゲットバケット名とターゲットプレフィックスを、次のような S3 URI でフォーマットする必要があります: `s3://{{amzn-s3-demo-bucket1}}-logs/prefix/`

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

1. **クエリエディタ**で、次のようなコマンドを実行します。

   ```
   create database bucket_access_logs_db
   ```
**注記**  
S3 バケット AWS リージョン と同じ にデータベースを作成するのがベストプラクティスです。

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

   ```
   CREATE EXTERNAL TABLE `s3_access_logs_db.amzn-s3-demo-bucket_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://amzn-s3-demo-bucket1-logs/prefix/}}'
   ```

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

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

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

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

```
SELECT RequestDateTime, RemoteIP, Requester, Key 
FROM s3_access_logs_db.amzn-s3-demo-bucket_logs 
WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
```

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

```
SELECT * 
FROM s3_access_logs_db.amzn-s3-demo-bucket_logs 
WHERE requester='arn:aws:iam::123456789123:user/user_name';
```

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

```
SELECT *
FROM s3_access_logs_db.amzn-s3-demo-bucket_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.amzn-s3-demo-bucket_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');
```

## Amazon S3 アクセスログを使用してオブジェクトアクセスリクエストの識別する
<a name="identifying-object-access-requests"></a>

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

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

**例 - 一定期間内に PUT オブジェクトリクエストを送信しているすべてのリクエスタを表示する**

```
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime
FROM s3_access_logs_db
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 オブジェクトリクエストを取得する方法を示しています。

**例 - 一定期間内に GET オブジェクトリクエストを送信しているすべてのリクエスタを表示する**

```
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime
FROM s3_access_logs_db
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 バケットへのすべての匿名リクエストをサーバーアクセスログから取得する方法を示しています。

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

```
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime
FROM s3_access_logs_db.amzn-s3-demo-bucket_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')
```

**注記**  
ニーズに合わせられるように、データ範囲を変更することができます。
このクエリの例は、セキュリティのモニタリングにも役立つ場合があります。予期しないまたは不正な IP アドレス/リクエスタからの `PutObject` または `GetObject` コールの結果を確認し、バケットへの匿名リクエストを特定できます。
このクエリでは、ログ記録が有効になった時間以降の情報のみ取得されます。