

# Amazon Athena を使用して、Amazon S3 ログファイルのインターネット測定値をクエリする
<a name="CloudWatch-IM-view-cw-tools.S3_athena"></a>

Amazon Athena を使用すると、Internet Monitor が Amazon S3 バケットに発行するインターネット測定値をクエリして表示できます。Internet Monitor では、モニタリング対象の都市ネットワーク (クライアントのロケーションと ASN、通常はインターネットサービスプロバイダー (ISP)) のインターネット向けトラフィック用 S3 バケットにアプリケーションのインターネット測定値を発行するオプションが用意されています。S3 に測定値をパブリッシュすることを選択するかどうかにかかわらず、Internet Monitor は、各モニタの (トラフィック量で) 上位 500 の都市ネットワークのインターネット測定値を、5 分ごとに CloudWatch Logs に自動的にパブリッシュします。

この章では、S3 ログファイルにあるインターネット測定値のテーブルを Athena に作成する手順を説明します。また、測定値をさまざまなビューで表示する[クエリの例](#CloudWatch-IM-view-cw-tools.S3_athena.athena-sample-queries)を紹介します。例えば、レイテンシーによる影響度の上位 10 の都市ネットワークをクエリできます。

## Amazon Athena を使用して、Internet Monitor でインターネット測定値用のテーブルを作成する
<a name="CloudWatch-IM-view-cw-tools.S3_athena.athena-queries"></a>

Internet Monitor S3 ログファイルで Athena の使用を開始するには、まずインターネット測定値用のテーブルを作成します。

以下の手順に従い、S3 ログファイルに基づいて Athena にテーブルを作成します。次に、[これらのインターネット測定クエリの例](#CloudWatch-IM-view-cw-tools.S3_athena.athena-sample-queries)など、テーブルで Athena クエリを実行して、測定値に関する情報を取得できます。

**Athena テーブルを作成する**

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

1. Athena クエリエディタでクエリステートメントを入力して、Internet Monitor のインターネット測定値を含むテーブルを生成します。LOCATION パラメータの値を、Internet Monitor のインターネット測定値が保存されている S3 バケットの場所に置き換えます。

   ```
   CREATE EXTERNAL TABLE internet_measurements (
       version INT,
       timestamp INT,
       clientlocation STRING,
       servicelocation STRING,
       percentageoftotaltraffic DOUBLE,
       bytesin INT,
       bytesout INT,
       clientconnectioncount INT,
       internethealth STRING,
       trafficinsights STRING
   )
   PARTITIONED BY (year STRING, month STRING, day STRING)
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   LOCATION
   's3://{{amzn-s3-demo-bucket}}/{{bucket_prefix}}/AWSLogs/{{account_id}}/internetmonitor/{{AWS_Region}}/'
   TBLPROPERTIES ('skip.header.line.count' = '1');
   ```

1. ステートメントを入力して、データを読み取るためのパーティションを作成します。例えば、以下のサンプルクエリは、1 つの指定日と 1 つのロケーション用に単一のパーティションを作成します。

   ```
   ALTER TABLE internet_measurements
   ADD PARTITION (year = 'YYYY', month = 'MM', day = 'dd')
   LOCATION
   's3://{{amzn-s3-demo-bucket}}/{{bucket_prefix}}/AWSLogs/{{account_id}}/internetmonitor/{{AWS_Region}}/{{YYYY/MM/DD}}';
   ```

1. **[Run]** (実行) を選択します。

**インターネット測定値用の Athena ステートメントの例**

以下は、テーブルを生成するステートメントの例です。

```
CREATE EXTERNAL TABLE internet_measurements (
    version INT,
    timestamp INT,
    clientlocation STRING,
    servicelocation STRING,
    percentageoftotaltraffic DOUBLE,
    bytesin INT,
    bytesout INT,
    clientconnectioncount INT,
    internethealth STRING,
    trafficinsights STRING
)
PARTITIONED BY (year STRING, month STRING, day STRING)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://internet-measurements/TestMonitor/AWSLogs/1111222233332/internetmonitor/us-east-2/'
TBLPROPERTIES ('skip.header.line.count' = '1');
```

以下は、データを読み取るためのパーティションを作成するステートメントの例です。

```
ALTER TABLE internet_measurements
ADD PARTITION (year = '2023', month = '04', day = '07')
LOCATION 's3://internet-measurements/TestMonitor/AWSLogs/1111222233332/internetmonitor/us-east-2/2023/04/07/'
```

## Internet Monitor のインターネット測定値に使用する Amazon Athena クエリのサンプル
<a name="CloudWatch-IM-view-cw-tools.S3_athena.athena-sample-queries"></a>

このセクションには、Amazon Athena で使用できるクエリの例があります。これを使用すると、Amazon S3 にパブリッシュされたアプリケーションのインターネット測定値に関する情報を取得できます。

**影響を受けた上位 10 のクライアントロケーションと ASN (トラフィックの合計パーセンテージ順) をクエリする**

この Athena クエリを実行すると、影響を受けた上位 10 の都市ネットワーク (トラフィックの合計パーセンテージ順) が返されます。都市ネットワークとは、クライアントロケーションと ASN (通常はインターネットサービスプロバイダー) のことです。

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.networkname') as networkName,
    sum(percentageoftotaltraffic) as percentageoftotaltraffic
FROM internet_measurements
GROUP BY json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.networkname')
ORDER BY percentageoftotaltraffic desc
limit 10
```

**影響を受けた上位 10 のクライアントロケーションと ASN (可用性順) をクエリする**

この Athena クエリを実行すると、影響を受けた上位 10 の都市ネットワーク (可用性順) が返されます。都市ネットワークとは、クライアントロケーションと ASN (通常はインターネットサービスプロバイダー) のことです。

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.networkname') as networkName,
    sum(
        cast(
            json_extract_scalar(
                internetHealth,
                '$.availability.percentageoftotaltrafficimpacted'
            )
        as double ) 
    ) as percentageOfTotalTrafficImpacted
FROM internet_measurements
GROUP BY json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.networkname')
ORDER BY percentageOfTotalTrafficImpacted desc
limit 10
```

**影響を受けた上位 10 のクライアントロケーションと ASN (レイテンシー順) をクエリする**

この Athena クエリを実行すると、影響を受けた上位 10 の都市ネットワーク (レイテンシーの影響度順) が返されます。都市ネットワークとは、クライアントロケーションと ASN (通常はインターネットサービスプロバイダー) のことです。

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.networkname') as networkName,
    sum(
        cast(
            json_extract_scalar(
                internetHealth,
                '$.performance.percentageoftotaltrafficimpacted'
            )
        as double ) 
    ) as percentageOfTotalTrafficImpacted
FROM internet_measurements
GROUP BY json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.networkname')
ORDER BY percentageOfTotalTrafficImpacted desc
limit 10
```

**クライアントロケーションと ASN のトラフィックのハイライトをクエリする**

この Athena クエリを実行すると、都市ネットワークの可用性スコア、パフォーマンススコア、最初のバイトまでの時間などを含むトラフィックのハイライトが返されます。都市ネットワークとは、クライアントロケーションと ASN (通常はインターネットサービスプロバイダー) のことです。

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.subdivision') as subdivision,
    json_extract_scalar(clientLocation, '$.country') as country,
    avg(cast(json_extract_scalar(internetHealth, '$.availability.experiencescore') as double)) as availabilityScore,
    avg(cast(json_extract_scalar(internetHealth, '$.performance.experiencescore') as double)) performanceScore,
    avg(cast(json_extract_scalar(trafficinsights, '$.timetofirstbyte.currentexperience.value') as double)) as averageTTFB,
    sum(bytesIn) as bytesIn,
    sum(bytesOut) as bytesOut,
    sum(bytesIn + bytesOut) as totalBytes
FROM internet_measurements
where json_extract_scalar(clientLocation, '$.city') != 'N/A'
GROUP BY 
json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.subdivision'),
    json_extract_scalar(clientLocation, '$.country')
ORDER BY totalBytes desc
limit 100
```

Athena の詳しい使用方法については、「[Amazon Athena ユーザーガイド](https://docs.aws.amazon.com/athena/latest/ug/)」を参照してください。