首页 > 解决方案 > 使用相同的 API ID 销毁并重新部署私有 AWS API Gateway 实例?还是另一种解决方案?

问题描述

我正在使用 Terraform 部署私有 API 网关实例,通常当我对 API 进行更改时,我需要实际销毁并重新部署它,以使更改通过并且不会在资源策略中看到一些错误。

(我使用 swagger 文件部署 API,出于某种原因,如果我将更改部署到现有 API,它会将资源策略清除为空字符串,无论我是否更改资源策略)。

问题是每次我实际销毁和重新部署时,API ID 都会更改,我需要更改每个使用此 ID 的应用程序的代码。我曾想过使用 Route53 端点放在 API 前面,以便应用程序可以访问端点而不是使用 ID,但这仅支持公共 API。

关于如何重新部署这些 API 而无需在消费者端更改 ID 的任何想法?

注意:一种想法是将 API ID 存储在 Vault 中,并让消费者在调用 API 之前调用 Vault 以获取 ID,但我宁愿在走这条路线之前先研究 AWS 包含的解决方案。

编辑:

作为测试,我运行了一个部署 Terraform 的管道,而对现有 API 没有任何更改。这是最终的计划:

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  [33m~[0m update in-place
[0m
Terraform will perform the following actions:

[33m  [33m~[0m [33mmodule.api_gateway.aws_api_gateway_rest_api.api_var_name
[0m      description: "API description" => ""
      name:        "api_name" => "api_name"
      policy:      "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:us-east-1:<REDACTED>:*\"},{\"Effect\":\"Deny\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:us-east-1:<REDACTED>:*\",\"Condition\":{\"StringNotEquals\":{\"aws:SourceVpce\":\"vpce-<REDACTED>\"}}}]}" => ""
[0m
[0m
[0m[1mPlan:[0m 0 to add, 1 to change, 0 to destroy.[0m

如您所见,Terraform 只进行了一项更改,那就是它从 API 中擦除了资源策略。当我对部署中与 API 无关的其他内容进行更改时,也会发生这种情况。

编辑2:

我的 API 模块的 Terraform 代码:

resource "aws_api_gateway_rest_api" "api_name" {
  name = "${var.api_gateway_name}${var.beta_id}"
  body = "${data.template_file.api_template.rendered}"

  endpoint_configuration {
    types = ["PRIVATE"]
  }
}

data "template_file" "api_template" {
  template = "${file("../source/apigateway-swagger.json")}"

  vars {
    session_init_arn = "${var.session_init_function_arn}"
    account_id       = "${var.account_id}"
    vpce_id          = "${var.vpce_id}"
    second_vpce_id   = "${var.second_vpce_id}"
    third_vpce_id    = "${var.third_vpce_id}"
    beta_id          = "${var.beta_id}"
  }
}

resource "aws_api_gateway_deployment" "api_name_deployment" {
  rest_api_id = "${aws_api_gateway_rest_api.api_name.id}"
  stage_name  = "v1"
}

招摇文件的政策部分:

  "x-amazon-apigateway-policy": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:us-east-1:${account_id}:*"
      },
      {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:us-east-1:${account_id}:*",
        "Condition": {
          "StringNotEquals": {
            "aws:SourceVpce": ["${vpce_id}", "${second_vpce_id}", "${third_vpce_id}"]
          }
        }
      }
    ]
  }

标签: amazon-web-servicesterraformaws-api-gateway

解决方案


推荐阅读