TerraformでAWS WAFを基礎から学ぶ(メトリクスとサンプリング編)

# はじめに
[基本のルール設定編](https://qiita.com/neruneruo/items/2fd4b139ebe009df4155)の続き。
今回は、メトリクスとサンプリングについて確認をしていく。

単純にメトリクスが取れるだけかと思いきや、Web ACL のマネージメントコンソールトップに表示されるメトリクスは一癖ある感じなので特性を理解しよう。

# メトリクスは何が一癖あるのか
Web ACL のマネージメントコンソールトップに表示されるメトリクスを複雑にしているのは以下の3点。

- Web ACL のアクションが Allow か Block かによって計上・表示されるメトリクスが違うという点
- Web ACL 全体のメトリクスと個別ルールのメトリクスがあるという点
- 上記とは別に ALL AllowedRequests/ALL BlockedRequests というメトリクスがあるという点

上記をもう少し詳細に調べてみると、以下の仕様であった。

- Web ACL のデフォルトアクションが Allow の場合は、ルールの AllowedRequests と、ALL BlockedRequests が表示される
- Web ACL のデフォルトアクションが Block の場合は、ルールの BlockedRequests と、ALL AllowedRequests が表示される
- ALL AllowedRequests / ALL BlockedRequests は実際に許容/ブロックした件数ではなくて、あくまでも全体または個別のメトリクスの合計

このため、全体または個別のメトリクスをすべて Enable(TerraformではTrue) にしていないと、正確な件数を把握することはできない。

また、Web ACL のマネージメントコンソールでは全体像が見づらいので、コストをケチる目的がない限りは、すべてのメトリクスを Enable にして、CloudWatch メトリクスのコンソールで、すべてのメトリクスを表示するグラフを作った方が良いのではないかと感じた。

↓こんな感じ。これはデフォルトアクションが Allow、個別のアクションが Block でそれぞれメトリクスを Enable にした場合の全体像の把握のためのグラフ。

![キャプチャ8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/3ecd1b5b-ac08-e2ed-7043-80eeeb729d65.png)

Terraform では、```aws_wafv2_web_acl``` 本体と ```rule``` ブロックの設定の ```cloudwatch_metrics_enabled``` を ```true``` にする。```metric_name``` はテキトーに分かりやすい名前をつけておこう。

```HCL
  visibility_config {
    cloudwatch_metrics_enabled = true
    metric_name                = local.webacl_metric_name
    sampled_requests_enabled   = false
  }
```

# サンプリング
サンプリングは、有効化した ```visibility_config``` について、ALLOW ないし BLOCK の結果を記録してくれる。主にフィルタ内容のテスト目的ということだろうか？

マネージメントコンソールの Web ACL の OverView のタブの下部で、以下のような情報を確認できる。

![キャプチャ15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/a07b9fba-5a01-fa71-4004-bf8aa97c7b00.png)

Terraform で有効化するには、```aws_wafv2_web_acl``` 本体と ```rule``` ブロックの設定の ```sampled_requests_enabled``` を ```true``` にする。メトリクスは関係ないかと思いきや、上記画面の右上のプルダウンで、メトリクス名で絞ることが可能なので、CloudWatch と同様に、 ```metric_name``` は分かりやすい名前にしておこう(CloudWatch メトリクスの名前と共用される)。

```HCL
  visibility_config {
    cloudwatch_metrics_enabled = false
    metric_name                = local.webacl_metric_name
    sampled_requests_enabled   = true
  }
```

HTTPリクエストに対してルールに引っかかって Allow したか Block したかのどちらかのみ出力される。
どのルールで引っかかったか(もしくは引っかからずデフォルトアクションとなったか)を確認する感じだろう。

なお、マネージメントコンソールの Web ALC の Logging and Metrics のタブから設定の詳細を確認することが可能だ。

![キャプチャ16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/7f77caf7-7037-5443-f980-230632730982.png)

Web ACLのデフォルトの ```visibility_config``` と、ルール単位の ```visibility_config``` の設定内容によって以下のように表示される。

- デフォルト＝true, ルール＝false
![キャプチャ9_block_true_false.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/ae607d66-60bd-f748-a484-269fc4da18a6.png)

- デフォルト＝true, ルール＝true
![キャプチャ10_block_true_true.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/984fda00-1b8b-ff8b-20fc-db3658859420.png)

- デフォルト＝false, ルール＝true
![キャプチャ11_block_false_true.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/d27283b6-fcf2-89e2-4689-0874f9734811.png)

分かりにくい……。Terraform の方がよっぽどシンプルだ。
Request sampling for web ACL default action がデフォルトの ```visibility_config``` の有効無効、Request sampling options は、デフォルトとルールで違う設定にしたいときにラジオボタンを付けるようだ。

ともあれ、これでメトリクスとサンプリングについても設定方法と使い方は理解できた！