Terraform 破坏 API 网关且 VPC 链接失败

Gre*_*uff 2 amazon-web-services amazon-vpc terraform

设置

  • 地形 v 0.11.14
  • OpenAPI 规范 3.0 定义我的 API 网关的主体

地形资源

我创建了一个私有 API 网关,它通过 VPC 链接将流量路由到 NLB。我已经部署了 API,但为了简洁起见,我省略了下面的该资源,因为它很琐碎。

resource "aws_api_gateway_rest_api" "this" {
  name        = "MyAPI"
  body        = "${file("./api-spec.yaml")}"

  endpoint_configuration {
    types = ["PRIVATE"]
  }
}

resource "aws_lb" "app" {
  name               = "MyNLB"
  internal           = true
  load_balancer_type = "network"
  subnets            = ["MySubnetIds"]
}

resource "aws_api_gateway_vpc_link" "nlb" {
  name        = "api-gateway-to-nlb"
  target_arns = ["${aws_lb.app.arn}"]
}
Run Code Online (Sandbox Code Playgroud)

文件中引用了 VPC 链接api-spec.yaml。相关部分是:

paths:
  /items:
    get:
      summary: Gets a collection of items
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Item'
      x-amazon-apigateway-integration:
        type:              http_proxy
        httpMethod:        GET
        uri:               https://my-internal-nlb/api/v1/items
        connectionType:    "VPC_LINK"
        connectionId:      "${vpclink_id}"
        responses:
          default:
            statusCode: '200'
Run Code Online (Sandbox Code Playgroud)

问题

当我运行时terraform destroy,我收到以下消息:

错误:应用计划时出错:

发生 1 个错误:
* aws_api_gateway_vpc_link.nlb(销毁):发生 1 个错误:
* aws_api_gateway_vpc_link.nlb:删除 API Gateway VPC 链接 (bgzpv1) 时出错:BadRequestException:无法删除 vpc 链接。Vpc 链接“bgzpv1”在已部署阶段 [POST:50f55s:development, GET:50f55s:development] 中以 [Method:Resource:Stage] 格式引用,也在未部署集成 [GET:50f55s, POST:50f55s] 中以 [Method:Resource:Stage] 格式引用[方法:资源]。状态代码:400,请求 ID:d9a9667b-8099-11e9-98d1-9f899674f4b9

如果我等待几分钟然后terraform destroy再次运行,以下资源将被破坏:

  • aws_lb.app
  • aws_api_gateway_vpc_link.nlb

我用谷歌搜索过,但找不到有关该主题的太多信息。AWS 支持论坛上提出了一张罚单,但这是不久前的事,AWS 表示他们将解决该问题

Chr*_*mas 5

实际答案与 @dtelaroli 提到的略有不同,我一直在研究问题可能是什么。

部署 API Gateway 后,它会内置到发行版中并推送到为其提供服务的 CloudFront。

如果您引用 VPC 链接,则该链接会内置到分配中并也会推送到 CloudFront。这就是为什么部署此API时,VPC链接无法被破坏。因为它正在实时 CloudFront 发行版中使用。

为了销毁VPC链接,您需要首先删除针对VPC链接的集成,然后再次部署API网关,这意味着您的API可能在这个阶段被破坏,但现在您将能够删除VPC 链接。

此时,您应该能够销毁 API 网关,或以某种方式重建它,因为 CloudFront 不再包含与 VPC 链接的连接。

我无法想象如何通过使用空资源或类似的东西来编写脚本或将其构建到 terraform 中,但这就是问题发生的原因。

  • 实际上我的回答是一个更详细和有效的解释。我详细说明发生了什么以及原因。你只是陈述了一系列事情,但没有解释为什么会发生这些事情。你给了我-1,因为你很沮丧你没有解释得足够而且你的回答没有效果。谢谢!;) (3认同)