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

TFa*_*aws 2 terraform aws-api-gateway openapi

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

Mar*_*ins 7

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

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

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

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

资源api_gateway_rest_api类型是用于定义 API Gateway REST API 的根资源类型,对于 OpenAPI 方法来说,它是定义整个 API 表面所需的唯一一种资源类型,方法是在其body参数中指定 OpenAPI 定义:

resource "aws_api_gateway_rest_api" "example" {
  name = "example"
  body = file("${path.module}/openapi.json")
}
Run Code Online (Sandbox Code Playgroud)

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

另一种通过 API Gateway API 显式定义资源等的方法将为描述 API 的每个 API Gateway 的单独对象类型提供单独的资源,这使得 Terraform 配置更加复杂。但是,当您使用 OpenAPI 规范定义 API 时,不需要使用这些(实际上,为了避免冲突,也不应该使用这些)。


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