Amazon API Gateway 常见问题

一般性问题

Amazon API Gateway 是一种完全托管的服务,可以帮助开发人员轻松发布、维护、监控和保护任意规模的 API。只需在 AWS 管理控制台中单击几下,即可创建能够充当应用程序“前门”的 API,从后端服务访问数据、业务逻辑或功能,这些后端服务包括在 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Service (Amazon ECS) 或 AWS Elastic Beanstalk 上运行的应用程序和在 AWS Lambda 上运行的代码或任意 Web 应用程序。Amazon API Gateway 负责管理所有任务,涉及接受和处理成千上万个并发 API 调用,包括流量管理、授权和访问控制、监控以及 API 版本管理。Amazon API Gateway 没有最低费用,也没有启动成本。对于 HTTP API 和 REST API,您只需为收到的 API 调用以及传出的数据量付费。对于 WebSocket API,您只需针对发出和收到的消息及用户/设备连接到 WebSocket API 的时间付费。

答:Amazon API Gateway 为开发人员提供了一种简单灵活的完全托管服务,此服务按使用量计费,可以处理为应用程序后端创建并操作功能强大的 API 的各个方面事务。通过 API Gateway,您可以更快速地启动新服务并降低投资,从而专注于构建核心业务服务。API Gateway 专为帮助您处理创建和管理 API 的多个方面而构建:

1) 计量。API Gateway 可帮助您制定用于计量和限制第三方开发人员访问 API 的计划。您可以依据每个 API 密钥定义一组计划、配置限制和设定配额限制。API Gateway 自动计量流向 API 的流量并允许您提取每个 API 密匙的使用数据。

2) 安全性。API Gateway 可为您提供多种授权访问 API 和控制服务操作访问的工具。API Gateway 使您可以利用多种 AWS 管理和安全工具 (比如 AWS Identity and Access Management (IAM) 和 Amazon Cognito) 来授权访问您的 API。API Gateway 可以通过 AWS 用于其自身 API 的相同方法来代���您验证签名的 API 调用。借助以 AWS Lambda 函数形式编写的自定义授权命令,API Gateway 还可以帮助您验证传入不记名令牌,从而消除后端代码的授权问题。

3) 弹性。API Gateway 可帮助您通过限制来管理流量,从而让后端操作可以抵挡流量高峰。通过缓存 API 调用的输出来避免每次都调用后端,API Gateway 还可帮助您提升 API 性能,并缩短最终用户遇到的延迟。

4) 操作监控。在 API 发布并处于使用状态后,API Gateway 便会为您提供指标控制面板,监控对您服务的调用情况。API Gateway 控制面板通过与 Amazon CloudWatch 集成为您提供各种后端性能指标,涵盖 API 调用次数、延迟数据和错误率。您可以为 API 中每种方法启用详细指标,也可以在 CloudWatch 日志中接收错误日志、访问日志或调试日志。

5) 生命周期管理。在发布了 API 之后,您通常需要构建和测试增强现有功能或添加新功能的新版本。API Gateway 使您可以同时操作每个版本的多个 API 版本和多个阶段,以便在发布新 API 版本之后,现有应用可以继续调用先前的版本。

6) 专为开发人员设计。API Gateway 使您可以快速创建 API 并为其响应分配静态内容,以降低您的应用程序的跨团队开发工作和面市时间。依赖于您的 API 的团队可以在您构建后端进程的同时开始进行开发。

7) 实时双向通信。 构建实时双向通信应用程序,如聊天应用程序、流式处理控制面板和通知,无需运行或管理任何服务器。API Gateway 可以在互连用户之间维持永久连接,并支持互连用户之间的消息传输。

Amazon API Gateway 提供了用于创建 RESTful API、HTTP API 和 REST API 的两种方法,以及用于创建 WebSocket API 的一种方法。

HTTP API:HTTP API 针对以代理方式连接到 AWS Lambda 函数或 HTTP 后端的 API 进行了优化,这使得它们非常适用于无服务器工作负载。HTTP API 目前不提供 API 管理功能。

REST API:REST API 在单个解决方案中提供 API 代理功能和 API 管理功能。 REST API 可以提供 API 管理功能,例如使用计划、API 密钥、发布和出售 API。

WebSocket API:WebSocket API 可以在互连客户端之间维持永久连接,以便启用实时消息通信。利用 API Gateway 中的 WebSocket API,您可以定义与 AWS Lambda 函数、Amazon Kinesis 或从互连客户端接收消息时调用的任何 HTTP 终端节点的后端集成。

