实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API

实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API


理论千遍,不如动手一遍!在前面几篇文章中,我们了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。现在,是时候把这些知识运用起来,亲手构建一个简单但完整的 Serverless 应用了。

本次实战,我们将使用 Amazon Web Services (AWS) 这个主流的云平台,结合它的两个核心 Serverless 服务:

  • AWS Lambda (FaaS): 运行我们的后端代码。
  • AWS API Gateway (BaaS): 创建一个公开的 HTTP 接口,接收请求并触发 Lambda 函数。

目标: 创建一个简单的 HTTP GET API 端点,当用户访问这个端点时,它会返回一个 JSON 消息:"Hello from Lambda!"。

听起来很简单?没错!但这将让你体验到 Serverless 开发的核心流程。

准备工作

在开始之前,请确保你已准备好:

  1. 一个 AWS 账户: 如果没有,可以访问 AWS 官网 免费注册一个。新用户通常有一年的免费套餐额度,足够我们本次实验使用。
  2. 登录 AWS 管理控制台: 我们将主要通过 AWS 的网页界面来完成操作,对新手更友好。
  3. (可选) Node.js 环境: 我们将使用 Node.js 编写 Lambda 函数代码。虽然可以直接在 AWS 控制台编辑,但如果你想在本地编写和测试,需要安装 Node.js (LTS 版本即可)。

准备好了吗?我们开始吧!

第一步:创建 Lambda 函数

我们的"大脑"------处理请求的代码,将放在 Lambda 函数中。

  1. 登录 AWS 管理控制台。
  2. 在顶部的搜索栏中输入 Lambda,然后点击进入 Lambda 服务页面。
  3. 点击 "创建函数" (Create function) 按钮。
  4. 选择 "从头开始创作" (Author from scratch)
  5. 基本信息配置:
  • 函数名称 (Function name): 输入一个有意义的名称,例如 myHelloFunction
  • 运行时 (Runtime): 选择一个较新的 Node.js LTS 版本,例如 Node.js 18.xNode.js 20.x
  • 架构 (Architecture): 保持默认的 x86_64 即可。
  • 权限 (Permissions): 展开 "更改默认执行角色" (Change default execution role)。选择 "创建具有基本 Lambda 权限的新角色" (Create a new role with basic Lambda permissions)。这将自动创建一个允许函数将日志写入 AWS CloudWatch 的角色,方便后续排查问题。
  1. 点击 "创建函数" (Create function)。等待函数创建完成。

编写函数代码:

  1. 函数创建成功后,向下滚动到 "代码源" (Code source) 部分。
  2. 你会看到一个默认的 index.mjsindex.js 文件。将其中的全部内容替换为以下 Node.js 代码:

登录后复制

plain 复制代码
// 使用 async/await 语法定义 handler
export const handler = async (event) => {
    // event 对象包含了来自 API Gateway 的请求信息
    console.log("Received event:", JSON.stringify(event, null, 2));

    // 这是我们要返回给 API Gateway 的响应体
    const responseBody = {
        message: "Hello from Lambda!",
        // 可以把接收到的部分请求信息也返回,方便调试
        input: event
    };

    // 构建符合 API Gateway Lambda 代理集成格式的响应对象
    const response = {
        statusCode: 200, // HTTP 状态码
        headers: {
            "Content-Type": "application/json",
            // 可以添加其他需要的响应头,例如 CORS
            "Access-Control-Allow-Origin": "*",
        },
        body: JSON.stringify(responseBody), // 响应体必须是字符串
    };

    console.log("Returning response:", JSON.stringify(response, null, 2));
    return response;
};
  1. 代码解释:
  • export const handler = async (event) => { ... }: 这是 Lambda 函数的入口点(处理程序)。当函数被触发时,AWS 会调用这个 handler 函数。event 对象包含了触发事件的所有信息(对于 API Gateway 触发,它包含 HTTP 请求的详细信息)。
  • responseBody: 我们要返回的 JSON 数据。
  • response: 这是关键 !我们稍后会将 API Gateway 配置为Lambda 代理集成 (Proxy Integration) 模式,这种模式要求 Lambda 函数必须返回一个包含 statusCode, headers, 和 body (字符串形式) 的特定结构的 JSON 对象。
  1. 点击代码编辑器上方的 "部署" (Deploy) 按钮,保存你的代码更改。

很好!我们的 Lambda 函数已经准备就绪,可以接收事件并返回一个 JSON 响应了。

第二步:创建 API Gateway

现在,我们需要创建一个公共的 URL 入口,让用户可以通过互联网访问我们的 Lambda 函数。

  1. 在顶部的搜索栏中输入 API Gateway,然后点击进入 API Gateway 服务页面。
  2. 找到 REST API 卡片(注意不是 HTTP API 或 WebSocket API),点击 "构建" (Build) 按钮。
  3. 在 "创建新 API" 页面:
  • 选择 "新建 API" (New API)
  • API 名称 (API name): 输入一个名称,例如 myHelloAPI
  • 描述 (Description): (可选) 添加描述。
  • 终端节点类型 (Endpoint Type): 选择 "区域" (Regional)
  1. 点击 "创建 API" (Create API)

创建资源和方法:

  1. API 创建成功后,在左侧导航栏选中 "资源" (Resources)
  2. 点击 "操作" (Actions) 下拉菜单,选择 "创建资源" (Create Resource)
  • 资源名称 (Resource Name): 输入 hello
  • 资源路径 (Resource Path): 会自动填充为 hello
  • 确保 "启用 API Gateway CORS" (Enable API Gateway CORS) 暂时不勾选(我们已经在 Lambda 代码里添加了简单的 CORS 头)。
  • 点击 "创建资源" (Create Resource)
  1. 现在,选中刚刚创建的 /hello 资源。再次点击 "操作" (Actions) 下拉菜单,选择 "创建方法" (Create Method)
  2. /hello 下方出现的小下拉框中,选择 GET,然后点击旁边的对勾 ✔️

