Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

【小ネタ】TerraformでAWS WAFのログ取得設定を行う際の注意点

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さーいっこう!