AWS Lambda 快速入门:构建你的第一个无服务器应用 – wiki基地


AWS Lambda 快速入门:构建你的第一个无服务器应用

引言

在云计算时代,”无服务器”(Serverless)已经成为了一个备受瞩目的关键词。它并非意味着完全没有服务器,而是指开发者无需关心底层服务器的购买、配置、维护和扩展,这些繁重的工作都由云服务提供商负责。开发者只需专注于编写代码,将应用程序逻辑部署到云端即可。这种模式极大地提高了开发效率,降低了运维成本。

在众多无服务器服务中,AWS Lambda 无疑是最具代表性和影响力的一个。作为亚马逊网络服务(AWS)的核心无服务器计算服务,Lambda 允许您运行代码而无需预置或管理服务器。您的代码可以响应各种事件,例如对 HTTP 请求、数据库更改、文件上传等作出反应。

本文将带领您踏上 AWS Lambda 的入门之旅,详细介绍 Lambda 的核心概念,并通过一个具体的示例——构建一个由 API Gateway 触发的简单 “Hello, World” 应用——来指导您完成第一个无服务器应用的构建。无论您是刚接触云计算的新手,还是希望探索无服务器架构的开发者,本文都将为您提供清晰、详细的指引。

为什么选择 AWS Lambda?无服务器的优势

在深入技术细节之前,让我们先了解一下使用 AWS Lambda 的主要优势:

  1. 无需管理服务器 (No Server Management): 这是无服务器最核心的优势。您不需要担心操作系统的补丁、安全更新、容量规划或服务器健康状况监控。AWS 全权负责这些基础设施层面的工作。
  2. 按需付费 (Pay-per-use): 您只需为您代码的执行时间(以毫秒为单位)和请求次数付费。当您的代码没有运行时,您无需支付任何费用。与传统服务器(即使空闲也要付费)相比,这通常能显著降低成本,尤其对于负载波动较大的应用。
  3. 自动伸缩 (Automatic Scaling): Lambda 根据传入请求的数量自动伸缩您的函数。无论是一次请求还是每秒数千次请求,Lambda 都能弹性地处理负载,无需您进行任何手动配置或管理。
  4. 高可用性 (High Availability): Lambda 默认就是高可用的,它在多个可用区中运行您的函数,以确保服务的健壮性。
  5. 事件驱动 (Event-Driven): Lambda 可以轻松地响应各种 AWS 服务或其他事件源产生的事件,构建灵活且解耦的系统架构。例如,文件上传到 S3 触发一个函数处理图片,数据写入 DynamoDB 触发一个函数进行数据同步,或者接收到一个 API Gateway 的 HTTP 请求触发一个函数处理业务逻辑。
  6. 快速开发与部署 (Faster Development and Deployment): 开发者只需关注函数代码本身,部署过程通常非常简单,可以直接在 AWS 控制台完成,或者通过命令行工具、IaC(基础设施即代码)工具如 AWS SAM、Serverless Framework 等实现自动化。

理解这些优势,有助于您更好地认识 Lambda 在现代应用开发中的价值。

开始之前:你需要准备什么?

