设置
露台资源
我创建了一个私有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表示他们将解决此问题
答案 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不知道可以解决冲突。要解决它,您应该: