ログ分析環境をKinesis Data Firehose, S3, Athenaで構築する方法

2019年08月31日
投稿者:岩佐 孝浩
カテゴリ:Amazon Web Services, Athena, Kinesis Data Firehose, S3 タグ:, , , , , ,
AWS athena

ログ分析環境をKinesis Data Firehose, S3, Athenaで構築する方法

鈴木商店の岩佐です。
鈴木商店に戻って、ちょうど3か月が経ちました。
今は、3年半ほど前に約8か月間従事していたプロジェクトの関連プロジェクトで、SPA開発 (Angular/CakePHP)を担当しています。
約8か月間従事していたプロジェクトでは、ログがRDSに保存されています。
正確な意図は不明ですが、おそらく実装コスト・アクセス数・検索利便性を考慮した結果だと想像しています。
しかし、アクセス数は当初よりもかなり増加しており、RDSは水平スケールが難しいことを考えると、そろそろログ分析環境を構築したほうが良さそうだと思い、今回試してみました。
手順を備忘録として残しておきます。

1. 構成図

特に難しい箇所はありません。
本来、AWS Glueを使用して、Athenaのテーブルを作成するのがベストプラクティスだと考えますが、今回は割愛します。

Athena Log Analytics with Kinesis Firehose
Athena Log Analytics with Kinesis Firehose

2. S3(データレイク)

以下の要件を検討して、ログ出力先を用意して下さい。

  • バージョニング
  • 暗号化
  • パブリックアクセス可否(ブロックを強くお勧め)
  • 3. Kinesis Data Firehose

    2019年2月12日、Custom Prefix がサポートされました。
    https://aws.amazon.com/about-aws/whats-new/2019/02/amazon-kinesis-data-firehose-announces-support-for-custom-amazon-s3-prefixes/?nc1=h_ls
    以前は、ELB Log等と同様の、path/to/YYYY/MM/DD という形式でしたが、Custom Prefix がサポートされたことにより、AWS Glueと組み合わせることで、Athenaのパーティショニングが楽になるようです。(=パーティショニング用のLambdaが不要になる?)

    3.1. ストリーム作成

    Create delivery stream を押して下さい。

    Kinesis Data Firehose - Create delivery stream
    Kinesis Data Firehose – Create delivery stream

    3.2. ストリーム名の入力

    Kinesis Data Firehose - New delivery stream
    Kinesis Data Firehose – New delivery stream

    3.3. データソース指定

    今回は、AWS SDK for PHP を使用して、直接データを流しました。

    https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-firehose-2015-08-04.html#putrecord

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

    Kinesis Data Firehose - Choose source
    Kinesis Data Firehose – Choose source

    PHPでFirehoseにデータを流すコード。
    ※>を全角にしています。そのまま書くと>になってしまったので・・・。

    3.4. レコード加工

    今回はやっていません。

    Kinesis Data Firehose - Process records
    Kinesis Data Firehose – Process records

    3.5. 出力先指定

    S3を選択して下さい。

    Kinesis Data Firehose - Select destination
    Kinesis Data Firehose – Select destination

    3.6. S3設定

    PrefixをApache Hive形式で入力して下さい。

    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}

    Kinesis Data Firehose - S3 destination
    Kinesis Data Firehose – S3 destination

    3.7. バッファ設定

    要件を検討して適当な値を指定して下さい。

    Kinesis Data Firehose - S3 buffer conditions
    Kinesis Data Firehose – S3 buffer conditions

    3.8. 圧縮・暗号化設定

    ログ分析の頻度が低く、コストを抑えたい場合、gzip圧縮がお勧めです。

    Kinesis Data Firehose - S3 compression and encryption
    Kinesis Data Firehose – S3 compression and encryption

    3.9. IAM role

    画面のとおり、新規作成するか既存のIAMロールを選択して下さい。

    Kinesis Data Firehose - IAM role
    Kinesis Data Firehose – IAM role

    4. Athena

    4.1. テーブル作成(S3から)

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

    Athena - Create table from S3 bucket data
    Athena – Create table from S3 bucket data

    4.2. 名前・データの場所

    名前とS3のパスを入力して下さい。

    Athena - Step 1: Name & Location
    Athena – Step 1: Name & Location

    4.3. データフォーマット

    今回はJSONを使用しました。

    Athena - Step 2: Data Format
    Athena – Step 2: Data Format

    4.4. カラム設定

    S3のデータに基づいて、適切なカラムを設定して下さい。

    Athena - Step 3: Columns
    Athena – Step 3: Columns

    4.5. パーティション設定

    必ずパーティションを設定して下さい。
    設定していない場合、S3のデータをフルスキャンするため、とてつもない請求額になる可能性があります。

    Athena - Step 4: Partitions
    Athena – Step 4: Partitions

    4.6. パーティション追加

    メニューの Load partitions を選択して、 MSCK REPAIR TABLE テーブル名; を実行して下さい。
    ログ分析前に毎回実行して、パーティションを構成する必要がありますが、手間であれば、AWS Glueを検討して下さい。

    Athena - Load partitions
    Athena – Load partitions

    4.7. SQLクエリー実行

    いつも通りSQLを実行するだけですが、以下を絶対に守って下さい。

  • WHEREにパーティションキーの条件を書く
  • LIMITを付ける
  • 以上、お役に立てれば幸いです。


    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です