AWS API Gateway

140 阅读14分钟

AWS API Gateway 是 Amazon Web Services 提供的一项完全托管的服务,用于创建、发布、维护、监控和保护 RESTful 和 WebSocket API。API Gateway 使开发人员能够轻松地创建和管理 API,以便客户端应用程序可以访问后端服务,如 AWS Lambda 函数、EC2 实例、DynamoDB 表和其他 HTTP 端点。

主要功能和特点

  1. 完全托管

    • API Gateway 是一个完全托管的服务,AWS 负责基础设施的管理和维护,开发人员只需关注 API 的设计和实现。
  2. 支持多种协议

    • API Gateway 支持 RESTful API 和 WebSocket API,适用于不同类型的应用程序和通信需求。
  3. 集成多种后端服务

    • API Gateway 可以与多种后端服务集成,包括 AWS Lambda、EC2、DynamoDB、S3 和其他 HTTP 端点。
  4. 身份验证和授权

    • API Gateway 提供多种身份验证和授权机制,包括 AWS IAM、Cognito 用户池、Lambda 授权器和 API 密钥。
  5. 流量管理

    • API Gateway 支持流量管理功能,如速率限制、流量控制和缓存,以确保 API 的高可用性和性能。
  6. 监控和日志记录

    • API Gateway 集成了 Amazon CloudWatch,可以监控 API 的使用情况和性能,并记录 API 请求和响应的日志。
  7. 版本控制和阶段管理

    • API Gateway 支持 API 的版本控制和阶段管理,允许开发人员在不同的阶段(如开发、测试、生产)中管理和部署 API。

使用场景

  1. 构建无服务器应用

    • 使用 API Gateway 和 AWS Lambda 构建无服务器应用,无需管理服务器,按需扩展,降低运维成本。
  2. API 网关

    • 使用 API Gateway 作为 API 网关,统一管理和保护多个后端服务的 API,提供身份验证、授权和流量控制。
  3. 实时通信

    • 使用 API Gateway 的 WebSocket 支持构建实时通信应用,如聊天应用、实时通知和协作工具。
  4. API 代理

    • 使用 API Gateway 作为 API 代理,将外部 API 暴露给客户端应用,并添加身份验证、授权和缓存等功能。

总结

AWS API Gateway 是一种完全托管的服务,用于创建、发布、维护、监控和保护 RESTful 和 WebSocket API。API Gateway 提供了多种功能和特点,包括支持多种协议、集成多种后端服务、身份验证和授权、流量管理、监控和日志记录、版本控制和阶段管理等。通过合理配置和使用 API Gateway,可以构建高可用、高性能和安全的 API,满足不同类型的应用需求。

成本

AWS API Gateway 的成本取决于多个因素,包括 API 请求数量、数据传输量、缓存使用情况和其他附加功能。总体来说,API Gateway 的成本是按使用量计费的,具体费用会根据你的使用情况而有所不同。以下是一些主要的成本因素和定价细节:

主要成本因素

  1. API 请求数量

    • API Gateway 按照处理的 API 请求数量收费。不同类型的 API(REST API、HTTP API、WebSocket API)的定价可能有所不同。
  2. 数据传输量

    • 数据传输量是指通过 API Gateway 传输的数据量。API Gateway 按照传输的数据量收费,通常以 GB 为单位。
  3. 缓存使用情况

    • 如果你启用了 API Gateway 缓存功能,会根据缓存的大小和使用时间收费。缓存可以提高 API 性能,但会增加成本。
  4. 附加功能

    • 使用某些附加功能(如自定义域名、API Gateway 访问日志、AWS WAF 集成等)可能会产生额外费用。

成本示例

以下是一些常见的成本示例(具体定价可能会有所变化,请参考 AWS 官方定价页面):

REST API 定价
  1. API 请求

    • 第一个 10 万次请求:每百万次请求 $3.50
    • 超过 10 万次请求:每百万次请求 $1.00
  2. 数据传输量

    • 数据传输到互联网:按标准 AWS 数据传输费率收费
    • 数据传输到 AWS 服务:免费
  3. 缓存

    • 缓存大小从 0.5 GB 到 237 GB,按小时收费。例如,1 GB 缓存每小时 $0.02
