具有VPC Link的Terraform destroy API网关失败

时间:2019-05-27 16:47:23

标签: amazon-web-services terraform aws-vpc-link

设置

  • Terraform v 0.11.14
  • OpenAPI spec 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}"]
}

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

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'

问题

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

  

错误:应用计划时出错:

     

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

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

  • aws_lb.app
  • aws_api_gateway_vpc_link.nlb

我有一个Google,但是找不到关于该主题的太多信息。 AWS支持论坛上有一个ticket raised,但这是前一阵子,AWS表示他们将解决此问题

2 个答案:

答案 0 :(得分:1)

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

部署API网关后,它将内置到发行版中,并推送到提供服务的CloudFront中。

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

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

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

我无法考虑如何通过使用null资源或类似的东西来编写脚本或将其内置到terraform中,但这就是问题发生的原因。

答案 1 :(得分:0)

之所以发生这种情况,是因为它与已部署的Stage中的Integration Method相关联,并且Terraform不知道可以解决冲突。要解决它,您应该:

  1. 将关联删除到VPC链接,创建另一个VPC链接,然后 更改关联。不要忘记部署它。
  2. 只需删除与该资源相关联的部署阶段。