SREチームのはぶちです。
今回はTerraformからAWS WAFのログ取得設定を行う手順と、ちょっとした注意点について記事にしたいと思います。

はじめに
AWS WAFのログの出力設定する際に条件を絞って出力したいケースがあると思います。
その際に、INFO以外の全てのログを取得したい場合は、ログフィルタの条件としてBLOCK、COUNTに加えてEXCLUDED_AS_COUNTも指定していないと取りこぼしてしまうことがあります。
※詳細はクラスメソッドさんの記事で分かりやすく解説されているのでチェックしてみてください。
AWS WAFでカウントされたログ取りこぼしてませんか? | DevelopersIO
しかし2022/6/1現在、EXCLUDED_AS_COUNTはマネジメントコンソールからは指定できず、AWS CLIやAPIからしか設定できません。
でも安心してください。従順なTerraformarの皆さんはTerrafromから簡単に設定することができます。
注意点
TerraformのAWSプロバイダーのバージョンが古いとバリデーションで怒られてしまうようです。
(v3.58.0ではだめでしたが、 terraform init upgrade などを実行して最新のAWSプロバイダーに更新すれば大丈夫です)
$ terraform plan
Error: expected logging_filter.0.filter.0.condition.2.action_condition.0.action to be one of [ALLOW BLOCK COUNT], got EXCLUDED_AS_COUNT
on waf-stg.tf line 144, in resource "aws_wafv2_web_acl_logging_configuration" "example":
100: filter {
terraformコードのサンプル
以下のような aws_wafv2_web_acl_logging_configuration を書くことで簡単にInfo以外のログを取得することができます。
wafやログ保存先(S3、CloudWatch Logs)のコードは省略しています。
使用バージョン: tfversion 1.1.9、hashicorp/aws v4.16.0
resource "aws_wafv2_web_acl_logging_configuration" "example" {
provider = aws.useast1
log_destination_configs = [<example-arn>]
resource_arn = aws_wafv2_web_acl.example.arn
logging_filter {
default_behavior = "DROP"
filter {
behavior = "KEEP"
condition {
action_condition {
action = "COUNT"
}
}
condition {
action_condition {
action = "BLOCK"
}
}
condition {
action_condition {
action = "EXCLUDED_AS_COUNT"
}
}
requirement = "MEETS_ANY"
}
}
redacted_fields {
single_header {
name = "cookie"
}
}
redacted_fields {
single_header {
name = "if-none-match"
}
}
}
さいごに
簡単ですが、TerrafrormでAWS WAFのログを取得する際の注意点について書いてみました。
少しでもどこかの迷えるTerraformarのお役に立てればと幸いです。
Terraformさーいっこう!