要开始使用 HTTP API,您可以使用 Amazon API Gateway 控制台、AWS CLI、AWS 开发工具包或 AWS CloudFormation。要了解有关如何开始使用 HTTP API 的更多信息,请参阅我们的文档

要开始使用 REST API,您可以使用 Amazon API Gateway 控制台、AWS CLI 或 AWS 开发工具包。要了解有关如何开始使用 HREST API 的更多信息,请参阅我们的文档

您可以使用 Amazon API Gateway 中的 HTTP API 和 REST API 来构建 RESTful API。

HTTP API 针对以代理方式连接到 AWS Lambda 函数或 HTTP 后端的 API 进行了优化,这使得它们非常适用于无服务器工作负载。相较于 REST API,HTTP API 费用更低、速度更快,但目前不支持 API 管理功能。REST API 适用于需要 API 代理功能和 API 管理功能的单个解决方案。

HTTP API 非常适用于:

  1. 针对 AWS Lambda 或任何 HTTP 终端节点构建代理 API
  2. 构建配有 OIDC 和 OAuth 2 授权的新式 API 
  3. 可能会大幅度增长的工作负载
  4. 延迟敏感型工作负载
 
REST API 非常适用于:
 
  1. 希望针对构建、管理和发布 API 所需的全部功能支付单一价格的客户 

HTTP API 具有以下标准功能:支持 CORS、支持 OIDC 和 OAuth2 验证和授权以及各阶段自动部署。

可以。您可以使用 OpenAPI 3 来导入 API 定义。然后可以创建路由、集成和 API 模型。有关导入 OpenAPI 定义的更多信息,请参阅我们的文档

要从当前 REST API 迁移到 Amazon API Gateway 中的 HTTP API,请执行以下操作:

  1. 检查 HTTP API 是否具备您需要的所有功能。要查看完整功能列表,请参阅我们的文档。 
  2. 打开您的 REST API,从 REST API 中导出 OpenAPI 定义
  3. 打开您的 HTTP API,导入上一步导出的 OpenAPI 定义
  4. 测试 API 功能是否正常
  5. 用新的 URL 更新您的客户端

虽然 API 可以正常使用,但可能缺少一些功能。要确定缺少哪些功能,请查看“导入”操作部分的信息警告错误字段。有关从 REST API 迁移到 HTTP API 的更多信息,请参阅我们的文档

首先,打开您的 REST API,从 REST API 中导出 OpenAPI 定义。然后,打开您的 HTTP API,导入上一步导出的 OpenAPI 定义。虽然 API 可以正常使用,但可能缺少一些功能。要确定缺少哪些功能,请查看“导入”操作部分的信息警告错误字段。AWS CLI 将返回有关您的 API 的信息,并且该信息将显示在“信息”和“警告”字段中。有关更多信息,请阅读我们的文档

要开始使用,您可以使用 AWS 管理控制台、AWS CLI 或 AWS 软件开发工具包创建 WebSocket API。然后,您可以设置 WebSocket 路由,以指明后端服务,如 AWS Lambda、Amazon Kinesis 或基于消息内容调用的 HTTP 终端节点。请参阅文档以了解如何开始在 API Gateway 中使用 WebSocket API。

答:可以,通过 Amazon API Gateway 创建的所有 API 都只公开 HTTPS 终端节点。Amazon API Gateway 不支持未加密的 (HTTP) 终端节点。默认情况下,Amazon API Gateway 将内部域分配给自动使用 Amazon API Gateway 证书的 API。如果您将 API 配置为以自定义域名运行,则可以为域提供您自己的证书。

基于 Amazon API Gateway 构建的 API 可以接受通过 HTTPS 为 HTTP API、REST API 和 WebSocket API 发送的任何负载。典型数据格式包括 JSON、XML、查询字符串参数和请求标头。您可以针对 API 响应声明任何内容类型,然后使用转换模板将后端响应更改为您需要的格式。

Amazon API Gateway 可在您的账户中执行 AWS Lambda 函数,启动 AWS Step Functions 状态机,调用托管于 AWS Elastic Beanstalk 和 Amazon EC2 上的 HTTP 终端节点以及调用可通过公共 Internet 访问的基于 HTTP 的非 AWS 托管操作。API Gateway 还可让您指定映射模板以生成要返回的静态内容,帮助您在后端就绪前模拟 API。您还可以将 API Gateway 与其他 AWS 服务直接集成 – 例如,您可以在 API Gateway 中公开一种可直接向 Amazon Kinesis 发送数据的 API 方法。

