Athena と Kinesis Data Firehose、S3 を使ったログ分析の方法

Athena と Kinesis Data Firehose、S3 を使ったログ分析の方法

岩佐 孝浩
岩佐 孝浩
5 min read
Athena Firehose Kinesis

はじめに

AWS は、Amazon S3 に保存されたアプリケーションログを Athena を使用してクエリする強力な手段を提供しています。Presto によって強化された Athena は、スケーラブルで効率的なログ分析環境を構築するための優れたソリューションです。

本投稿では、Kinesis Data FirehoseAmazon S3Athena をセットアップして効率的なログ分析環境を構築する手順を説明します。ただし、AWS Glue Crawler によるパーティション設定の簡略化についてはカバーしていません。

システムアーキテクチャ

手順 1: S3 バケットを作成

まず、ログファイルを保存する S3 バケットを作成します。組織の命名規則に従った名前を選択してください。

手順 2: Kinesis Data Firehose を設定

カスタムプレフィックスのサポート は 2019 年 2 月に導入され、Apache Hive 形式のプレフィックスを S3 オブジェクトキーに指定できるようになり、Athena で MSCK REPAIR TABLE を使用してパーティションを作成できるようになりました。以下の手順でデリバリーストリームを設定してください。

2.1. デリバリーストリームを作成

「Create delivery stream」を押して名前を付けます。

2.2. ソースを選択

「Direct PUT or other sources」を選択します。

レコード処理設定はスキップします。

2.3. S3 を宛先に設定

「S3」を宛先として選択します。

プレフィックスとエラープレフィックスを以下の形式で設定します。

フィールド
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}

2.4. バッファ設定の最適化

「Buffer size」および「Buffer interval」を必要に応じて調整します。

2.5. 圧縮を有効化

GZIP 圧縮を使用してストレージコストを削減します。

2.6. IAM ロールを設定

Firehose 用の IAM ロールを作成または選択します。

手順 3: PHP を使ったデータストリーミング (任意)

AWS SDK for PHP - FirehoseClient#putRecord を使用して Kinesis Data Firehose にログデータをストリーミングできます。以下はその例です。

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

$data = [
    'log_id' => 12345,
    'url' => 'https://example.com',
];

$client->putRecord([
    'DeliveryStreamName' => '<YOUR_STREAM>',
    'Record' => [
        'Data' => json_encode($data) . PHP_EOL,
    ],
]);

手順 4: Athena テーブルを作成

Athena コンソールで「Create table from S3 bucket data」を選択します。

データベース名、テーブル名、Firehose で使用した S3 パスを入力します。

ファイル形式として JSON を指定します。

ログ構造に基づいて列を定義します。

パーティション (例: year/month/day/hour) を設定してクエリのパフォーマンスを向上させます。

以下のコマンドを使用してパーティションをロードします。

MSCK REPAIR TABLE {TABLE_NAME};

手順 5: Athena テーブルをクエリする

SQL を使用してログデータを効率的にクエリできます。クエリ例は以下の通りです。

SELECT
  *
FROM
  table_name
WHERE
  year = 2019
  AND month = 8
  AND day = 30
LIMIT 10;

ベストプラクティス:

  • 常に WHERE 句に パーティションキー を含める。
  • 不要なスキャンを防ぐために LIMIT ステートメントを使用する。

まとめ

AthenaKinesis Data FirehoseS3 を組み合わせることで、スケーラブルコスト効率の高い高可用性 のログ分析環境を構築できます。適切なパーティション設定と効率的なクエリ手法を用いることで、コストを抑えることが可能です。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023