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

标签 terraform aws-api-gateway openapi

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

最佳答案

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

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

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

听起来您打算采用我上面描述的第二条路径,在这种情况下,Terraform 中的定义比较简单明了,特别是它通常只涉及一个 Terraform 资源来定义API本身。 (您可能需要使用其他人来“部署” 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")
}

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

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


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

关于terraform - 通过 Terraform 部署基于 OpenAPI 的 API 网关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70789390/

相关文章:

Python Klein + OAS (Open API) Swagger 类集成

java - 如何从 OpenAPI 3.0 yaml 文件生成 JSON 示例?

typescript - 从 typescript 接口(interface)生成 swagger 文档

amazon-web-services - 获取无服务器框架在我的 serverless.yml 文件中创建的 API 网关资源的 ARN

amazon-web-services - AWS API Gateway 将 JSON 存储到 DynamoDB

node.js - 即使将 ttl 设置为零后,AWS APIGateway lambda 授权者缓存策略也是如此

amazon-ec2 - 我可以在 terraform 创建的 ec2 实例中执行 ssh 吗?

google-cloud-platform - 如何连接 Terraform 以创建从 GCP 中的私有(private) bitbucket Repo 中提取的 Cloud Build Triggers

azure - 使用 Terraform 增加 AKS 的 default_node_pool 中的 max_pod 数量时,必须重新创建集群本身

variables - 如何使用 terraform 创建文件并将变量包含为文字?