API Gateway 通过 Android 和 iOS(Swift 和 Objective-C)为移动应用程序开发生成自定义 SDK,并通过 JavaScript 为 Web 应用开发生成自定义 SDK。API Gateway 还支持为 Ruby 和 Java 生成 SDK。在 API Gateway 中定义了 API 及其模型后,您便可使用 AWS 控制台或 API Gateway API 来生成和下载客户端 SDK。仅会生成 Amazon API Gateway 中的 REST API 的客户端软件开发工具包。

要了解哪些 AWS 区域提供 HTTP API、REST API 和 WebSocket API,请单击此处查看 AWS 区域表。

通过 Amazon API Gateway 控制台,您可以定义 REST API 及其关联的资源和方法,管理 API 生命周期,生成客户端 SDK 以及查看 API 指标。您还可以使用 API Gateway 控制台定义 API 使用计划、管理开发人员的 API 密匙以及配置限制和配额限制。所有相同操作均通过 API Gateway API 提供。

资源是一种类型化对象,属于您的 API 的域。每个资源可能都关联了一个数据模型,或与其他资源相关,并且可以响应不同的方法。您也可以将资源定义为变量来拦截对多个子资源的请求。

REST API 中的每种资源可以支持一个或多个标准 HTTP 方法。您将定义应每种资源应支持的动词(GET、POST、PUT、PATCH、DELETE、HEAD 和 OPTIONS)及其实施方法。例如,car 资源的 GET 操作应返回汽车列表。要将资源内的所有方法连接到单个后端终端节点,API Gateway 还支持一种特殊的“ANY”方法。

使用计划可帮助您声明针对第三方开发人员的计划,即将访问限制到特定 API、定义限制以及请求配额限制,并将这些限制与 API 密钥关联。您还可以基于每个 API 密匙提取使用数据,以分析 API 使用情况并生成账单单据。例如,您可以创建一个基础级、专业级和企业级的计划 – 您可以将基础使用计划配置为:每天仅允许 1000 次请求,而且每秒请求次数 (RPS) 最多为 5 次。

答:借助 Amazon API Gateway,每个 REST API 都可以有多个阶段。阶段用于划分 API 的开发生命周期,例如,在您构建了 API 并将其部署到开发阶段后,或者当您准备好进行生产时,您可以将其部署到生产阶段。

阶段变量可定义与某个阶段相关的配置值的密钥/值对。这些值与环境变量相似,可用于配置您的 API。例如,您可以将用于方法集成的 HTTP 终端节点定义为阶段变量,并在配置 API 时使用该变量,而不是对终端节点进行硬编码,这样一来,您就可以通过相同的 API 配置将不同终端节点用于每个阶段(如开发、测试或生产阶段)。阶段变量也可通过映射模板进行访问,可用于将配置变量传递至您的 Lambda 或 HTTP 后端。

资源策略是一种 JSON 策略文档,您可以将其附加到某个 API 来控制指定的主体(通常是 IAM 用户或角色)是否可以调用该 API。您可以使用资源策略让来自其他 AWS 账户的用户安全访问您的 API,或者只允许从指定的源 IP 地址范围或 CIDR 块调用该 API。资源策略可以与 Amazon API Gateway 中的 REST API 配合使用。

符合。您可以使用我们的开源 Swagger 导入程序工具将自己的 Swagger API 定义导入到 Amazon API Gateway。利用 Swagger 导入程序工具,您可以创建和部署新的 API,并能更新现有 API。

借助 API Gateway,您可以创建、更新和删除与 API 的每个部分关联的文档,例如方法和资源。您可以通过 AWS SDK、CLI、RESTful 调用来访问与文档关联的 API,或者通过在 API Gateway 控制台中直接编辑文档字符串来实现目标。文档还可以 Swagger 文件格式导入为 API 的一部分或单独存在,让您在不干扰 API 定义的情况下添加或更新文档。对于以 Swagger 文件格式导入或导出的文档,API Gateway 符合 Open API 规范。API Gateway 中的 REST API 支持文档。