HTTP API 定价
  1. API 请求

    • 第一个 10 万次请求:每百万次请求 $1.00
    • 超过 10 万次请求:每百万次请求 $0.90
  2. 数据传输量

    • 数据传输到互联网:按标准 AWS 数据传输费率收费
    • 数据传输到 AWS 服务:免费
WebSocket API 定价
  1. API 请求

    • 每百万次消息 $1.00
  2. 连接时间

    • 每小时连接时间 $0.25

成本优化建议

  1. 使用 HTTP API

    • 如果你的应用不需要 REST API 的所有功能,可以考虑使用 HTTP API。HTTP API 的成本通常比 REST API 低。
  2. 启用缓存

    • 启用 API Gateway 缓存可以减少对后端服务的请求次数,提高性能,同时降低后端服务的成本。需要注意的是,缓存本身会产生额外费用。
  3. 优化请求和响应

    • 尽量减少不必要的请求和响应数据量,优化数据传输量。例如,使用压缩技术、减少响应数据的大小等。
  4. 监控和分析使用情况

    • 使用 Amazon CloudWatch 监控 API Gateway 的使用情况,分析请求模式和数据传输量,找出优化空间。
  5. 使用 AWS Free Tier

    • AWS Free Tier 提供了一定数量的免费 API 请求和数据传输量,可以用于测试和小规模应用。

总结

AWS API Gateway 的成本取决于多个因素,包括 API 请求数量、数据传输量、缓存使用情况和其他附加功能。总体来说,API Gateway 的成本是按使用量计费的,具体费用会根据你的使用情况而有所不同。通过合理配置和优化,可以有效控制成本,同时确保 API 的高可用性和性能。建议定期监控和分析使用情况,找出优化空间,以降低总体成本。

REST API 和 HTTP API

REST(Representational State Transfer)确实是一种架构风格或设计规范,用于构建基于 HTTP 的网络应用程序。RESTful API 是指遵循 REST 架构风格的 API,它们通过标准的 HTTP 方法(如 GET、POST、PUT、DELETE)进行通信。

在 AWS API Gateway 中,REST API 和 HTTP API 都是基于 HTTP 协议的,但它们在功能、性能和成本方面有所不同。AWS 将它们区分开来,以便提供不同的功能集和优化选项,满足不同的应用需求。

AWS API Gateway 中的 REST API 和 HTTP API

REST API
  1. 功能丰富

    • REST API 提供了更多的高级功能,如请求和响应转换、集成响应、模型验证、API 密钥、流量控制、缓存、AWS WAF 集成等。
  2. 灵活性

    • REST API 支持多种后端集成类型,包括 AWS Lambda、HTTP 端点、AWS 服务(如 DynamoDB、S3)和 VPC 链接。
  3. 成本较高

    • 由于提供了更多的功能,REST API 的成本通常比 HTTP API 高。
  4. 适用场景

    • 适用于需要高级功能和灵活集成选项的复杂应用程序。
HTTP API
  1. 轻量级

    • HTTP API 提供了核心的 API 网关功能,去掉了一些高级功能,以提高性能和降低成本。
  2. 性能优化

    • HTTP API 经过优化,具有更低的延迟和更高的吞吐量。
  3. 成本较低

    • 由于功能较少,HTTP API 的成本通常比 REST API 低。
  4. 适用场景

    • 适用于不需要高级功能的简单应用程序,或需要高性能和低成本的场景。

选择 REST API 和 HTTP API

在选择使用 REST API 还是 HTTP API 时,可以根据具体的需求和应用场景进行权衡:

  • 如果需要高级功能和灵活的集成选项(如请求和响应转换、模型验证、API 密钥、流量控制、缓存等),可以选择 REST API。
  • 如果需要高性能和低成本,且不需要高级功能,可以选择 HTTP API。

总结

REST 是一种架构风格,用于构建基于 HTTP 的网络应用程序。AWS API Gateway 提供了两种类型的 API:REST API 和 HTTP API。虽然它们都是基于 HTTP 协议的,但在功能、性能和成本方面有所不同。REST API 提供了更多的高级功能和灵活的集成选项,适用于复杂应用程序;HTTP API 提供了核心的 API 网关功能,具有更高的性能和更低的成本,适用于简单应用程序或需要高性能和低成本的场景。根据具体需求和应用场景,可以选择合适的 API 类型。

方案分析

Question

  1. AWS API Gateway + lambda
  2. AWS API Gateway + EC2
  3. SpringCloudGateway run on EC2 + lambda
  4. SpringCloudGateway run on EC2 + EC2

