实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API
实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API
引言 (Foreword/Motivation)
传统的 Web API 需要您管理服务器(虚拟机、物理机),包括操作系统维护、软件安装、资源扩展、负载均衡配置等。这带来了运维负担、成本开销(即使服务器空闲)、以及应对流量波动的挑战。
Serverless 架构的出现改变了这一模式。您无需管理服务器,只需关注代码逻辑。AWS Lambda 是 AWS 提供的无服务器计算服务,您可以在其中运行代码以响应各种事件(如 HTTP 请求、数据库变更、文件上传等),AWS 会自动为您管理底层的计算资源。Amazon API Gateway 是一项完全托管的服务,可帮助开发者轻松创建、发布、维护、监控和保护任意规模的 API。
将 Lambda 和 API Gateway 结合,是构建 Serverless API 的典型方案:API Gateway 作为 API 的入口点,负责接收 HTTP 请求,并将请求路由到后端的 Lambda 函数进行处理。这种模式具有以下优势:
- 无需管理服务器: 您只需上传代码,其他由 AWS 负责。
- 按需付费: 您只需为代码实际运行的时间付费,没有请求时不产生计算费用。
- 自动扩展: AWS 会根据请求量自动扩展 Lambda 函数的执行实例,无需手动配置负载均衡。
- 高可用: AWS 自动处理底层基础设施的冗余。
本指南将带您一步步通过 AWS 控制台创建一个简单的“Hello World” Serverless API。
环境准备 (Environment Setup)
- AWS 账户: 您需要一个活跃的 AWS 账户。如果您还没有账户,可以在 AWS 官网免费注册一个。
- AWS 管理控制台访问: 确保您能够登录到 AWS 管理控制台。
- 网络连接: 稳定的互联网连接。
- (可选)命令行工具:
curl
或其他 HTTP 客户端工具,用于测试 API。或者直接使用浏览器。
深入理解构建过程 (Deep Dive into Building Process)
我们将通过以下主要步骤,在 AWS 控制台中构建 Serverless API:
- 创建 Lambda 函数: 编写并上传您的后端代码。
- 配置 API Gateway 触发器: 将 API Gateway 作为事件源连接到 Lambda 函数,使其能够通过 HTTP 请求触发 Lambda。
- 部署 API Gateway: 将 API 发布到一个可访问的阶段。
完整代码实现 (Full Code Implementation)
我们将使用 Python 编写一个简单的 Lambda 函数。这个函数将接收 API Gateway 传递的 HTTP 请求事件,并返回一个 JSON 格式的响应。它还将演示如何读取请求中的查询参数。
# lambda_function.py
import json # 导入 json 库,用于处理 JSON 数据
# Lambda 函数的入口点 (handler)
# event 参数包含触发 Lambda 的事件的详细信息,对于 API Gateway,它包含了 HTTP 请求的所有信息
# context 参数包含有关调用、函数和执行环境的信息
def lambda_handler(event, context):
"""
AWS Lambda 函数的 handler。
处理来自 API Gateway 的 HTTP 请求。
"""
print("Received event: " + json.dumps(event, indent=2)) # 打印接收到的事件,方便调试
# 从事件对象中获取查询参数 (Query String Parameters)
# API Gateway 会将查询参数放在 event['queryStringParameters'] 中,这是一个字典
# 如果没有查询参数,'queryStringParameters' 可能为 None
name = "World" # 默认名字
# 检查 'queryStringParameters' 是否存在且非空
if event.get('queryStringParameters'):
# 从查询参数中尝试获取 'name' 的值
name_param = event['queryStringParameters'].get('name')
if name_param:
name = name_param # 如果获取到名字,更新默认值
# 构建响应体
# API Gateway 要求 Lambda 返回一个特定格式的字典
# 这个字典会被 API Gateway 转换为标准的 HTTP 响应
response_body = {
"message": f"Hello, {name}!" # 使用获取到的名字构建消息
# 可以添加其他数据到响应体
# "input": event # 示例:将整个事件也返回
}
# 构建最终响应字典
# 状态码 (statusCode): HTTP 状态码,如 200, 400, 500
# 头部 (headers): HTTP 响应头部,如 Content-Type
# 主体 (body): HTTP 响应主体,必须是一个字符串。如果是 JSON,需要先使用 json.dumps() 转换为字符串。
api_gateway_response = {
"statusCode": 200, # HTTP 状态码:200 OK
"headers": {
"Content-Type": "application/json" # 响应内容类型是 JSON
# 可以添加其他头部,如 CORS 头部
# "Access-Control-Allow-Origin": "*" # 允许跨域访问 (如果需要)
},
"body": json.dumps(response_body) # 将响应体字典转换为 JSON 字符串作为响应主体
}
# 返回响应字典给 API Gateway
return api_gateway_response
运行结果 (Execution Results)
在 AWS 控制台完成创建和部署后,您会得到一个可公开访问的 API 端点 URL。
- 通过浏览器访问 API 端点:
- 打开浏览器,输入您的 API 端点 URL,例如
https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello
。 - 期望结果:浏览器显示 JSON 格式的响应:
{"message": "Hello, World!"}
。
- 打开浏览器,输入您的 API 端点 URL,例如
- 通过浏览器访问带参数的 API 端点:
- 在 URL 后添加查询参数,例如
https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello?name=Serverless
。 - 期望结果:浏览器显示 JSON 格式的响应:
{"message": "Hello, Serverless!"}
。
- 在 URL 后添加查询参数,例如
- 通过
curl
命令访问 API 端点:
(请将curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello # 期望结果: {"message": "Hello, World!"} curl "https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello?name=Lambda" # 期望结果: {"message": "Hello, Lambda!"}
xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev
替换为您实际的 API 端点。)
测试步骤以及详细代码 (Testing Steps and Detailed Code)
主要使用 AWS 控制台和命令行工具进行测试。
-
在 Lambda 控制台测试函数:
- 步骤: 在 Lambda 函数页面,找到“测试”选项卡。可以配置一个测试事件来模拟 API Gateway 的请求。
- 代码 (模拟 API Gateway 事件的 JSON):
{ "httpMethod": "GET", "path": "/hello", "queryStringParameters": { "name": "TestFromLambdaConsole" }, "requestContext": { "accountId": "123456789012", "apiId": "xxxxxxxxxx", "stage": "test", "requestId": "test-request-id", "identity": {"sourceIp": "127.0.0.1"}, "httpMethod": "GET", "path": "/hello", "resourcePath": "/hello", "protocol": "HTTP/1.1", "requestTimeEpoch": 1587818000000 }, "body": null, "isBase64Encoded": false }
- 在 Lambda 测试页面配置一个新的测试事件,选择“API Gateway AWS Proxy”模板,将上面的 JSON 粘贴进去(可以修改
queryStringParameters
中的name
)。点击“保存”,然后点击“测试”。 - 验证: 观察执行结果区域。会显示函数执行日志和返回值。验证返回的
Response
字段(即 Lambda 函数返回的字典)是否符合预期,特别是statusCode
,headers
,body
。
-
在 API Gateway 控制台测试 API:
- 步骤: 在 API Gateway 控制台找到您的 API,导航到左侧的“资源”(Resources),选择您的
/hello
资源,然后选择GET
方法。在右侧的“方法执行”(Method Execution)区域,点击“测试”(Test)。 - 在测试页面,可以输入查询字符串参数(如
name=TestFromAPIGateway
)。点击“测试”。 - 验证: 观察执行结果区域。会显示请求的日志、Lambda 函数的日志输出、以及最终的响应(状态码、头部、响应体)。验证响应是否正确。
- 步骤: 在 API Gateway 控制台找到您的 API,导航到左侧的“资源”(Resources),选择您的
-
通过命令行或浏览器测试已部署的 API:
- 步骤: 使用上文“运行结果”中提供的
curl
命令或直接在浏览器中访问 API 端点 URL。 - 验证: 确认返回的状态码是 200,并且响应体中的 JSON 数据是正确的,特别是带参数时名字是否正确替换。
- 步骤: 使用上文“运行结果”中提供的
部署场景 (Deployment Scenarios)
Serverless API 是现代应用架构中越来越重要的组成部分,适用于多种部署场景:
- 移动应用后端: 为 iOS、Android 等移动应用提供弹性、低成本的后端 API。
- Web 应用后端: 为单页应用 (SPA) 或传统 Web 应用提供 API 接口(通常需要配置 CORS)。
- 微服务: 构建轻量级的微服务,每个服务负责一个特定的业务功能。
- Webhook 处理器: 接收来自第三方服务(如 GitHub, Stripe, Twilio)的 Webhook 请求。
- 物联网 (IoT) 后端: 处理来自 IoT 设备的数据或向设备发送控制命令。
- 内部 API: 为企业内部应用提供 API 服务。
- 简单工具或自动化任务: 构建简单的工具 API 或触发自动化任务。
如何进行部署(以 Console 为主):
- 创建 Lambda 函数: (已在上面“深入理解构建过程”的步骤 1 描述)
- 创建 API Gateway API 并关联 Lambda: (已在上面“深入理解构建过程”的步骤 2, 3 描述)
- 部署 API: 在 API Gateway 控制台,导航到您的 API 页面,选择“操作”(Actions)下拉菜单,点击“部署 API”(Deploy API)。选择一个部署阶段(Stage),例如新建一个
dev
阶段。点击“部署”。API Gateway 会生成一个该阶段的调用 URL。- 注意: 这个由 API Gateway 生成的 URL 默认使用 HTTPS,并且是公开可访问的。对于生产 API,通常需要配置身份验证/授权。
疑难解答 (Troubleshooting)
- API 访问返回 500 Internal Server Error:
- 问题: Lambda 函数执行时发生错误。
- 排查:
- 在 Lambda 控制台测试您的函数,查看执行结果区域的详细错误日志和堆栈跟踪。定位代码中的 Bug。
- 检查 CloudWatch Logs。Lambda 函数的
print()
或console.log
(Node.js) 输出会自动发送到 CloudWatch Logs。导航到 Lambda 函数页面 -> “监控”选项卡 -> “查看 CloudWatch Logs”。查找请求对应的日志流。 - 检查 Lambda 函数的配置(内存、超时时间),确保资源足够。
- API 访问返回 403 Forbidden:
- 问题: 访问 API 权限不足。
- 排查: 对于简单 Lambda 集成,通常是 API Gateway 调用 Lambda 函数的权限问题。在通过 API Gateway 控制台设置 Lambda 集成时,控制台会自动创建必要的权限(在 Lambda 函数的资源策略中添加 API Gateway 的调用权限)。如果手动配置或使用其他方式,需要检查 Lambda 函数的资源策略是否允许 API Gateway 服务主体 (
apigateway.amazonaws.com
) 从您的 API 调用您的函数。
- API 访问返回 404 Not Found:
- 问题: API Gateway 无法找到对应的资源或方法。
- 排查: 检查您访问的 URL 是否正确,包括 API ID、区域、阶段名称和资源路径(例如
/hello
)。确保在 API Gateway 控制台正确创建了/hello
资源和GET
方法。
- 查询参数 (
name
) 没有传递给 Lambda 或在 Lambda 中获取不到:- 问题: API Gateway 到 Lambda 的集成配置问题。
- 排查: 在 API Gateway 控制台的“方法执行” -> “集成请求”(Integration Request)中,检查请求映射(Mapping Templates)配置。对于“API Gateway AWS Proxy”集成,API Gateway 会自动将查询参数、头部、请求体等整个请求信息映射到 Lambda 的
event
对象中,通常无需手动配置映射。如果使用其他集成类型,或者代理配置有问题,可能需要手动配置映射。确认 Lambda 代码中是从event['queryStringParameters']
中正确获取参数。
- CORS 问题 (从浏览器前端访问 API):
- 问题: 从与 API 位于不同域名/端口的浏览器前端发起 AJAX 请求时,浏览器报跨域错误。
- 排查: 在 API Gateway 控制台,选择资源和方法,点击“操作” -> “启用 CORS”。API Gateway 会自动添加必要的 OPTIONS 方法和响应头。或者在 Lambda 函数的响应头中手动添加
Access-Control-Allow-Origin
等 CORS 头部。
未来展望 (Future Outlook)
- 更强大的 Lambda 功能: 支持更多运行时、更大的内存和更长的超时时间、更好的容器镜像支持。
- 更智能的 API Gateway: 更丰富的集成类型、内置数据验证、更高级的认证/授权选项(如 JWT Authorizers)、Websocket 支持(已经有)。
- 自动化部署工具增强: SAM CLI 和 AWS CDK 将持续简化 Serverless 应用的开发、测试和部署流程,实现 IaC (Infrastructure as Code)。
- Serverless 生态系统发展: 更多 AWS 服务与 Lambda 集成,出现更多第三方工具和框架。
- 边缘计算集成: Lambda@Edge 将计算能力推送到 CloudFront 边缘站点,进一步降低延迟。
技术趋势与挑战 (Technology Trends and Challenges)
技术趋势:
- Serverless 优先: 越来越多的应用开始优先考虑 Serverless 架构。
- 功能即服务 (FaaS): 函数成为基本的部署单元。
- 事件驱动架构: 应用通过事件而非传统的 API 调用进行交互。
- 云原生: 应用设计为在云环境中运行和扩展。
挑战:
- 冷启动 (Cold Start): Lambda 函数长时间不调用后首次调用会有一定的延迟。
- 供应商锁定: 对特定云服务商的 Serverless 服务依赖较强。
- 调试和监控: 调试分布式、事件驱动的 Serverless 应用比传统应用更复杂。
- 状态管理: Serverless 函数通常是无状态的,管理需要持久化或共享的状态需要借助外部服务(数据库、缓存)。
- 成本管理: 在大规模使用 Serverless 服务时,准确预测和管理成本。
- 本地开发和测试: 模拟 Serverless 环境和各种触发事件进行本地开发和测试。
总结 (Conclusion)
使用 AWS Lambda 和 API Gateway 构建您的第一个 Serverless API 是一个相对简单且强大的起点。您可以通过 AWS 管理控制台快速创建 Lambda 函数,编写 Python 代码来处理请求,然后通过 API Gateway 控制台轻松配置 API 入口并将其与 Lambda 函数集成。这种模式使您能够享受到无需管理服务器、按需付费和自动扩展带来的巨大优势。
通过本指南的实战演练,您应该已经掌握了构建基本 Serverless API 的核心流程。随着您对 Serverless 架构的深入了解,可以进一步探索自动化部署工具、更高级的 API Gateway 功能、与其他 AWS 服务的集成等,构建更复杂、更强大的 Serverless 应用。Serverless 是未来的重要趋势之一,掌握相关技术将为您的职业发展带来广阔前景。
- 点赞
- 收藏
- 关注作者
评论(0)