对于我们开发者而言,最核心的价值在于创造业务逻辑,实现功能需求。但很多时候,我们不得不将宝贵的精力耗费在繁琐的服务器运维上:配置、部署、打补丁、监控、扩容……仅仅为了运行一个简单的后端 API,就可能需要面对一整套复杂的服务器管理流程。每当深夜收到服务器宕机的告警,或是因为流量突增而手忙脚乱地进行扩容时,你是否也曾想过:有没有一种方式,能让我们只关心代码,而将其他的一切都交给专业的人来处理?
答案是肯定的。这就是“无服务器计算”(Serverless)架构带来的革命。它并非真的没有服务器,而是将服务器的运维管理工作完全从开发者的视野中抽离出去。在亚马逊云科技的生态中,这一理念的核心实践者便是亚马逊云 Lambda 和亚马逊云 API Gateway。
可以将 Amazon Lambda 想象成一个“代码执行器”,只需上传你的业务逻辑代码(例如,一段 Python 函数),它便能按需运行,并根据请求量自动伸缩,无需为它预留任何计算资源 。而 API Gateway 则扮演着“前台大门”的角色,它负责接收来自互联网的 HTTP 请求,并安全、可靠地将这些请求转发给后端的 Amazon Lambda 函数进行处理 。
这种组合的魅力在于,它彻底改变了开发和部署的范式。开发者的工作被简化为最纯粹的部分:编写实现业务价值的代码。基础设施的可用性、伸缩性和安全性,都由亚马逊云科技在底层保障。这不仅仅是“没有服务器”那么简单,它更是一种开发理念的根本性转变——从“管理基础设施”到“实现业务逻辑”的转变。这种转变能够极大地缩短开发周期,降低运维成本,让我们能将更多时间投入到真正为用户创造价值的功能创新上。
接下来一步步动手,利用 Amazon Lambda 和 Amazon API Gateway,从零开始构建一个高可用、自动扩缩容的 REST API。
亚马逊云科技新用户可以免费使用亚马逊云科技免费套餐(Amazon Free Tier)。注册即可获得 100 美元的服务抵扣金,在探索关键亚马逊云科技服务时可以再额外获得最多 100 美元的服务抵扣金。使用免费计划试用亚马逊云科技服务,最长可达 6 个月,无需支付任何费用,除非您选择付费计划。付费计划允许您扩展运营并获得超过 150 项亚马逊云科技服务的访问权限。
准备工作:亚马逊云科技“工具箱” 🧰
在开始之前,请确保你已经准备好了以下工具和环境:
- 一个有效的亚马逊云科技账户:如果你还没有,可以轻松注册一个。这次分享中涉及的所有服务和用量,均在亚马逊云科技的服务覆盖范围之内,这意味着你可以快速完成整个实验 。
- Python 3 基础:我们将使用 Python 作为Amazon Lambda 函数的编程语言,你需要对 Python 的基本语法有所了解 。
- AWS CLI:虽然这次主要通过亚马逊云管理控制台进行操作,但安装和配置命令行工具(CLI)是专业开发实践中的推荐做法,它能帮助你未来实现部署自动化 。
第一步:创建 Lambda 函数 - API 的“大脑”🧠
Amazon Lambda 函数是我们 API 的核心处理单元,它包含了所有的业务逻辑。让我们先来创建它。
A. 创建执行角色 (IAM Role)
首先,我们需要为Amazon Lambda 函数创建一个“身份”,并赋予它必要的“权限”。在亚马逊云中,这通过 IAM (Identity and Access Management) 角色来实现。这就像是给你的函数颁发一张工作证,上面写明了它被允许做什么。
为什么需要这一步?这是亚马逊云安全最佳实践的核心——最小权限原则。我们的函数至少需要将运行日志写入到亚马逊云 CloudWatch Logs 的权限,这样在出现问题时,我们才能方便地进行调试。
- 登录亚马逊云管理控制台,导航到 IAM 服务。
- 在左侧导航栏中选择 角色,然后点击 创建角色。
- 在“选择可信实体”页面,选择 亚马逊****云服务,然后在“使用案例”中选择 Amazon Lambda。点击 下一步。
- 在“添加权限”页面,搜索并勾选名为
AWSLambdaBasicExecutionRole
的策略。这个策略包含了将日志写入 CloudWatch Logs 的基本权限。点击 下一步。 - 为你的角色命名,例如
my-lambda-api-role
,并添加一个简单的描述。确认无误后,点击 创建角色。
现在,我们的 Amazon Lambda 函数就有了一个具备基本工作权限的“身份证”。
B. 创建 Amazon Lambda 函数
接下来,我们正式创建 Amazon Lambda 函数本身。
- 在亚马逊云管理控制台,导航到 Amazon Lambda 服务。
- 点击 创建函数。
- 选择 从头开始创作 。
- 在“基本信息”部分,进行如下配置:
- 函数名称:输入一个描述性的名称,如
myApiHandler
。 - 运行时:选择一个较新的 Python 版本,例如
Python 3.11
或更高版本 。 - 架构:保持默认的
x86_64
。 - 权限:展开“更改默认执行角色”,选择 使用现有角色,然后在下拉列表中找到并选择我们刚刚创建的
my-lambda-api-role
。
- 函数名称:输入一个描述性的名称,如
- 点击 创建函数。
稍等片刻,你的Amazon Lambda 函数就创建好了。你将被带到函数的配置页面。
C. 编写处理程序代码 (Handler Code)
现在,让我们为这个“大脑”注入真正的逻辑。在函数配置页面的“代码源”编辑器中,你会看到一个默认的 lambda_function.py
文件。
将其中的内容替换为以下代码:
import json
def lambda_handler(event, context):
"""
这个函数处理来自 API Gateway 的请求。
它会从查询字符串参数中获取'name',并返回一个个性化的问候。
"""
print("收到的 event 对象:", event) # 打印事件对象,方便调试
# 从查询字符串参数中解析 'name',如果不存在则默认为 'World'
# API Gateway 代理集成会将查询参数放在 'queryStringParameters' 字段中
name = "World"
if event.get("queryStringParameters") and event.get("name"):
name = event["name"]
# 构建返回给 API Gateway 的响应体
response_body = {
"message": f"Hello, {name}!",
"input_event": event # 将收到的事件也一并返回,方便理解结构
}
# 这是 API Gateway 代理集成所要求的标准返回格式
# 必须包含 statusCode, headers, 和 body
response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*" # 允许跨域访问
},
"body": json.dumps(response_body)
}
return response
写完代码后,点击右上角的 Deploy 按钮来保存和部署你的更改。
让我们来解读一下这段代码的关键部分:
lambda_handler(event, context)
:这是 Lambda 函数的入口点。亚马逊云 Amazon Lambda 会调用这个函数来处理请求 。event
:这是一个字典对象,包含了所有触发该函数的事件信息。当由 Amazon API Gateway 触发时,它里面就封装了完整的 HTTP 请求信息,包括路径、请求头、请求体以及我们用到的查询字符串参数queryStringParameters
。context
:这个对象提供了关于调用、函数和执行环境的运行时信息,例如函数名、内存限制等。在本例中我们没有用到它。
- 响应格式:这是本节最需要注意的地方。当我们使用 Amazon API Gateway 的“Lambda 代理集成”模式时,Amazon Lambda 函数的返回值必须遵循一个特定的 JSON 结构 。它必须包含
statusCode
(HTTP 状态码)、headers
(HTTP 响应头) 和一个body
(字符串形式的响应内容)。忘记这个格式是初学者最常犯的错误之一。我们使用json.dumps()
将 Python 字典序列化为 JSON 字符串,以满足body
的要求。
这段代码的逻辑非常简单,但它完美地展示了Amazon Lambda 作为 API 后端的运作模式。更重要的是,通过理解 event
对象的结构,你就掌握了 Amazon Lambda 与其他亚马逊云服务集成的核心模式。无论是 S3 对象上传事件,还是 SNS 消息通知,它们都会被打包成一个类似的 event
字典传递给 Amazon Lambda 函数。因此,你今天学到的这个技能,其价值远远超出了构建一个简单的 API。
第二步:配置 Amazon API Gateway - 连接世界的“大门”🚪
我们的 Amazon Lambda 函数已经准备就绪,但它目前还只是一个孤立的代码片段。我们需要通过 Amazon API Gateway 为它创建一个公开的、可访问的 HTTP 端点。
A. 创建 REST API
- 在亚马逊云管理控制台,导航到 Amazon API Gateway 服务。
- 在主面板上,找到 REST API 卡片(不是 REST API Private),点击 构建 。
- 在“创建新 API”页面,保持默认的 REST 协议和 新建 API 选项。
- 在“设置”中,为你的 API 命名,例如
myGreetingApi
,并可选择性地添加描述。 - 将“终端节点类型”保持为 区域。
- 点击 创建 API。
B. 定义资源和方法 (Resources & Methods)
在 RESTful 的世界里,API 由“资源”和对资源操作的“方法”组成 。例如,
/users
是一个资源,而 GET /users
就是获取用户列表的方法。
让我们为我们的 API 创建一个资源和方法。
- 在 API 的“资源”页面,确保选中了根资源
/
。 - 点击 操作 下拉菜单,选择 创建资源。
- 在“资源名称”中输入
greet
。“资源路径”会自动填充为/greet
。 - 点击 创建资源。
- 现在,新创建的
/greet
资源被选中了。再次点击 操作 下拉菜单,选择 创建方法。 - 在
/greet
下方出现的小下拉框中,选择 GET,然后点击旁边的对勾确认 。
C. 设置 Lambda 代理集成 (Lambda Proxy Integration)
这是连接 Amazon API Gateway 和 Amazon Lambda 函数的关键一步。
- 在
GET
方法的设置页面,进行如下配置:- 集成类型:选择 Lambda 函数。
- 勾选 使用 Lambda 代理集成 复选框。
- Lambda 区域:保持当前区域。
- Lambda 函数:开始输入你之前创建的 Amazon Lambda 函数名
myApiHandler
,控制台会自动提示并让你选择。 - 保持 使用默认超时 的勾选状态。
- 点击 保存。
- 控制台会弹出一个提示,请求“授予 Amazon API Gateway 调用Amazon Lambda 函数的权限”。这会自动在 Lambda 函数的资源策略中添加必要的权限。点击 确定。
为什么要强调 Amazon Lambda 代理集成?因为这是亚马逊云推荐的简化模式 。在这种模式下,Amazon API Gateway 不会干预请求和响应的内容,而是将原始的 HTTP 请求完整地打包成 event
对象传递给 Amazon Lambda,并将Amazon Lambda 返回的符合格式的 JSON 对象直接解析成 HTTP 响应。这极大地简化了开发,你不需要在Amazon API Gateway 中配置复杂的请求/响应映射模板,所有逻辑都集中在Amazon Lambda 代码中,使得维护和调试更加容易。
如果希望 API 返回 400 状态代码,则需要首先添加 400 的方法响应状态代码,然后添加集成响应并设置映射。
第三步:部署与测试 - 见证魔法的时刻 ✨
到目前为止,我们所做的一切都还只是蓝图。为了让 API 真正生效,我们需要将其“部署”到一个“阶段”(Stage)。阶段可以理解为 API 的一个快照或版本,通常用于区分开发(dev)、测试(test)、生产(prod)等不同环境 。
- 在 API 的“资源”页面,点击 操作 下拉菜单,选择 部署 API。
- 在弹出的对话框中,“部署阶段”选择 [新阶段]。
- 为阶段命名,例如
test
。 - 点击 部署。
部署成功后,你将被带到“阶段编辑器”页面。在页面顶部,你会看到一个蓝色的 调用 URL。这就是你刚刚创建的、全球可访问的 API 端点!
它的格式类似于:https://{api-id}.execute-api.{region}.amazonaws.com/test
现在,让我们来测试它。打开你的终端,或者使用任何 API 测试工具(如 Postman),向你的 API 发送一个 GET 请求。
测试 1:不带参数
在终端中执行以下命令(请将 URL 替换为你自己的调用 URL):
curl "https://{api-id}.execute-api.{region}.amazonaws.com/test/greet"
你应该会收到如下响应:
{
"message": "Hello, World!",
"input_event": {... }
}
测试 2:带上 name
参数
curl "https://{api-id}.execute-api.{region}.amazonaws.com/test/greet?name=Juejin"
这次,响应会变得更加个性化:
{
"message": "Hello, Juejin!",
"input_event": {... }
}
如果你在浏览器中打开这个 URL,也会看到同样的结果。
总结 🔭
搞定!没花多少时间,一个功能齐全的 REST API 就这么诞生了。简单总结一下:
- 完全托管:你没有配置任何一台服务器。
- 自动伸缩:这个 API 可以从容应对每秒一次的请求,也能平滑扩展到每秒上万次请求,无需你进行任何干预。
- 按需付费:如果没有请求,你就无需支付任何费用。
- 高可用性:Amazon Lambda 和 Amazon API Gateway 本身就是跨多个可用区部署的,你的 API 天生就具备了高可用性。
这一切的起点可以是零成本的。得益于 亚马逊云科技免费套餐,每个月你将获得 100 万次的 Amazon Lambda 函数免费调用和 100 万次的Amazon API Gateway 调用。对于个人项目、初创公司或学习用途来说,这几乎意味着你可以永久免费地运行这样的 API 。
你已经迈出了无服务器开发的第一步。接下来,你可以探索更多可能性:将这个 API 与Amazon DynamoDB(一个 NoSQL 数据库)集成来持久化数据,或者使用亚马逊云 Cognito 来为你的 API 添加用户认证和授权。无服务器的世界,充满了无限可能,等待你去创造。
以上就是本文的全部内容啦。最后提醒一下各位工友,如果后续不再使用相关服务,别忘了在控制台关闭,避免超出免费额度产生费用~