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

问题描述 投票:0回答:2

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

terraform aws-api-gateway openapi
2个回答
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")
}

在上面的示例中,我假设您已将 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”。


0
投票

请参阅:

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apigatewayv2_api#body-1

这里有一个有趣的模块,具有这样的功能可以开始使用。 :

https://github.com/terraform-aws-modules/terraform-aws-apigateway-v2

© www.soinside.com 2019 - 2024. All rights reserved.