能,您可以向 API 应用资源策略,以限制对特定 Amazon VPC 或 VPC 终端节点的访问。您还可以使用资源政策从其他账户向私有 API 提供对 Amazon VPC 或 VPC 终端节点的访问权限。

安全性和授权

借助 Amazon API Gateway,您可以选择设置 API 的方法,以便要求授权。当设置需要授权的方法时,您可以利用 AWS 签名版本 4 或 Lambda 授权命令来支持您自己的不记名令牌身份验证策略。

像使用其他 AWS 服务一样,您也可以使用 AWS 凭证 (访问密钥和私有密钥) 签署对您服务的请求,并授予访问权限。Amazon API Gateway API 请求的签署由针对您的服务生成的自定义 API Gateway SDK 进行管理。您可以使用 Amazon Cognito 来检索与您的 AWS 账户中的某个角色相关联的临时凭证。

Lambda 授权命令是 AWS Lambda 函数。借助自定义请求授权命令,您将能够使用诸如 OAuth 之类的不记名令牌身份验证策略,授予对 API 的访问权限。调用 API 后,API Gateway 会检查是否配置了 Lambda 授权命令,然后针对传入授权令牌调用 Lambda 函数。您可以使用 Lambda 实施各种授权策略(如 JWT 验证、OAuth 提供商标注),这些授权策略可返回用于授权请求的 IAM 策略。如果授权命令返回的策略有效,API Gateway 将会缓存与传入令牌关联的策略,缓存时长为 1 小时。

符合。API Gateway 可生成 API 密匙并将其与使用计划相关联。从每个 API 密钥收到的调用会受到监控,并被添加到您可以为每个阶段启用的 Amazon CloudWatch Logs 中。不过,我们建议您不要使用 API 密钥进行授权。您应使用 API 密钥来监控第三方开发人员的使用情况,并利用更强大的机制(如签名 API 调用或 OAuth)进行授权。

API Gateway 支持对您的 API 中的每种方法或路由进行限制设置。您可以为 REST API 中的每个方法和 WebSocket API 中的每种路由设置每秒的标准速率限制和突发速率限制。此外,API Gateway 自动保护您的后端系统免受分布式拒绝服务 (DDoS) 攻击,无论攻击者是通过伪造请求(第 7 层)还是通过 SYN 洪流(第 3 层)。

符合。Amazon API Gateway 可以生成一个客户端 SSL 证书并将该证书的公钥提供给您。对您的后端的调用可以用生成的证书进行,您可以使用该证书的公钥来验证源自 Amazon API Gateway 的调用。

符合。Amazon API Gateway 与 AWS CloudTrail 集成,为您提供对 REST API 更改的完整可审计历史记录。为了创建、修改、删除或部署 REST API 而对 Amazon API Gateway API 进行的所有 API 调用都会记录到您 AWS 账户的 CloudTrail 中。

在 Amazon API Gateway 中,您可以通过使用 VPC 链接设置私有集成,对在 Amazon VPC 中运行的后端 HTTP/HTTPS 资源进行代理请求。Amazon API Gateway 中的客户端 SSL 证书可以用来验证对后端系统的请求是否是由 API Gateway 使用该证书的公有密钥发送的。您也可以在 Amazon API Gateway 中创建私有 API,这些 API 只能由 Amazon VPC 中的资源通过 Amazon VPC 终端节点访问。

能,您可以向 API 应用资源策略,以限制对特定 Amazon VPC 或 VPC 终端节点的访问。您还可以使用资源政策从其他账户向私有 API 提供对 Amazon VPC 或 VPC 终端节点的访问权限。

如果您使用 REST API,则可以在账户中设置一个具有自定义 SSL 证书的 CloudFront 分配,并在 API Gateway 中使用区域 API。然后,您可以根据您的安全性和合规性要求,为具有 TLS 1.1 或更高版本的 CloudFront 分配配置安全策略

管理、指标和记录

答:Amazon API Gateway 将 API 调用次数、延迟和错误率记录到您 AWS 账户的 Amazon CloudWatch 中。您还可以通过 Amazon API Gateway 控制台中的 REST API 控制面板来查看这些指标。API Gateway 还会按第三方开发人员计量使用情况,在 API Gatreway 控制台中通过 API 提供这些使用数据。

答:默认情况下,Amazon API Gateway 在 REST API 一级监控流量。您可以视需要使用部署配置 API 或控制台屏幕为 REST API 中的每种方法启用详细指标。详细指标还会记录到 Amazon CloudWatch 中,并按 CloudWatch 费率计费。