我有以上四种方式来做 WEB 服务端的部署,综合各种因素,包括成本因素,帮我分析下哪种方案更好。

Answer

在选择最佳的部署方案时,需要综合考虑多个因素,包括成本、性能、可扩展性、管理复杂性和开发效率。以下是对这四种方案的详细分析:

1. AWS API Gateway + Lambda

优点
  • 无服务器架构:无需管理服务器,AWS 负责自动扩展和维护。
  • 按需计费:按请求数量和执行时间计费,适合不稳定或间歇性的流量。
  • 高可用性和自动扩展:AWS Lambda 自动扩展以处理高并发请求,提供高可用性。
缺点
  • 冷启动延迟:首次调用或长时间未调用的 Lambda 函数可能会有冷启动延迟。
  • 执行时间限制:单次执行时间限制为 15 分钟,不适合长时间运行的任务。
  • 复杂性:对于复杂的应用逻辑,可能需要拆分成多个 Lambda 函数,增加管理复杂性。
成本
  • 按请求数量和执行时间计费:适合流量不稳定或间歇性的应用,成本较低。

2. AWS API Gateway + EC2

优点
  • 灵活性:可以运行任何类型的应用程序和服务,适合复杂的应用逻辑。
  • 持久性:适合需要长时间运行的任务,没有执行时间限制。
缺点
  • 管理复杂性:需要管理和维护 EC2 实例,包括操作系统、应用程序和安全补丁。
  • 扩展性:需要手动配置自动扩展组(Auto Scaling Group)来处理高并发请求。
成本
  • 按实例小时计费:即使没有请求,也需要支付实例运行费用,适合流量稳定的应用。

3. Spring Cloud Gateway run on EC2 + Lambda

优点
  • 灵活性:Spring Cloud Gateway 提供了丰富的路由和过滤功能,可以灵活地处理请求。
  • 无服务器后端:使用 Lambda 作为后端服务,按需扩展和计费。
缺点
  • 管理复杂性:需要管理和维护运行 Spring Cloud Gateway 的 EC2 实例。
  • 冷启动延迟:Lambda 函数可能会有冷启动延迟。
  • 双重管理:需要同时管理 EC2 实例和 Lambda 函数,增加管理复杂性。
成本
  • EC2 实例费用 + Lambda 请求和执行时间费用:需要支付 EC2 实例的运行费用和 Lambda 的按需费用。

4. Spring Cloud Gateway run on EC2 + EC2

优点
  • 灵活性:Spring Cloud Gateway 提供了丰富的路由和过滤功能,可以灵活地处理请求。
  • 持久性:后端服务运行在 EC2 实例上,没有执行时间限制。
缺点
  • 管理复杂性:需要管理和维护多个 EC2 实例,包括操作系统、应用程序和安全补丁。
  • 扩展性:需要手动配置自动扩展组来处理高并发请求。
成本
  • 按实例小时计费:需要支付运行 Spring Cloud Gateway 和后端服务的 EC2 实例费用。

综合分析

成本
  • 最低成本:AWS API Gateway + Lambda(按请求数量和执行时间计费,适合流量不稳定或间歇性的应用)
  • 较高成本:AWS API Gateway + EC2、Spring Cloud Gateway run on EC2 + Lambda、Spring Cloud Gateway run on EC2 + EC2(按实例小时计费,适合流量稳定的应用)
管理复杂性
  • 最低复杂性:AWS API Gateway + Lambda(无服务器架构,无需管理服务器)
  • 较高复杂性:AWS API Gateway + EC2、Spring Cloud Gateway run on EC2 + Lambda、Spring Cloud Gateway run on EC2 + EC2(需要管理和维护 EC2 实例)
可扩展性
  • 最高可扩展性:AWS API Gateway + Lambda(自动扩展以处理高并发请求)
  • 较高可扩展性:AWS API Gateway + EC2、Spring Cloud Gateway run on EC2 + Lambda、Spring Cloud Gateway run on EC2 + EC2(需要手动配置自动扩展组)
性能
  • 较高性能:AWS API Gateway + EC2、Spring Cloud Gateway run on EC2 + EC2(没有冷启动延迟)
  • 可能有冷启动延迟:AWS API Gateway + Lambda、Spring Cloud Gateway run on EC2 + Lambda

