Я пытаюсь создать 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 и блокировки состояния.