Amazon Kinesis Data Firehoseの動的パーティショニング(jqパーサー)を試してみた

Amazon Kinesis Data Firehose の 動的パーティショニング を利用して、AWS WAFアクセスログの分類を試してみました。
2021.09.07

AWSチームのすずきです。

Amazon Kinesis Data Firehose、動的パーティショニング をサポートするアップデートがありました。

今回、動的パーティショニングを有効にした Firehose 配信ストリームを AWS WAFのアクセスログ の出力先に設定。 jqパーサーを利用したブロック(BLOCK)判定ログの分類を試みる機会がありましたので、紹介させていただきます。

Amazon Kinesis Data Firehose の動的パーティショニングのご紹介

Firehose 設定

Kinesis Data Firehose 配信ストリームの新規作成時、 動的パーティショニング (Dynamic partitioning)の設定が可能になりました。

JSON処理

jqパーサーを用いたインライン解析を行う指定としました。

キー設定

「action」と「httpSourceId」をパーティションキーとする設定を行いました。

Key name JQ expression
action .action
httpSourceId .httpSourceId

サンプル

以下のAWS WAF、BLOCKログが、分類できる事を確認しました。

{
  "timestamp": 1630926211307,
  "formatVersion": 1,
  "webaclId": "arn:aws:wafv2:ap-northeast-1:0000:regional/webacl/000-000-webacl/0000-0000-0000",
  "terminatingRuleId": "000-wafv2-UserAgent-BlackList",
  "terminatingRuleType": "REGULAR",
  "action": "BLOCK",
  "terminatingRuleMatchDetails": [],
  "httpSourceName": "ALB",
  "httpSourceId": "0000-app/000-000-000/0000",
  "ruleGroupList": [
    {
      "ruleGroupId": "arn:aws:wafv2:ap-northeast-1:0000:regional/rulegroup/000-wafv2-WhiteListRuleGroup/00-00-00-00-00",
      "terminatingRule": null,
      "nonTerminatingMatchingRules": [],
      "excludedRules": null
    }
  ],
  "httpRequest": {
    "clientIp": "0.0.0.0",
    "country": "US",
    "headers": [
      {
        "name": "User-Agent",
        "value": "Mozilla/5.0 zgrab/0.x"
      }
    ],
    "uri": "/UPnP/IGD.xml",
    "httpVersion": "HTTP/1.1",
    "httpMethod": "GET"
  }
}

S3設定設定

Firehose 出力先 S3の S3 bucket prefix のカスタマイズを実施しました。

jqパーサーで得られた2つのパーティションキー(actionhttpSourceId)をS3のキーに含める設定としました。

waflog-dp/!{partitionKeyFromQuery:httpSourceId}/action=!{partitionKeyFromQuery:action}/!{timestamp:'year='yyyy'/month='MM'/day='dd'/hour='HH}/

実行例

ALB名(httpSourceId)直下のキー階層で、「action=BLOCK」と「action=ALLOW」の分類が実現できました。

ブロックされたアクセスログのみが「action=BLOCK」以下で確認可能になりました。

S3オブジェクトのキーサンプル

s3://<S3バケット名>/waflog-dp/<httpSourceId>/action=BLOCK/year=2021/month=09/day=06/hour=11/<Firehose名>-2021-09-06-11-03-31-###.gz

料金

東京リージョンで S3の動的パーティショニングを利用すると、以下の料金が追加で発生します。

説明 金額
Per GB delivered $0.032
Per 1,000 objects delivered $0.008
JQ processing, per hour (optional) $0.112

まとめ

従来、ログレコードに含まれれるデータをS3のパーティションとして反映するためには、Lambda、Glueなどでコード実装が必要でしたが、 jqパーサーで処理できるJSONデータであれば、ノーコードで利用可能になりました。

動的パーティショニングを利用する事で Athena などを利用した分析の効率化が期待できる場合には、ぜひご活用ください。

  • Lambda利用例

尚、Block ログのみを必要とする場合、AWS WAF標準でサポートされているフィルタリングをお試しください。