Терраформ уничтожить API-шлюз с VPC Link не удается
Настроить
- Terraform v 0.11.14
- OpenAPI spec 3.0 для определения тела моего шлюза API
Terraform Resources
Я создал Private API Gateway, который направляет трафик в NLB через VPC Links. Я развернул 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}"]
}
Ссылка на 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'
вопрос
Когда я бегу terraform destroy
Я получаю следующее сообщение:
Ошибка: ошибка при применении плана:
Произошла 1 ошибка:
* aws_api_gateway_vpc_link.nlb (уничтожить): произошла 1 ошибка:
* aws_api_gateway_vpc_link.nlb: ошибка при удалении API-интерфейса шлюза VPC (bgzpv1): BadRequestException: невозможно удалить ссылку vpc. Ссылка Vpc 'bgzpv1', указана в развернутых стадиях [POST:50f55s: разработка, GET:50f55s: разработка] в формате [Метод: Ресурс: Этап], а также в неразрешенной интеграции [GET:50f55s, POST:50f55s] в формате из [Метод: Ресурс]. код состояния: 400, идентификатор запроса: d9a9667b-8099-11e9-98d1-9f899674f4b9
Если я подожду несколько минут, а затем запустить terraform destroy
опять же следующие ресурсы уничтожаются:
aws_lb.app
aws_api_gateway_vpc_link.nlb
Я имел Google, но не могу найти много информации по теме. Был поднят билет на форумах поддержки AWS, но это было некоторое время назад, и AWS указала, что они собираются решить проблему
0 ответов
Фактический ответ на это немного отличается от того, что упоминал @dtelaroli, и я исследовал, в чем может быть проблема.
Когда API Gateway развернут, он встроен в дистрибутив и отправляется в CloudFront, где он обслуживается.
Если вы ссылаетесь на ссылку VPC, эта ссылка встроена в дистрибутив и также передается в CloudFront. Вот почему при развертывании этого API связь VPC не может быть уничтожена. Потому что он используется в действующем дистрибутиве CloudFront.
Чтобы уничтожить ссылку VPC, вам нужно сначала удалить интеграцию, которая нацелена на ссылку VPC, а затем снова развернуть API Gateway, это будет означать, что ваш API, вероятно, сломан на этом этапе, но теперь вы сможете удалить Ссылка VPC.
На этом этапе вы должны иметь возможность уничтожить свой API-шлюз или каким-либо образом его восстановить, потому что CloudFront больше не содержит это соединение с каналом VPC.
Я не могу представить, как это можно создать в сценарии или встроить в terraform с помощью нулевых ресурсов или чего-то подобного, но это причина возникновения проблемы.
Это происходит потому, что он связан с методом интеграции в развернутой стадии, а Terraform не знает, как разрешить конфликт. Для ее решения вам необходимо:
- Удалите ассоциацию с VPC Link, создав еще одну VPC Link, и измените ассоциацию. Не забудьте развернуть его.
- Просто удалите этап развертывания, связанный с ресурсом.