实战演练:用 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 具备自动伸缩能力,并按实际调用次数和执行时间付费。

相关推荐
avoidaily4 小时前
使用Node.js分片上传大文件到阿里云OSS
阿里云·node.js·云计算
徐传良7 小时前
03.搭建K8S集群
云原生·容器·kubernetes
Elastic 中国社区官方博客8 小时前
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
大数据·人工智能·elasticsearch·搜索引擎·云计算·全文检索·aws
agenIT8 小时前
腾讯云 Python3.12.8 通过yum安装 并设置为默认版本
云计算·腾讯云
Ares-Wang8 小时前
kubernetes》》k8s》》kubectl proxy 命令后面加一个&
云原生·容器·kubernetes
Johny_Zhao8 小时前
阿里云数据库Inventory Hint技术分析
linux·mysql·信息安全·云计算·系统运维
容器魔方8 小时前
议程一览 | KubeCon China 2025 华为云精彩前瞻
云原生·容器·云计算
FBI HackerHarry浩9 小时前
云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】
linux·运维·云计算·腾讯云
藥瓿亭10 小时前
2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志
linux·运维·docker·云原生·容器·kubernetes·cka
一ge科研小菜鸡11 小时前
构建云原生安全治理体系:挑战、策略与实践路径
安全·云原生