Athena と Kinesis Data Firehose、S3 を使ったログ分析の方法
はじめに
AWS は、Amazon S3 に保存されたアプリケーションログを Athena を使用してクエリする強力な手段を提供しています。Presto によって強化された Athena は、スケーラブルで効率的なログ分析環境を構築するための優れたソリューションです。
本投稿では、Kinesis Data Firehose、Amazon S3、Athena をセットアップして効率的なログ分析環境を構築する手順を説明します。ただし、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」を宛先として選択します。
プレフィックスとエラープレフィックスを以下の形式で設定します。
フィールド | 値 |
---|---|
Prefix | logs/!{timestamp:'year='yyyy'/month='MM'/day='dd'/hour='HH}/ |
Error Prefix | error_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
ステートメントを使用する。
まとめ
Athena、Kinesis Data Firehose、S3 を組み合わせることで、スケーラブル、コスト効率の高い、高可用性 のログ分析環境を構築できます。適切なパーティション設定と効率的なクエリ手法を用いることで、コストを抑えることが可能です。
Happy Coding! 🚀