#amazon-web-services #terraform #aws-api-gateway #terraform-provider-aws
#amazon-веб-сервисы #terraform #aws-api-gateway #terraform-provider-aws
Вопрос:
Я пытаюсь создать шлюз AWS API с использованием Terraform, у которого есть ресурс и метод, но я получаю эту ошибку: «Указан недопустимый идентификатор метода»
Полная ошибка (номер строки не соответствует приведенному ниже фрагменту кода):
Error: Error creating API Gateway Method Response: NotFoundException: Invalid Method identifier specified
on api-gateway/api-gateway.tf line 204, in resource "aws_api_gateway_method_response" "method-response-public-get-sites":
204: resource "aws_api_gateway_method_response" "method-response-public-get-sites" {
Error: Error creating API Gateway Integration: NotFoundException: Invalid Method identifier specified
on api-gateway/api-gateway.tf line 214, in resource "aws_api_gateway_integration" "method-integration-public-get-sites":
214: resource "aws_api_gateway_integration" "method-integration-public-get-sites" {
Мне неясно, что такое «идентификатор метода» — это указанный HTTP-метод (например, GET, POST)? В этом случае, я думаю, что они определены правильно.
Вот мой код Терраформирования. Моя цель состоит в том, чтобы определить следующую конечную точку: GET /public/sites
.
resource "aws_api_gateway_rest_api" "api" {
name = "${var.api_gateway_name}-api"
description = "${var.api_gateway_name} api"
policy = data.aws_iam_policy_document.api_policy_doc.json
endpoint_configuration {
types = [
"REGIONAL"
]
}
}
resource "aws_api_gateway_resource" "resource-public" {
rest_api_id = aws_api_gateway_rest_api.api.id
parent_id = aws_api_gateway_rest_api.api.root_resource_id
path_part = "public"
depends_on = [aws_api_gateway_rest_api.api]
}
resource "aws_api_gateway_resource" "resource-public-sites" {
rest_api_id = aws_api_gateway_rest_api.api.id
parent_id = aws_api_gateway_resource.resource-public.id
path_part = "sites"
depends_on = [
aws_api_gateway_resource.resource-public
]
}
resource "aws_api_gateway_method" "method-public-get-sites" {
rest_api_id = aws_api_gateway_rest_api.api.id
resource_id = aws_api_gateway_resource.resource-public.id
http_method = "GET"
authorization = "NONE"
depends_on = [
aws_api_gateway_resource.resource-public-sites
]
}
resource "aws_api_gateway_method_response" "method-response-public-get-sites" {
rest_api_id = aws_api_gateway_rest_api.api.id
resource_id = aws_api_gateway_resource.resource-public-sites.id
http_method = aws_api_gateway_method.method-public-get-sites.http_method
status_code = "200"
depends_on = [
aws_api_gateway_method.method-public-get-sites
]
}
resource "aws_api_gateway_integration" "method-integration-public-get-sites" {
rest_api_id = aws_api_gateway_rest_api.api.id
resource_id = aws_api_gateway_resource.resource-public-sites.id
http_method = aws_api_gateway_method.method-public-get-sites.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = var.lambda_invoke_arn
depends_on = [
aws_api_gateway_method.method-public-get-sites
]
}
resource "aws_api_gateway_integration_response" "integration-response-public-get-sites" {
rest_api_id = aws_api_gateway_rest_api.api.id
resource_id = aws_api_gateway_resource.resource-public.id
http_method = aws_api_gateway_method.method-public-get-sites.http_method
status_code = aws_api_gateway_method_response.method-response-public-get-sites.status_code
depends_on = [
aws_api_gateway_integration.method-integration-public-get-sites,
aws_api_gateway_method_response.method-response-public-get-sites
]
}
Я прочитал несколько постов на SO и Github, в которых предлагается реализовать depends_on
, что я и сделал, но, к сожалению, это не возымело эффекта. Я запустил terraform один раз без методов / ресурсов / etc (только ресурс api rest api шлюза), чтобы создать его первым, затем выполнил второй запуск с ресурсом / методом / etc
Спасибо
Комментарии:
1. Просто для того, чтобы мы поняли и сузили поиск — какой из следующих ресурсов не работает (создается Terraform)?
2. Я думаю, вы видели там тему проблемы: github.com/hashicorp/terraform-provider-aws/issues/4001
3. Пожалуйста, дважды проверьте свои ресурсы и методы.
aws_api_gateway_resource.resource-public-site
с ним не связан какой-либо HTTP-метод (например, GET). Единственный ресурс с методом (method-public-get-sites
)aws_api_gateway_resource.resource-public
— это тот, который не используется при интеграции. Используется интеграцияaws_api_gateway_resource.resource-public-sites
, в которой нет определенного метода HTTP.4. @GrzegorzOledzki я сделал комментарий. Я думаю, вы были близки. Похоже, проблема связана с отсутствующими методами.
5. Спасибо @Marcin, вы правы
resource_id
aws_api_gateway_method.method-public-get-sites
, иaws_api_gateway_integration_response.integration-response-public-get-sites
было настроеноaws_api_gateway_resource.resource-public.id
, и так и должно было бытьaws_api_gateway_resource.resource-public-sites.id
. Теперь ошибка имеет полный смысл — интеграция ссылалась на ресурс, у которого не было связанного метода.