在开始构建您的第一个 Lambda 应用之前,请确保您具备以下条件:

  1. 一个 AWS 账户: 如果您还没有 AWS 账户,请访问 AWS 官网并注册一个。新用户通常可以享受 AWS 免费套餐,这对于学习和试验 Lambda 来说绰绰有余。您可能需要提供信用卡信息以完成注册,但在免费套餐范围内通常不会产生费用。
  2. 基本的编程知识: 本文将以 Node.js 为例,但 Lambda 支持多种运行时(如 Python, Java, C#, Go, Ruby 等)。您需要对至少一种 Lambda 支持的编程语言有基本的了解。
  3. 对云计算有基本认识: 了解什么是云服务、区域 (Region)、可用区 (Availability Zone) 等基本概念会有帮助。

核心概念:理解 AWS Lambda 的组成部分

在动手操作之前,先熟悉一些 Lambda 的核心概念至关重要:

  1. Lambda 函数 (Lambda Function): 这是您部署到 Lambda 的代码。它是一个无状态的函数,负责执行特定的任务。Lambda 函数由代码和配置(如运行时、内存、超时、IAM 角色等)组成。
  2. 运行时 (Runtime): Lambda 支持多种编程语言的运行时环境,例如 Node.js, Python, Java, C#, Go, Ruby 等。您需要选择与您的函数代码兼容的运行时。
  3. 事件 (Event): Lambda 函数通过事件触发。事件是一个 JSON 格式的对象,包含了触发函数所需的数据。不同的事件源(如 API Gateway, S3, DynamoDB)会向函数发送不同结构的事件对象。
  4. 触发器 (Trigger): 触发器是配置 Lambda 函数响应特定事件的机制。一个 Lambda 函数可以有多个触发器。例如,一个 API Gateway 触发器使函数响应 HTTP 请求,一个 S3 触发器使函数响应 S3 桶中的对象创建事件。
  5. 执行环境 (Execution Environment): Lambda 在安全的隔离环境中运行您的函数代码。第一次调用函数时,Lambda 会创建一个执行环境(可能存在“冷启动”延迟),后续调用可能会重用该环境(“热启动”)。
  6. IAM 角色 (IAM Role): Lambda 函数需要拥有执行操作所需的权限。这些权限通过 AWS Identity and Access Management (IAM) 角色来定义。当 Lambda 函数执行时,它会 asumir(承担)指定的 IAM 角色,从而获得访问其他 AWS 服务(如 CloudWatch Logs 写入日志、访问 S3 桶、读写 DynamoDB 表等)的权限。这个角色是函数能够正常工作的关键。
  7. 内存 (Memory): 您为 Lambda 函数配置的内存大小(以 MB 为单位,通常在 128MB 到 10240MB 之间)。内存大小直接影响分配给函数的 CPU 能力。更高的内存意味着更多的 CPU 资源,函数执行可能会更快,但成本也可能更高。您需要根据函数的实际需求来配置合适的内存。
  8. 超时 (Timeout): 函数允许执行的最大时间(以秒为单位,最长可达 15 分钟)。如果函数执行时间超过设定的超时时间,它将被终止。
  9. 并发 (Concurrency): Lambda 函数可以同时处理的请求数量。默认情况下,账户在所有函数中共享一个并发限制(通常是 1000),但您可以为特定函数配置保留并发或突发并发。
  10. 环境变量 (Environment Variables): 允许您将配置信息(如数据库连接字符串、API 密钥等)传递给函数代码,而无需硬编码。这使得函数代码更易于管理和复用。

理解了这些概念,我们就可以开始构建第一个应用了。

构建你的第一个无服务器应用:“Hello, World” API

我们的目标是构建一个简单的无服务器应用:通过一个 HTTP 请求触发 Lambda 函数,函数返回一个 “Hello, World” 消息。我们将使用 AWS API Gateway 作为触发器。

步骤 1:登录 AWS 控制台并进入 Lambda 服务

  1. 打开您的网络浏览器,访问 https://aws.amazon.com/ 并点击 “登录控制台”(Sign In to the Console)。
  2. 输入您的 AWS 账户凭证并登录。
  3. 登录后,在搜索栏中输入 “Lambda” 并选择 “Lambda” 服务,或者在服务列表中找到 “计算” (Compute) 下的 “Lambda”。
  4. 进入 Lambda 控制台页面。

步骤 2:创建 Lambda 函数

  1. 在 Lambda 控制台页面的左侧导航栏或页面中心,找到并点击 “创建函数” (Create function) 按钮。
  2. 进入创建函数页面,您会看到几个选项。选择 “从头开始创作” (Author from scratch)
  3. 填写函数的基本信息:

    • 函数名称 (Function name): 输入一个唯一的名称,例如 my-first-lambda-api
    • 运行时 (Runtime): 选择与您计划编写代码兼容的语言。我们将使用 Node.js,所以选择一个合适的 Node.js 版本,例如 Node.js 18.xNode.js 20.x
    • 架构 (Architecture): 选择 x86_64 (默认且最常用)。
    • 执行角色 (Execution role): 这是非常重要的一步。函数需要一个 IAM 角色来获得执行权限。
      • 选择 “创建新的角色并允许 Lambda 具有基本 Lambda 权限” (Create a new role with basic Lambda permissions)。这将自动创建一个新的 IAM 角色,该角色拥有将日志写入 CloudWatch Logs 的权限,这对于调试非常重要。
      • 如果您已经有了合适的角色,也可以选择“使用现有角色”。但对于初学者,创建新角色是最简单的。
  4. 点击页面底部的 “创建函数” (Create function) 按钮。

Lambda 将为您创建一个新的函数,并跳转到函数的配置页面。

步骤 3:编写和配置函数代码

创建函数后,您会看到函数的设计器视图,其中包含函数代码编辑器和其他配置选项。

  1. 代码源 (Code source): 向下滚动到“代码源”部分。您会看到一个在线代码编辑器。

    • 对于 Node.js 运行时,默认的代码通常是这样的:

    javascript
    exports.handler = async (event, context) => {
    // TODO implement
    const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
    };

    • 这个代码模板非常基础。exports.handler 是函数入口点。当 Lambda 被触发时,会调用这个 handler 函数。它接收两个参数:event (包含触发事件数据的对象) 和 context (包含运行时信息的对象)。
    • 函数需要返回一个响应对象。对于 API Gateway 触发的函数,响应对象需要遵循特定的格式,至少包含 statusCodebodybody 应该是字符串。

    • 我们将稍微修改代码,使其返回一个更通用的 “Hello, World” 消息,并演示如何从事件中获取信息(尽管我们的第一个版本不需要事件信息)。

    “`javascript
    // index.js (或者根据你的运行时和文件名)
    exports.handler = async (event, context) => {
    console.log(‘Received event:’, JSON.stringify(event, null, 2)); // 打印接收到的事件,用于调试

    // 构建响应对象
    const response = {
        statusCode: 200, // HTTP 状态码 200 表示成功
        headers: {
            "Content-Type": "application/json" // 告诉客户端响应是 JSON 格式
        },
        body: JSON.stringify({ // 将 JavaScript 对象转换为 JSON 字符串作为响应体
            message: 'Hello from your first AWS Lambda function!',
            input: event // 将接收到的事件也包含在响应中,方便查看
        }),
    };
    
    // 返回响应对象
    return response;
    

    };
    “`
    * 将上面的代码粘贴到代码编辑器中。

  2. 保存代码: 点击编辑器上方的 “部署” (Deploy) 按钮来保存并部署您的代码更改。

  3. 配置函数设置:

    • 在函数配置页面的上方选项卡中选择 “配置” (Configuration)
    • 在左侧导航栏选择 “通用配置” (General configuration)。点击 “编辑” (Edit)
    • 内存 (Memory): 对于这个简单的函数,默认的 128MB 内存是足够的。您可以稍后根据需要调整。
    • 超时 (Timeout): 默认的 3 秒对于 “Hello, World” 来说足够了。您可以将其增加到例如 30 秒,但请记住,函数执行时间越长,成本越高。对于长时间运行的任务,可能需要考虑其他服务或不同的架构。
    • 点击 “保存” (Save)

步骤 4:测试 Lambda 函数(不带触发器)

在连接 API Gateway 之前,最好先在 Lambda 控制台内置的测试工具中测试函数是否正常工作。

  1. 在代码源编辑器上方,点击 “测试” (Test) 按钮旁边的下拉箭头,选择 “配置测试事件” (Configure test event)
  2. 在配置测试事件页面:

    • 模板 (Template): 选择一个模板。对于测试一个没有特定事件结构的简单函数,您可以选择 hello-worldaws:proxy (如果想模拟 API Gateway 事件结构)。我们先使用 hello-world,它是一个空的 JSON {}
    • 事件名称 (Event name): 输入一个名称,例如 MyTestEvent
    • 事件 JSON (Event JSON): 默认是一个空的 JSON 对象 {}。您可以保留它。如果您想模拟一些输入,可以在这里输入 JSON。例如:{"key1": "value1"}
    • 点击 “保存” (Save)
  3. 现在,点击页面顶部的 “测试” (Test) 按钮。

  4. 您会在页面顶部看到“执行结果”。展开 “详细信息” (Details) 部分。
    • 您应该看到 Status: Succeeded (成功)。
    • 日志 (Logs): 在日志输出中,您应该能看到 console.log 打印的内容,包括接收到的事件。
    • 返回的响应 (Returned response): 您应该看到函数返回的 JSON 对象,例如:
      json
      {
      "statusCode": 200,
      "headers": {
      "Content-Type": "application/json"
      },
      "body": "{\"message\":\"Hello from your first AWS Lambda function!\",\"input\":{}}"
      }

      注意 body 是一个包含 JSON 字符串的字符串。
    • 您还可以看到 Duration (执行时间)、Billed duration (计费时间)、Memory used (内存使用) 等信息。

这表明您的 Lambda 函数代码本身可以正常运行并返回预期的响应。

步骤 5:添加 API Gateway 触发器

现在,我们要让这个函数可以通过 HTTP 请求从互联网访问。我们将使用 API Gateway 来实现这一点。

  1. 回到函数的 “设计器” (Designer) 视图页面。
  2. 在左侧的 “添加触发器” (Add trigger) 面板中,点击触发器列表中的 “API Gateway”
  3. 在 API Gateway 配置部分:

    • API 创建 (API creation): 选择 “创建新的 API” (Create an API)
    • API 类型 (API type): 对于简单的 HTTP Endpoint,推荐使用 HTTP API。它比 REST API 更简单、更快、更便宜。选择 HTTP API
    • 安全 (Security): 对于我们的第一个简单的 “Hello, World” 应用,选择 “开放” (Open)。这意味着任何人都可以访问这个 API endpoint。在生产环境中,您需要配置更严格的安全措施,例如 IAM 授权、Lambda 授权程序或 Cognito 用户池。
    • 点击 “添加” (Add) 按钮。
  4. API Gateway 触发器将被添加到您的函数。在设计器视图中,您会看到 API Gateway 图标连接到您的函数。

  5. 向下滚动到“触发器”部分,展开您刚刚添加的 API Gateway 触发器。您将看到一个 API endpoint URL。这个 URL 就是您的无服务器应用的入口点。它通常是这样的格式:https://xxxxxxxxxx.execute-api.REGION.amazonaws.com/

步骤 6:通过 API Gateway URL 测试应用

  1. 复制 API Gateway 触发器详细信息中显示的 API endpoint URL
  2. 打开一个新的浏览器标签页,将复制的 URL 粘贴到地址栏并访问。
  3. 您应该在浏览器中看到 Lambda 函数返回的响应。由于我们将响应的 Content-Type 设置为 application/json,并且 body 是 JSON 字符串,浏览器可能会直接显示格式化的 JSON,例如:

    json
    {
    "message": "Hello from your first AWS Lambda function!",
    "input": {
    "version": "2.0",
    "routeKey": "ANY /",
    "rawPath": "/",
    "rawQueryString": "",
    "headers": {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "zh-CN,zh;q=0.9",
    // ... 其他请求头 ...
    },
    // ... 其他事件字段 ...
    }
    }

    注意,这次 input 字段不再是空对象 {},而是包含了 API Gateway 传递给 Lambda 函数的详细事件信息,例如请求头、路径、查询参数等。这验证了 API Gateway 成功触发了 Lambda 函数,并将请求信息传递了进来。

恭喜您!您已经成功构建并部署了您的第一个 AWS Lambda 无服务器应用,并通过 API Gateway 使其可以通过 HTTP 请求访问。

深入探索:Lambda 的更多能力

您的第一个 Lambda 函数只是一个起点。AWS Lambda 提供了许多其他功能和配置选项,可以帮助您构建更复杂、更强大的无服务器应用。

  1. 其他触发器类型: 除了 API Gateway,Lambda 可以被各种 AWS 服务触发:

    • Amazon S3: 文件上传、删除等事件。
    • Amazon DynamoDB Streams / Kinesis: 实时处理数据流。
    • Amazon SQS: 从消息队列中消费消息。
    • Amazon SNS: 订阅通知。
    • CloudWatch Events/EventBridge: 定时任务(Cron Jobs)或响应其他 AWS 服务事件。
    • Step Functions: 作为工作流的一部分。
    • 等等。
      了解和使用这些触发器,可以让您的应用架构更加灵活和事件驱动。
  2. Lambda 层 (Lambda Layers): 如果您的多个 Lambda 函数需要使用相同的代码库、依赖项或自定义运行时,您可以将这些共享组件打包成一个层。这样可以减小函数部署包的大小,并方便管理共享依赖。

  3. 环境变量 (Environment Variables): 在配置选项中,您可以为函数设置环境变量。这是一种安全地存储和传递配置信息(如 API 密钥、数据库连接字符串、特性标志等)的好方法,避免将它们硬编码到代码中。

  4. VPC 配置: 默认情况下,Lambda 函数在 AWS 内部网络中运行,无法直接访问您 VPC (Virtual Private Cloud) 内的私有资源(如私有子网中的 RDS 数据库、ElastiCache 集群等)。如果您的函数需要访问这些资源,您需要将函数配置到您的 VPC 中。这会增加一些配置复杂性,并且可能会影响冷启动时间。

  5. 监控和日志记录: Lambda 与 Amazon CloudWatch 集成,提供详细的监控指标(如调用次数、错误率、延迟、并发使用等)和日志记录。在 CloudWatch Logs 中,您可以查看函数的 console.log 输出和其他运行时日志,这对于调试和故障排除至关重要。在 Lambda 控制台的函数页面,选择 “监控” (Monitor) 选项卡,可以方便地跳转到 CloudWatch 查看相关信息。

  6. 错误处理和重试: Lambda 支持配置重试行为,以处理函数执行失败的情况。对于异步调用(如 SQS, S3, EventBridge 触发),Lambda 会自动重试。对于同步调用(如 API Gateway),重试通常由客户端或触发服务处理。您还可以配置死信队列 (Dead Letter Queue – DLQ),将未能成功处理的事件发送到 SQS 队列或 SNS 主题进行进一步处理或分析。

  7. 性能优化: 影响 Lambda 函数性能的关键因素包括:

    • 冷启动 (Cold Starts): 第一次调用函数或长时间未被调用后再次调用时,Lambda 需要创建新的执行环境,这会引入一些延迟。选择合适的内存大小(通常更大的内存可以减少冷启动时间,因为分配了更多的 CPU 资源)、使用 Provisioned Concurrency (预置并发) 或保持函数“温暖”可以缓解冷启动问题。
    • 内存配置: 内存大小直接影响 CPU 分配。测试不同内存配置对函数执行时间和成本的影响,找到最佳平衡点。
    • 代码效率: 优化函数代码,减少不必要的计算和外部调用。
    • 依赖项: 减少函数包中的依赖项数量和大小。
  8. 成本管理: Lambda 的成本主要取决于请求次数和执行时间。通过优化代码、配置合适的内存和超时时间、监控使用情况,可以有效地管理成本。AWS Free Tier 提供了每月大量的免费请求和计算时间,对于学习和开发阶段来说非常慷害。

超越控制台:基础设施即代码 (IaC)

虽然使用 AWS 控制台创建和管理 Lambda 函数对于入门学习非常方便,但在实际开发中,特别是有多个函数和相关资源(如 API Gateway, DynamoDB 表, SQS 队列等)时,手动操作控制台会变得效率低下且容易出错。

推荐使用基础设施即代码 (IaC) 工具来管理您的无服务器应用,例如:

  • AWS Serverless Application Model (AWS SAM): 是 AWS 官方提供的工具,用于构建无服务器应用。它扩展了 AWS CloudFormation,提供了简洁的语法来定义无服务器资源。
  • Serverless Framework: 一个流行的第三方无服务器应用框架,支持多种云服务提供商,包括 AWS。它提供了强大的命令行工具和插件生态系统。
  • AWS CloudFormation / Terraform: 更通用的 IaC 工具,也可以用于定义和部署 Lambda 函数及相关资源,但语法可能不如 SAM 或 Serverless Framework 专注于无服务器。

使用 IaC 可以将您的应用基础设施版本化、自动化部署,并轻松在不同环境(开发、测试、生产)之间复制。

无服务器的考量与挑战

尽管无服务器提供了诸多优势,但也并非没有需要考虑的方面:

  • 冷启动: 对于对延迟要求极高的应用(如某些交互式 API),冷启动可能是一个挑战。可以通过预置并发等方式缓解,但这会增加成本。
  • 最大执行时间限制: Lambda 函数的最长执行时间是 15 分钟。对于长时间运行或计算密集型任务,可能需要拆分成多个函数或考虑其他计算服务(如 Fargate, EC2)。
  • 调试和故障排除: 在分布式无服务器架构中,调试问题可能比传统的单体应用更复杂,因为请求会流经多个服务(API Gateway -> Lambda -> DynamoDB -> SQS 等)。需要依赖 CloudWatch Logs、AWS X-Ray (分布式追踪服务) 等工具来理解请求流和定位问题。
  • 状态管理: Lambda 函数是无状态的。如果您的应用需要维护状态,您需要使用外部服务来存储状态,例如 DynamoDB, RDS, S3, ElastiCache 等。
  • 供应商锁定: 严重依赖某个云服务提供商的特定无服务器服务(如 Lambda)可能会增加迁移到其他云平台的难度。

尽管存在这些挑战,但对于许多用例而言,无服务器架构带来的运维简化、成本效益和弹性伸缩能力是巨大的优势。

结论

恭喜您完成了 AWS Lambda 的快速入门之旅!您已经成功创建、配置、部署并测试了您的第一个无服务器函数,并将其与 API Gateway 集成,使其成为一个可访问的 HTTP 端点。

通过这个简单的 “Hello, World” 示例,您已经掌握了 Lambda 的基本工作原理和核心概念。这只是无服务器世界的一个开端。Lambda 强大的事件驱动能力使其能够成为构建各种现代化应用的基石,包括 Web 后端、数据处理管道、自动化任务、聊天机器人等等。

现在,您可以尝试修改您的函数代码,使其执行更复杂的逻辑;探索连接其他 AWS 服务作为触发器或依赖项;或者开始使用 AWS SAM 或 Serverless Framework 来更有效地管理您的无服务器项目。

无服务器计算代表了一种未来的应用构建范式。通过拥抱 AWS Lambda,您可以更专注于创新,更快地将想法转化为可工作的应用,并将宝贵的资源从繁琐的基础设施管理中解放出来。不断学习和实践,您将能够充分利用无服务器的强大能力,构建出弹性、可伸缩且经济高效的云原生应用。

祝您在无服务器的旅程中一切顺利!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部