この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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つのパーティションキー(action
、httpSourceId
)を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標準でサポートされているフィルタリングをお試しください。