Свяжите веб-ACL AWS WAFv2 с ApiGatewayV2

Я хочу связать веб-ACL WAFv2 с этапом HTTP API GatewayV2.

Следуя терраформу docs, я попробовал следующее:

resource "aws_wafv2_web_acl_association" "this" {
  resource_arn = aws_apigatewayv2_stage.this.arn
  web_acl_arn  = aws_wafv2_web_acl.this.arn
}

Однако это не было принято из-за ошибки:

Ошибка: WAFInvalidParameterException: Причина ошибки: недействительный ARN. Допустимый ARN начинается с arn: и включает другую информацию, разделенную двоеточиями или косыми чертами., Поле: RESOURCE_ARN, параметр: arn: aws: apigateway: eu-west-2 :: / apis / abcd1234 / stage / my-stage

Из документации AWS шаблон для ARN следующий:

arn:aws:apigateway:region::/restapis/api-id/stages/stage-name

Однако только ARN старого шлюза API использует restapis в своем ARN. Шлюзы v2 используют только apis.

  1. Поэтому ARN недействителен?
  2. Как связать этап HTTP AWS API GatewayV2 с веб-списком контроля доступа AWS WAFv2?

По запросу, вот код шлюза:

resource "aws_apigatewayv2_api" "this" {
  name          = "example-http-api"
  protocol_type = "HTTP"
}

resource "aws_lambda_function" "this" {
  filename      = "example.zip"
  function_name = "Example"
  role          = var.lambda_arn
  handler       = "index.handler"
  runtime       = "nodejs10.x"
}

resource "aws_apigatewayv2_integration" "get" {
  api_id             = aws_apigatewayv2_api.this.id
  integration_type   = "AWS_PROXY"
  integration_method = "GET"
  integration_uri    = aws_lambda_function.this.invoke_arn
}

resource "aws_apigatewayv2_route" "get" {
  api_id    = aws_apigatewayv2_api.this.id
  route_key = "$default"
  target    = "path/${aws_apigatewayv2_integration.get.id}"
}

resource "aws_apigatewayv2_stage" "this" {
  api_id = aws_apigatewayv2_api.this.id
  name   = "example-stage"
}

И код для Web-ACL:

 resource "aws_wafv2_web_acl" "this" {
  scope       = "REGIONAL"

  default_action {
    allow {}
  }

  rule {
    name     = "common-rule-set"
    priority = 1

    override_action {
      none {}
    }

    statement {
      managed_rule_group_statement {
        name        = "AWSManagedRulesCommonRuleSet"
        vendor_name = "AWS"
      }
    }

    visibility_config {
      cloudwatch_metrics_enabled = false
      metric_name                = "common-rule-set"
      sampled_requests_enabled   = false
    }
  }
  
  visibility_config {
    cloudwatch_metrics_enabled = false
    metric_name                = "web-acl"
    sampled_requests_enabled   = false
  }
}

person RKZ    schedule 07.08.2020    source источник
comment
Не могли бы вы поделиться кодом, используемым для WAF и API Gateway, а не только частью ассоциации?   -  person Marko E    schedule 07.08.2020
comment
Я сделал это сейчас @MarkoE   -  person RKZ    schedule 08.08.2020


Ответы (2)


HTTP API не поддерживает WAF:

Пространство имен API V1 представляет REST API, а API V2 представляет API WebSocket и новые HTTP API. Источник: https://aws.amazon.com/blogs/compute/announcing-http-apis-for-amazon-api-gateway/

А также

В настоящее время мы не поддерживаем WAF для HTTP API. У нас есть элемент невыполненной работы по этому запросу. Спасибо, что обратились к нам. https://forums.aws.amazon.com/thread.jspa?messageID=942361

person Moose on the Loose    schedule 28.01.2021

Я думаю, что в вашем коде ошибка. На этапе API Gateway вы используете этот блок:

resource "aws_apigatewayv2_stage" "example" {
  api_id = aws_apigatewayv2_api.this.id
  name   = "example-stage"
}

в то время как в ассоциации WAF вы используете:

resource "aws_wafv2_web_acl_association" "this" {
  resource_arn = aws_apigatewayv2_stage.this.arn
  web_acl_arn  = aws_wafv2_web_acl.this.arn
}

Измените resource_arn = aws_apigatewayv2_stage.this.arn на resource_arn = aws_apigatewayv2_stage.example.arn. Вы назвали ресурс этапа шлюза API example, но пытались получить доступ к атрибутам ресурса с именем this, которого не существует.

person Marko E    schedule 08.08.2020
comment
Извините, я быстро внес некоторые изменения, так как вам нужно было больше кода. Ошибка, которую я получаю, связана не с ошибкой исходного кода terraform (я исправлю terraform в вопросе), а с тем, что ARN недействителен (WAFInvalidParameterException). - person RKZ; 10.08.2020