符合。指标详细信息是按 REST API 和阶段进行指定。此外,您还可以为 REST API 中的每种方法启用指标。

答:日志、警报、错误率和其他指标均存储在 Amazon CloudWatch 中,并且几乎是实时提供。

限制和缓存

答:Amazon API Gateway 提供了多个级别(包括全局)的限制,并按服务调用提供。您可以设置标准速率和突发速率限制。例如,API 所有者可以为其 REST API 中的特定方法设置每秒 1000 条请求的速率限制,并能将 Amazon API Gateway 配置为在几秒内处理每秒 2000 条请求的突发速率。Amazon API Gateway 跟踪每秒请求数量。超过限制的任何请求都会收到 429 HTTP 响应。 Amazon API Gateway 生成的客户端 开发工具包(除 Javascript 以外)会在收到此响应时自动重试调用。

符合。借助使用计划,您可以针对各个 API 密匙设置限制。

限制可确保 API 流量得到控制,以帮助您的后端服务保持性能和可用形。

答:可以在方法一级设置限制速率。您可以通过 Amazon API Gateway API 或者在 Amazon API Gateway 控制台中,编辑方法设置中的限制。

API Gateway 限制相关设置按以下顺序应用:1) 在使用计划中为 API 阶段设置的每个客户端每个方法的限制,2) 在使用计划中设置的每个客户端的限制,3) 默认的每个方法的限制以及在 API 阶段设置中设置的每个方法的各个限制;4) 每个区域的账户级别限制。

符合。您可以通过预配置 API Gateway 缓存并指定其大小(以 GB 为单位)向 API 调用中添加缓存。缓存是针对 API 的特定阶段进行预配置。这会提升性能并减少发送到后端的流量。借助缓存设置,您可以控制如何构建缓存密钥,以及为每种方法存储的数据的生存时间 (TTL)。API Gateway 还展示了管理 API,可帮助您将每个阶段的缓存失效。API Gateway 中的 REST API 可提供缓存。

如果未启用缓存并且没有应用限制,则所有请求都将传递到后端服务,直到达到所设置的账户级别限制。如果实施了限制,则 Amazon API Gateway 会削减必要的请求数量,并且仅将定义的限制发送到后端服务。如果配置了缓存,则 Amazon API Gateway 将针对可自定义的时间内的重复请求返回缓存响应,但这仅限于未达到已配置限制的情况。后端与客户端之间的这种平衡可确保支持的应用程序的 API 性能最佳。限制的请求会自动由 Amazon API Gateway 生成的客户端 SDK 重试。默认情况下,Amazon API Gateway 没有针对 API 方法设置任何缓存。

Amazon API Gateway 充当您已配置的后端操作的代理。Amazon API Gateway 会自动扩展,以处理您的 API 收到的流量。Amazon API Gateway 不会任意限制对您的后端操作的调用,并且 Amazon API Gateway 控制台中的限制和缓存设置未拦截的所有请求都会发送到您的后端操作。

计费

Amazon API Gateway 按照每一百万 API 调用收费,还包括传出数据的价格(以 GB 为单位)。如果您选择为您的 API 预置缓存,则适用小时费率。对于 WebSocket API,API Gateway 根据所发送和接收的消息及客户端连接到 API 的分钟数计费。有关每个区域 API 调用、数据传输和缓存价格的详细信息,请参阅 API Gateway 定价页面

API 所有者需要为 API Gateway 上其所属的 API 调用付费。

符合。无论响应是由您的后端操作处理,还是由 Amazon API Gateway 缓存操作处理,API 调用的账单计算方式都���同。

WebSocket API

利用 Amazon API Gateway,您可以使用 IAM 角色和策略或 AWS Lambda 授权命令来授权访问您的 WebSocket API。

您可以对连接使用回调 URL GET 方法,以确定客户端是否与 WebSocket 连接。请参阅有关使用回调 URL 的文档。

您将根据 2 个指标付费:连接分钟数和消息。

连接分钟数:客户端或设备连接到 WebSocket 的总分钟数(四舍五入到一分钟)。

消息:发送到互连客户端或从互连客户端接收的消息总数。以 32KB 的增量对消息计费。请参阅定价页面了解 WebSocket API 定价和示例的详细信息。

否,如果通过 WebSocket 连接的消息未通过身份验证或授权,它们将不会计入您的 API 使用账单。