😄

TerraformでWAFのログの出力先をs3バケットに設定する際に`ARN isn't valid`とでた時の解消法のメモ

2024/12/12に公開
2

TerraformでWAFのログの出力先をs3バケットに設定する際にARN isn't validとでた時の解消法のメモ

TerraformでWAFのログの出力先をs3バケットに設定する際にARN isn't validとでた。
ロググループのprefixも記述済みなのにも関わらずエラーが発生していた。

エラーコード

Resource handler returned message: "Error reason: The ARN isn't valid. A valid ARN begins with arn: and includes other information separated by colons or slashes., field: LOG_DESTINATION, parameter: arn:aws:logs:us-east-1:~:log-group:waf-logs-xxxxx

エラー発生時のTerraformのコード

provider "aws" {
  alias  = "us-east-1"
  region = "us-east-1"
}

resource "aws_wafv2_web_acl" "cloudfront_image_waf" {
  name        = "CloudfrontImageWAF"
  description = "WAF for Cloudfront"
  scope       = "CLOUDFRONT"

  provider = aws.us-east-1
 
  default_action {
    allow {}
  }
 
  // その他設定
 
  tags = var.cloudfront_tags
 
  visibility_config {
    cloudwatch_metrics_enabled = false
    metric_name                = "CloudfrontImageWAFMetric"
    sampled_requests_enabled   = false
  }
}

resource "aws_s3_bucket" "cloudfront_log_bucket" {
  bucket = "aws-waf-logs-${var.cloudfront_bucket_name}"
  
  tags = var.tags
}

resource "aws_wafv2_web_acl_logging_configuration" "cloudfront_log_config" {
  log_destination_configs = ["${aws_s3_bucket.cloudfront_log_bucket.arn}"]
  resource_arn = aws_wafv2_web_acl.cloudfront_image_waf.arn

  logging_filter {
    default_behavior = "KEEP"

    filter {
      behavior = "DROP"
      condition {
        action_condition {
          action = "BLOCK"
        }
      }
      requirement = "MEETS_ANY"
    }
  }
}

解決法

aws_wafaws_wafv2_web_acl_logging_configurationのproviderを同じ値に指定しておくと解決した。なぜ解決したか説明ができず、自分の実力不足を痛感した。

修正(12/13)

aws_wafaws_wafv2_web_acl_logging_configurationは同一リージョンのリソースでなければならない。

rakiさんより教えていただきました。

resource "aws_wafv2_web_acl_logging_configuration" "cloudfront_log_config" {
  log_destination_configs = ["${aws_s3_bucket.cloudfront_log_bucket.arn}"]
  resource_arn = aws_wafv2_web_acl.cloudfront_image_waf.arn
+ provider = aws.us-east-1

  logging_filter {
    default_behavior = "KEEP"

    filter {
      behavior = "DROP"
      condition {
        action_condition {
          action = "BLOCK"
        }
      }
      requirement = "MEETS_ANY"
    }
  }
}

参考

最後に

間違っていることがあればコメントに書いていただけると幸いです。
よろしくお願いいたします。

GitHubで編集を提案

Discussion

rakiraki

aws_wafv2_web_acl_logging_configuration.cloudfront_log_config に
resource_arn = aws_wafv2_web_acl.cloudfront_image_waf.arn って書いているので、
aws_wafv2_web_acl_logging_configuration リソースは aws_wafv2_web_acl と同じリージョンにないとダメだから provider = aws.us-east-1 をつけたことで解消した、ということでしょう。

エラーメッセージにも us-east-1 のやつじゃないと、って書かれていますし。

短く言うなら acl と acl log conf は同じリージョンのリソースじゃないとダメ、ということです。

御楯玄嶽御楯玄嶽

返信が遅くなり申し訳ございません。解決後にエラーメッセージを翻訳したらrakiさんの言う通りのことが書いてありました。お恥ずかしい限りです。コメントしていただきありがとうございました。