Настройки ответа интеграции API-шлюза удаляются после применения второй терраформы с тем же кодом - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь создать REST API в AWS API Gateway с помощью terraform.

Чтобы включить CORS, дополнительные методы и соответствующие параметры интеграции подготовлены в моем коде tf. Это хорошо работает, когда я впервые сделал «план terraform» -> «применить терраформ» . Проверив с консоли управления AWS, я обнаружил, что при написании опции был создан метод выбора.

Однако, когда я сделал «план terraform» -> «применение terraform» * второй раз без каких-либо изменений API-шлюза, параметры ответа интеграции для метода Option были удалены, даже если применение было завершено . («Удалено» означает, что все ответы интеграции исчезают из консоли управления).

Это обычное поведение? Нужны ли дополнительные настройки для моего кода terraform?

Мой нынешний код следующий:

resource "aws_api_gateway_resource" "my_api_resource" {
  rest_api_id = "${aws_api_gateway_rest_api.my_api.id}"
  parent_id   = "${aws_api_gateway_rest_api.my_api.root_resource_id}"
  path_part   = "my_api_resource"
}

resource "aws_api_gateway_method" "my_api_method" {
  rest_api_id   = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id   = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method   = "GET"
  authorization = "NONE"
}

resource "aws_api_gateway_integration" "integration_request" {
  rest_api_id             = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id             = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method             = "${aws_api_gateway_method.my_api_method.http_method}"
  integration_http_method = "POST"
  type                    = "AWS"
  uri                     = "${var.my_lambda_invocation_arn}"
}

resource "aws_api_gateway_method_response" "http_status_value" {
  rest_api_id = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method = "${aws_api_gateway_method.my_api_method.http_method}"
  status_code = "200"

  response_models = {
    "application/json" = "Empty"
  }

  response_parameters = {
    "method.response.header.Access-Control-Allow-Origin" = true
  }
}

resource "aws_api_gateway_integration_response" "integration_response" {
  rest_api_id = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method = "${aws_api_gateway_method.my_api_method.http_method}"
  status_code = "${aws_api_gateway_method_response.http_status_value.status_code}"

  response_templates = {
    "application/json" = ""
  }

  response_parameters = {
    "method.response.header.Access-Control-Allow-Origin" = "'*'"
  }
}

### enable cors ###
resource "aws_api_gateway_method" "my_api_method_opt" {
  rest_api_id      = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id      = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method      = "OPTIONS"
  authorization    = "NONE"
  api_key_required = false
}

resource "aws_api_gateway_integration" "integration_request_opt" {
  depends_on = ["aws_api_gateway_method.my_api_method_opt"]
  rest_api_id             = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id             = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method             = "${aws_api_gateway_method.my_api_method_opt.http_method}"
  integration_http_method = "OPTIONS"
  type                    = "MOCK"
  request_templates = {
    "application/json" = "${file("./temp.txt")}"
  }
}

resource "aws_api_gateway_method_response" "method_response_opt_200" {
  rest_api_id = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method = "${aws_api_gateway_method.my_api_method_opt.http_method}"
  status_code = "200"

  response_models = {
    "application/json" = "Empty"
  }

  response_parameters = {
    "method.response.header.Access-Control-Allow-Headers" = true,
    "method.response.header.Access-Control-Allow-Methods" = true,
    "method.response.header.Access-Control-Allow-Origin"  = true
  }
  depends_on = ["aws_api_gateway_method.my_api_method_opt"]
}

resource "aws_api_gateway_integration_response" "integration_response_opt_200" {
  depends_on = ["aws_api_gateway_method.my_api_method_opt", "aws_api_gateway_method_response.method_response_opt_200"]
  rest_api_id       = "${aws_api_gateway_rest_api.my_api.id}"
  resource_id       = "${aws_api_gateway_resource.my_api_resource.id}"
  http_method       = "${aws_api_gateway_method.my_api_method_opt.http_method}"
  status_code       = "${aws_api_gateway_method_response.method_response_opt_200.status_code}"

  response_templates = {
    "application/json" = ""
  }

  response_parameters = {
    "method.response.header.Access-Control-Allow-Headers" = "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'",
    "method.response.header.Access-Control-Allow-Methods" = "'GET,OPTIONS'",
    "method.response.header.Access-Control-Allow-Origin"  = "'*'"
  }
}

resource "aws_api_gateway_deployment" "my_api_deploy" {
  depends_on  = ["aws_api_gateway_integration_response.integration_response","aws_api_gateway_integration.integration_request", "aws_api_gateway_integration.integration_request_opt","aws_api_gateway_integration_response.integration_response_opt_200"]
  rest_api_id = "${aws_api_gateway_rest_api.my_api.id}"
  stage_name  = "dev"
}

Я не знаю, имеет ли это решающее значение для этой проблемы, я использую ведро s3 и DynamoDB для сохранения состояния tfstate и блокировки состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...