Ошибка при создании метода API Gateway Ответ: NotFoundException: указан недопустимый идентификатор метода

#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 . Теперь ошибка имеет полный смысл — интеграция ссылалась на ресурс, у которого не было связанного метода.