Athena, Kinesis Data Firehose, S3 を使用したログ分析

Athena, Kinesis Data Firehose, S3 を使用したログ分析

Takahiro Iwasa
(岩佐 孝浩)
Takahiro Iwasa (岩佐 孝浩)
5 min read
Athena Firehose Kinesis

AWS ユーザーは、 Athena (おそらく Presto ベース) を使用して S3 に保存されたアプリケーションログをクエリできます。これにより、ログ分析環境を迅速に構築できます。

概要

この投稿では、パーティショニングに便利な AWS Glue Crawler は取り上げていません。

S3 バケット作成

ログファイルのための適当なバケットを作成してください。

Kinesis Data Firehose Delivery Stream 作成

2019年2月12日にカスタムプレフィックスがサポートされました。

カスタムプレフィックスがサポートされる前は、 Firehose は path/to/YYYY/MM/DD のようなプレフィックスでファイルを作成しました。現在は Apache Hive 形式を S3 オブジェクトキーとして指定し、 MSCK REPAIR TABLE を使用して Athena でパーティションを作成できます。

Create delivery stream をクリックしてください。

ストリーム名を指定してください。

Direct PUT or other sources を選択してください。

レコードを処理する設定はスキップしてください。

宛先として S3 を選択してください。

Apache Hive 形式のプレフィックスを指定してください。

FieldValue
Prefixlogs/!{timestamp:'year='yyyy'/month='MM'/day='dd'/hour='HH}/
Error prefixerror_logs/!{timestamp:'year='yyyy'/month='MM'/day='dd'/hour='HH}/!{firehose:error-output-type}

要件に基づいて Buffer size および Buffer interval に適切な値を指定してください。

GZIP 圧縮を強くお勧めします。

Firehose が引き受ける IAM ロールを作成または選択してください。

PHP を使用した Firehose へのストリーミング例

以下の例は、 AWS SDK for PHPFirehoseClient#putRecord API を使用してデータをストリーミングする方法です。

$client = new FirehoseClient([
    'region' => '<AWS_REGION>',
    'version' => 'latest',
]);

// Create a log record.
$data = [
    'log_id' => 12345,
    'url' => 'https://hoge/fuga/',
];

// Stream the record to Firehose.
$client->putRecord([
    'DeliveryStreamName' => '<YOUR_STREAM>',
    'Record' => [
        // New line must be included because single record expresses single log data.
        'Data' => json_encode($data) . PHP_EOL,
    ],
]);

Athena テーブル作成

Create table from S3 bucket data を選択してください。

データベース名、テーブル名、および Firehose がデータを出力する S3 の場所を入力してください。

JSON を指定してください。

データに基づいて適切な列を指定してください。

どのようにパーティショニングするかを設定してください。ここでは year/month/day/hour を使用しています。

メニューから Load partitions を選択して、 MSCK REPAIR TABLE {TABLE_NAME}; を実行してください。

SQL を使用した Athena テーブルのクエリ

いつものように SQL を使用してデータをクエリできます。予期しない高額な請求を回避するために Athena でクエリを実行する際、以下の条件に注意してください。

  • WHERE 句にパーティションキーを指定
  • 不必要なスキャンを防ぐために LIMIT を追加
SELECT
  *
FROM
  table_name
WHERE
  year = 2019
  AND month = 8
  AND day = 30
LIMIT 10;
Takahiro Iwasa
(岩佐 孝浩)

Takahiro Iwasa (岩佐 孝浩)

Software Developer at KAKEHASHI Inc.
処方箋データ収集基盤の設計・開発・運用に携わっています。