はじめに
AWS CDKでAWS WAFのうち、BLOCKしたもののみS3バケットに保存したい時があり、試行錯誤してできたので記録として残しておく。
以下記事でCloudFormationで実装した例があったので参考にさせていただいた。
実装内容
実装内容としては以下である(WebACLとS3バケットの実装については省略)。
CfnLoggingConfiguration
を使用している。
import { aws_wafv2 as wafv2 } from 'aws-cdk-lib'; const logConfig = new wafv2.CfnLoggingConfiguration(this, 'WafLoggingConfiguration', { logDestinationConfigs: [s3Bucket.bucketArn], // S3バケットのARNを指定 resourceArn: webAcl.attrArn,// WebACLのみ指定 // 以下フィルターを設定 loggingFilter: { DefaultBehavior: 'DROP', //デフォルトはDROPとする // ただしBLOCKした場合のみKEEPの設定とする Filters: [{ Behavior: 'KEEP', // 条件に合致した場合の挙動(KEEP) Conditions: [{ ActionCondition: { Action: 'BLOCK' // BLOCKされた場合のみ } }], Requirement: 'MEETS_ALL' . // 条件全てに合致した場合 }] } }) // 依存関係を定義 logConfig.addDependsOn(webAcl) logConfig.addDependsOn(s3Bucket.node.defaultChild as cdk.CfnResource)
以下詳細を記載していく。
const logConfig = new wafv2.CfnLoggingConfiguration(this, 'WafLoggingConfiguration', { logDestinationConfigs: [s3Bucket.bucketArn], // S3バケットのARNを指定 resourceArn: webAcl.attrArn,// WebACLのARNを指定
上記のようにログ出力先のバケット、WebACLのarnを指定する。
// 以下フィルターを設定 loggingFilter: { DefaultBehavior: 'DROP', //デフォルトはDROPとする // ただしBLOCKした場合のみKEEPの設定とする Filters: [{ Behavior: 'KEEP', // 条件に合致した場合の挙動(KEEP) Conditions: [{ ActionCondition: { Action: 'BLOCK' // BLOCKされた場合のみ } }], Requirement: 'MEETS_ALL' . // 条件全てに合致した場合 }] }
今回肝となる「BLOCK時のみ」のログ出力に該当する箇所。参考リンクのCloudFormation設定内容をそのまま参考にさせていただいた。
基本はログはDROP(捨てる)するが、ActionがBLOCKという条件の場合のみKEEP(保持)という設定である。
// 依存関係を定義 logConfig.addDependsOn(webAcl) logConfig.addDependsOn(s3Bucket.node.defaultChild as cdk.CfnResource)
こちらはちょっとハマった箇所。cdk deploy
時にログ設定をWebACLやS3バケットよりも先に作ろうとしてエラーなってしまうことがあった。
そのためWebACL,S3バケットが作成された後でログ設定を行うように依存関係を明示している。
以上でAWS WAFのログでブロックしたもののみS3に出力できる。