结论

  • 最佳选择:对于大多数应用,尤其是流量不稳定或间歇性的应用,AWS API Gateway + Lambda 是最佳选择。它提供了无服务器架构、按需计费、高可用性和自动扩展,管理复杂性最低,成本较低。
  • 替代选择:如果你的应用需要长时间运行的任务,或者你需要更高的性能和灵活性,可以考虑 AWS API Gateway + EC2 或 Spring Cloud Gateway run on EC2 + EC2。这两种方案提供了更高的灵活性和持久性,但管理复杂性和成本较高。
  • 折中选择Spring Cloud Gateway run on EC2 + Lambda 提供了灵活的路由和过滤功能,同时利用 Lambda 的无服务器优势,但管理复杂性较高,适合需要复杂路由逻辑的应用。

OAuth2 支持

AWS API Gateway 支持 OAuth 2.0 认证流程。你可以使用 Amazon Cognito 或自定义授权器来实现 OAuth 2.0 认证。以下是两种常见的方法:

方法 1:使用 Amazon Cognito 实现 OAuth 2.0

Amazon Cognito 是 AWS 提供的身份管理服务,支持 OAuth 2.0 认证流程。你可以使用 Cognito 用户池来管理用户身份,并将其与 API Gateway 集成。

步骤 1:创建 Cognito 用户池
  1. 登录到 AWS 管理控制台,打开 Amazon Cognito 控制台。
  2. 创建一个新的用户池,配置用户池的属性和策略。
  3. 在用户池中创建一个应用客户端,启用 OAuth 2.0 授权类型(如授权码、隐式、客户端凭证等)。
步骤 2:配置 API Gateway
  1. 登录到 AWS 管理控制台,打开 API Gateway 控制台。
  2. 创建一个新的 API 或选择现有的 API。
  3. 在 API 的方法请求中,配置授权类型为 "Cognito 用户池"。
  4. 选择你在步骤 1 中创建的 Cognito 用户池和应用客户端。
步骤 3:配置 OAuth 2.0 授权流程
  1. 在你的客户端应用中,使用 Cognito 提供的 OAuth 2.0 授权端点(如授权码端点、令牌端点)进行用户认证。
  2. 获取访问令牌(Access Token)后,将其包含在 API 请求的 Authorization 头中。

方法 2:使用自定义授权器实现 OAuth 2.0

如果你需要更灵活的认证逻辑,可以使用 API Gateway 的自定义授权器来实现 OAuth 2.0 认证。

步骤 1:创建 Lambda 授权器
  1. 创建一个 Lambda 函数,用于验证 OAuth 2.0 令牌。Lambda 函数应解析和验证令牌,并返回 IAM 策略。
import json
import jwt  # 使用 PyJWT 库解析 JWT 令牌

def lambda_handler(event, context):
    token = event['authorizationToken']
    try:
        # 验证和解析令牌
        decoded_token = jwt.decode(token, 'your-secret-key', algorithms=['HS256'])
        
        # 构建 IAM 策略
        policy = {
            "principalId": decoded_token['sub'],
            "policyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Action": "execute-api:Invoke",
                        "Effect": "Allow",
                        "Resource": event['methodArn']
                    }
                ]
            }
        }
        return policy
    except Exception as e:
        raise Exception('Unauthorized')
  1. 部署 Lambda 函数,并记下其 ARN。
步骤 2:配置 API Gateway
  1. 登录到 AWS 管理控制台,打开 API Gateway 控制台。
  2. 创建一个新的 API 或选择现有的 API。
  3. 在 API 的方法请求中,配置授权类型为 "Lambda 授权器"。
  4. 选择你在步骤 1 中创建的 Lambda 授权器。
步骤 3:配置 OAuth 2.0 授权流程
  1. 在你的客户端应用中,使用 OAuth 2.0 提供商的授权端点进行用户认证。
  2. 获取访问令牌(Access Token)后,将其包含在 API 请求的 Authorization 头中。

总结

AWS API Gateway 支持 OAuth 2.0 认证流程,可以使用 Amazon Cognito 或自定义授权器来实现。Amazon Cognito 提供了内置的 OAuth 2.0 支持,适合快速集成和标准化需求。自定义授权器提供了更大的灵活性,适合需要自定义认证逻辑的场景。通过合理配置和使用这些工具,可以实现安全、灵活的 API 认证和授权。