Terraformで AWS WAF を作成したが、リソースがAWSコンソールに表示されない問題

Terraform で AWS WAF を作成してみたのですが、Terraform上は作成が完了した、と表示されるのに AWS のマネジメントコンソール上にはリソースが表示されなかったので、なぜそうなるのかをブログにしたためておきます。

前提の共有

WAFで実現したかった事

dev.classmethod.jp

外国からのアクセスを遮断したくて、WAFの対応をしていました。

上記のブログはマネジメントコンソールで手動で作っていくタイプのものだったので、リソースをコード管理する為にも Terraformで作ろうと思い調整をしていたという所でした。

Terraform で AWS WAF を作成する為には

www.terraform.io

上記が公式のAWS WAF の対応ページです。

AWS WAF を Terraform で作るには それぞれ以下をする必要があります。

  • match_set と呼ばれる条件を記述したリソースを作成する
  • 単一 or 複数 のmatch_set を組み合わせて Rule を作成する
  • Ruleを指定して WebACL ( Access Control List ) を作成する

今回でいうと、このような形で Terraform を記述していました。

provider "aws" {
  profile = "sample"
  region = "ap-northeast-1"
}

resource "aws_waf_geo_match_set" "geo_china_match" {
  name = "china_block_rule"

  geo_match_constraint {
    type = "Country"
    value = "CN"
  }
}

resource "aws_waf_rule" "china_block_rule" {
  depends_on = [aws_waf_geo_match_set.geo_china_match]
  name = "testBlockChinaRule"
  metric_name = "testBlockChinaRuleMetric"

  predicates {
    data_id = aws_waf_geo_match_set.geo_china_match.id
    negated = false
    type    = "GeoMatch"
  }
}

resource "aws_waf_web_acl" "waf_acl" {
  depends_on = [aws_waf_geo_match_set.geo_china_match, aws_waf_rule.china_block_rule]
  name = "testWebACL"
  metric_name = "testWebACLMetrics"

  default_action {
    type = "ALLOW"
  }

  rules {
    action {
      type = "BLOCK"
    }

    priority = 1
    rule_id = aws_waf_rule.china_block_rule.id
    type = "REGULAR"
  }
}

上記を main.tf に記述してterraform apply をした所、正常にリソースの作成が完了しました。 が、ACLが一向にマネジメントコンソールに出てこないです。

色々試行錯誤をしてやっと理由が分かったので次章にしたた目ます!

WAF V2 と WAF V1

現在、WAF & Shield のページをマネジメントコンソール上で開くと Switch to AWS WAF Classic というボタンが表示されます。そこにはこのように記されています。

Introducing the new AWS WAF
We've improved the console and API experience and added AWS Managed Rules. Learn more.

Note: The previous version of AWS WAF is now named AWS WAF Classic. To access resources created with that version, switch to AWS WAF Classic.

AWS WAF の旧バージョンは AWS WAF Classic という名前になりました。
そのバージョンで作成されたリソースにアクセスするには、AWS WAF Classicに切り替えてください。

という事でもしやと思い、 AWS WAF Classic のコンソールに切り替えた所、見事的中して Terraform で作成したWAFのリソースがある事が確認出来ました。

つまり、現在 Terraform で AWS WAF を作成すると AWS WAF Classic のリソースとして作成されてしまうようです。

AWS の provider は 2.62.0 を使っていたので、このバージョン以前の場合は全てこれになるのでは?と思います。

今のものは AWS WAF V2 みたいな名前で扱われているようでした。

回避策は?

github.com

2020-05 現在の情報ですが上記のようなissueがあります。

今の aws_waf_web_acl と区別して aws_wafv2_web_acl という名前で リソース名を定義してしまって 作れるようにしようという issue です。

現状、そちらに対して 2つのPRが出ているという状態のようです。

github.com

github.com

コミットログをたどったりすると 前者は 2週間前にもコミットが上がっていたりしますね。 後者は 前者のマージ待ち ってのがまさに今日の11時ごろにお話されているようです。w

・・・・という事で待つしか無いのかなぁ、って感じですかね。

後・・・これは今の所見ないようにしているんですけど、公式の AWS WAF V2 のAPIドキュメントですね。

docs.aws.amazon.com

AWS WAF Classic の方には CreateGeoMatchSet のメソッドがあるのに、 AWS WAF V2 の方には・・無いですね。

これは・・?一体・・・?

結論

という事でリリースを待ちましょうみたいな何とも解決してないブログになってしまいました。

issue だったりとかが作成されているし、開発状況がリアルタイムで把握出来るのって本当 助かります m( )m

長年の悩みが理解できました。おしまい。