Lightsail で Amazon Athena を使用してバケットアクセスログを分析する - Amazon Lightsail

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

Lightsail で Amazon Athena を使用してバケットアクセスログを分析する

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

目次

Amazon Athena を使用してリクエストのアクセスログをクエリする

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

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

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

注記

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

  1. https://console.aws.amazon.com/athena/ から Athena コンソールを開きます。

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

    create database bucket_access_logs_db
    注記

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

  3. クエリエディタで、次のようなコマンドを実行して、ステップ 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/'
  4. ナビゲーションペインにある、[データベース] で、データベースを選択します。

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

    [結果] ペインに、サーバーアクセスログのデータ (bucketownerbucketrequestdatetime など) が表示されます。これは、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 アクセスログを使用してオブジェクトアクセスリクエストの識別する

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

次の 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 コールの結果を確認し、バケットへの匿名リクエストを特定できます。

  • このクエリでは、ログ記録が有効になった時間以降の情報のみ取得されます。