通过 Terraform 部署基于 OpenAPI 的 API 网关?

Deploying an OpenAPI-based API gateway via Terraform?

我得到了一个 link 到 SwaggerHub 上托管的 OpenAPI 3.0.1 定义,并被告知部署它。在 Terraform 方面,我看到太多让我困惑的资源,我不确定该使用哪一个。通过已在 OpenAPI 定义中配置的 Terraform 部署 API 网关的最直接方法是什么?是否有资源可以简单地让我向 API 网关提供 OpenAPI 定义 URL,或者我是否必须将实际的 JSON 复制粘贴到某处?

AWS API 网关服务有两种主要使用模式:

  1. 直接将单个资源、方法、请求、集成和响应指定为 API 网关 API 中的单个对象。
  2. 提交整个 API 的 OpenAPI 定义作为一个单独的单元,并让 API 网关本身将其拆分为 API 中的所有单独对象网关的数据模型。

由于底层 API 支持这两种模型,因此最初很难看出哪些部分与每种使用模式相关。 AWS 的 Terraform 提供程序遵循底层 API 设计,因此那里也出现了混乱。

听起来你打算走我上面描述的第二条路,在这种情况下,Terraform 中的定义比较 直截了当,特别是它通常只涉及一个用于定义 API 本身的 Terraform 资源。 (您可能需要使用其他人来“部署”API,等等,但这似乎超出了您当前问题的范围。)

The api_gateway_rest_api resource type 是用于定义 API 网关 REST API 的根资源类型,对于 OpenAPI 方法是唯一需要定义整个API 表面,通过在其 body 参数中指定 OpenAPI 定义:

resource "aws_api_gateway_rest_api" "example" {
  name = "example"
  body = file("${path.module}/openapi.json")
}

在上面的示例中,我假设您已将 JSON 格式的 API 定义保存在与 [=14= 相同目录下的 openapi.json 文件中] 包含资源配置的文件。我不熟悉 SwaggerHub,但如果有一个 Terraform 提供程序可用于它,它有一个数据源可以直接从该系统检索定义,那么您可以将它们组合起来,但原理是一样的;只会改变 body 参数的确切表达式。

通过 API 网关 API 显式定义 resources/etc 的另一种方法将为每个 API 网关的单独对象类型提供单独的资源,描述 API,这使得 Terraform 配置更加复杂。但是,当您定义了 API 使用OpenAPI 规范。


注意:以上是关于 API Gateway REST APIs,它是独立于“API Gateway v2”的产品,后者提供所谓的“HTTP APIs”和“WebSocket APIs”。据我所知,API Gateway v2 不支持 OpenAPI 定义,因此我假设您询问的是原始 API Gateway,因此“REST APIs".