配置 GET 方法与 Lambda 集成:

  1. "GET - 设置" (GET - Setup) 页面:
  • 集成类型 (Integration type): 选择 "Lambda 函数" (Lambda Function)
  • 勾选 "使用 Lambda 代理集成" (Use Lambda Proxy integration)这一步非常重要! 它让 API Gateway 将原始的 HTTP 请求直接传递给 Lambda 函数(在 event 对象中),并将 Lambda 函数返回的特定格式响应(包含 statusCode, headers, body)直接映射回 HTTP 响应。这大大简化了配置。
  • Lambda 区域 (Lambda Region): 保持默认(你当前所在的区域)。
  • Lambda 函数 (Lambda Function): 开始输入你之前创建的函数名称 myHelloFunction,系统会自动提示,选中它。
  • 保持 "使用默认超时" (Use Default Timeout) 勾选。
  • 点击 "保存" (Save)
  1. 会弹出一个提示 "授予 API Gateway 权限以调用您的 Lambda 函数" (Add Permission to Lambda Function) ,点击 "确定" (OK) 。这允许 API Gateway 在收到请求时触发 myHelloFunction
第三步:部署 API

API 配置好了,但还需要部署到一个"阶段"(Stage) 才能被公开访问。

  1. 仍然在 /hello 资源的 GET 方法配置页面,或者选中左侧的 /hello -> GET
  2. 点击 "操作" (Actions) 下拉菜单,选择 "部署 API" (Deploy API)
  3. "部署 API" 弹窗中:
  • 部署阶段 (Deployment stage): 选择 "[新阶段]" ([New Stage])
  • 阶段名称 (Stage name): 输入 dev (表示开发环境)或其他你喜欢的名称。
  • 阶段描述 / 部署描述 (Stage/Deployment description): (可选) 添加描述。
  1. 点击 "部署" (Deploy)
第四步:测试你的 Serverless API!

部署成功后,你会进入 dev 阶段编辑器页面。

  1. 展开 dev 阶段 -> / -> /hello -> GET
  2. 你会看到一个 "调用 URL" (Invoke URL) ,类似 https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev
  3. 完整的 API 端点 URL 是 "调用 URL" 加上你的资源路径 /hello,例如:https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello (请替换成你自己的 URL)。
  4. 测试方法:
  • 浏览器: 直接将完整的 API 端点 URL 粘贴到浏览器地址栏并访问。
  • curl (命令行): 打开终端或命令提示符,输入 curl <你的完整 API 端点 URL>,例如:

登录后复制

plain 复制代码
curl https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello
  1. 预期结果: 你应该会看到类似以下的 JSON 输出:

登录后复制

plain 复制代码
{
  "message": "Hello from Lambda!",
  "input": {
    // 这里会包含很多关于请求的详细信息,来自 event 对象
    "resource": "/hello",
    "path": "/hello",
    "httpMethod": "GET",
    // ... 其他请求头、查询参数等信息
  }
}

如果遇到问题怎么办?

  • 检查 URL 是否正确: 确保包含了阶段名称 (/dev) 和资源路径 (/hello)。
  • 检查 API Gateway 部署: 每次修改配置后都需要重新部署 API 到某个阶段才能生效。
  • 检查 Lambda 函数日志: 回到 Lambda 函数页面,切换到 "监控" (Monitor) 标签页,点击 "查看 CloudWatch 中的日志" (View logs in CloudWatch) 。在这里你可以看到函数的执行日志(包括 console.log 输出)和任何错误信息。这是排查问题的首选之地!
小结与展望

恭喜你! 你刚刚成功地创建、部署并测试了你的第一个 Serverless API!回顾一下,你:

  1. 编写了一个简单的 Node.js 函数并在 AWS Lambda 上部署了它。
  2. 配置了 AWS API Gateway 来接收公网 HTTP GET 请求。
  3. 将 API Gateway 与 Lambda 函数通过代理集成连接起来。
  4. 将 API 部署到了一个可访问的阶段。
  5. 通过 URL 成功调用了你的 Serverless API!

最重要的是,整个过程中你没有配置任何服务器、操作系统或网络,AWS 平台为你处理了这一切。而且这个 API 具备自动伸缩能力,并按实际调用次数和执行时间付费。

相关推荐
代码的奴隶(艾伦·耶格尔)1 小时前
微服务!!
微服务·云原生·架构
是垚不是土5 小时前
探秘高可用负载均衡集群:企业网络架构的稳固基石
运维·服务器·网络·云原生·容器·架构·负载均衡
杰克逊的日记5 小时前
大规模k8s集群怎么规划
云原生·容器·kubernetes
matrixlzp7 小时前
K8S Ingress、IngressController 快速开始
云原生·容器·kubernetes
探索云原生8 小时前
一文搞懂 GPU 共享方案: NVIDIA Time Slicing
ai·云原生·kubernetes·gpu
weixin_307779139 小时前
使用FastAPI微服务在AWS EKS中构建上下文增强型AI问答系统
人工智能·python·云计算·fastapi·aws
说淑人9 小时前
Spring Cloud & 以Gateway实现限流(自定义返回内容)
java·spring cloud·gateway·限流
喵叔哟11 小时前
21.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--身份认证服务拆分规划
微服务·云原生·架构
掘金-我是哪吒21 小时前
分布式微服务系统架构第127集:cassandra安装部署
分布式·微服务·云原生·架构·系统架构