我获得了 SwaggerHub 上托管的 OpenAPI 3.0.1 定义的链接,并被告知要部署它。在 Terraform 方面,我看到太多让我困惑的资源,我不确定该使用哪一个。通过 Terraform 部署已在 OpenAPI 定义中配置的 API 网关的最直接方法是什么?是否有资源可以让我向 API 网关提供 OpenAPI 定义 URL,或者我必须将实际的 JSON 复制粘贴到某处?
AWS 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")
}
在上面的示例中,我假设您已将 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”。