Duoyun Cloud
返回博客
tutorials2026-04-17

AWS Lambda入门:Node.js实战教程

AWSLambdaServerlessNode.js

AWS Lambda入门:Node.js实战教程

如果你正在寻找一种无需管理服务器即可运行代码的方式,AWS Lambda 无疑是目前最成熟的无服务器计算平台之一。本教程将带你从零开始,使用 Node.js 构建和部署你的第一个 Lambda 函数,并结合实际场景深入讲解核心概念。

什么是 AWS Lambda?

AWS Lambda 是 AWS 提供的事件驱动型无服务器计算服务。你只需上传代码,Lambda 会自动处理底层基础设施的 provisioning、扩缩容和容错。你按照实际执行时间付费——以 1ms 为最小计费单位。

核心优势:

  • 零运维:无需管理服务器、操作系统或运行时环境
  • 自动扩缩:从每天几个请求到每秒数千个请求,自动应对
  • 按需计费:仅按实际计算时间付费,空闲时不产生费用
  • 多语言支持:Node.js、Python、Java、Go、.NET 等

定价概览

AWS Lambda 提供每月 100万次免费请求400,000 GB-秒 的免费计算时间。超出部分:

| 计费项 | 价格 | |--------|------| | 每百万次请求 | $0.20 | | 计算(每GB-秒) | $0.0000166667 | | 128MB 内存,100ms执行 | 约 $0.0000002083 |

环境准备

在开始之前,确保你已具备以下条件:

  1. AWS 账户:注册 AWS 免费套餐
  2. Node.js 18.x+:推荐使用 LTS 版本
  3. AWS CLI:安装并配置 aws configure
  4. AWS SAM CLI(可选):用于本地调试
# 安装 AWS CLI
brew install awscli

# 配置凭证
aws configure
# 输入 Access Key ID、Secret Access Key、Region(如 us-east-1)

# 验证
aws sts get-caller-identity

第一个 Lambda 函数:Hello World

方式一:AWS 控制台创建

  1. 登录 AWS 管理控制台,导航到 Lambda 服务
  2. 点击「创建函数」
  3. 选择「从头开始创作」
  4. 配置:
    • 函数名称:hello-world
    • 运行时:Node.js 20.x
    • 架构:x86_64
    • 执行角色:创建新角色
  5. 点击「创建函数」

方式二:使用代码编写函数

将默认的 index.mjs 替换为以下代码:

export const handler = async (event) => {
  console.log('Event:', JSON.stringify(event, null, 2));

  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      message: 'Hello from AWS Lambda!',
      timestamp: new Date().toISOString(),
    }),
  };
};

点击「部署更改」,然后点击「测试」创建测试事件即可运行。

实战示例:RESTful API 处理器

让我们构建一个更实用的例子——一个处理 CRUD 操作的 API 函数:

// handler.mjs
const users = new Map();
let nextId = 1;

export const handler = async (event) => {
  const { httpMethod, path, body, pathParameters } = event;
  const headers = {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*',
  };

  try {
    switch (httpMethod) {
      case 'GET': {
        if (pathParameters?.id) {
          const user = users.get(pathParameters.id);
          if (!user) {
            return { statusCode: 404, headers, body: JSON.stringify({ error: 'User not found' }) };
          }
          return { statusCode: 200, headers, body: JSON.stringify(user) };
        }
        return {
          statusCode: 200,
          headers,
          body: JSON.stringify(Array.from(users.values())),
        };
      }

      case 'POST': {
        const data = JSON.parse(body);
        const id = String(nextId++);
        const user = { id, ...data, createdAt: new Date().toISOString() };
        users.set(id, user);
        return { statusCode: 201, headers, body: JSON.stringify(user) };
      }

      case 'DELETE': {
        if (pathParameters?.id) {
          users.delete(pathParameters.id);
          return { statusCode: 204, headers, body: '' };
        }
        return { statusCode: 400, headers, body: JSON.stringify({ error: 'Missing user id' }) };
      }

      default:
        return { statusCode: 405, headers, body: JSON.stringify({ error: 'Method not allowed' }) };
    }
  } catch (error) {
    return { statusCode: 500, headers, body: JSON.stringify({ error: error.message }) };
  }
};

集成 API Gateway

要让 Lambda 函数通过 HTTP 访问,需要配置 API Gateway:

  1. 在 Lambda 控制台,点击「添加触发器」
  2. 选择「API Gateway」
  3. 选择「创建新 API」→ REST API
  4. 安全设置选择「开放」(仅用于测试环境)
  5. 点击「添加」

部署完成后,你将获得一个类似如下的 URL:

https://abc123.execute-api.us-east-1.amazonaws.com/prod/hello-world

使用 SAM 模板部署

对于生产环境,推荐使用基础设施即代码(IaC)方式部署。以下是 SAM 模板示例:

# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  ApiFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: handler.handler
      Runtime: nodejs20.x
      MemorySize: 256
      Timeout: 10
      Events:
        GetUsers:
          Type: Api
          Properties:
            Path: /users
            Method: GET
        CreateUser:
          Type: Api
          Properties:
            Path: /users
            Method: POST
        GetUser:
          Type: Api
          Properties:
            Path: /users/{id}
            Method: GET

部署命令:

# 构建
sam build

# 本地测试
sam local start-api

# 部署(首次需要引导)
sam deploy --guided

性能优化技巧

| 优化策略 | 说明 | 效果 | |----------|------|------| | 冷启动优化 | 使用 Provisioned Concurrency | 减少 50-90% 冷启动延迟 | | 内存调优 | 从 128MB 逐步增加到最佳性价比点 | 内存翻倍 → 执行时间减半 | | 连接复用 | 在 handler 外部初始化数据库连接 | 避免每次调用重建连接 | | 层(Layers) | 共享依赖打包为 Layer | 减小部署包体积 | | Node.js ES Modules | 使用 .mjs 格式 | 更快的模块加载速度 |

监控与日志

Lambda 自动与 Amazon CloudWatch 集成:

  • 日志console.log() 输出自动发送到 CloudWatch Logs
  • 指标:调用次数、错误率、执行时长、并发数
  • X-Ray 追踪:启用后可可视化请求链路
// 结构化日志示例
export const handler = async (event) => {
  const startTime = Date.now();

  try {
    const result = await processEvent(event);
    console.log(JSON.stringify({
      level: 'INFO',
      message: 'Request processed',
      duration: Date.now() - startTime,
      requestId: event.requestContext?.requestId,
    }));
    return result;
  } catch (error) {
    console.error(JSON.stringify({
      level: 'ERROR',
      message: error.message,
      stack: error.stack,
    }));
    throw error;
  }
};

注意事项与最佳实践

  1. 函数要保持无状态:Lambda 实例可能随时被回收,不要依赖本地存储
  2. 控制部署包大小:精简 node_modules,使用 Webpack/esbuild 打包
  3. 设置合理的超时:默认 3 秒,最长 15 分钟
  4. 使用环境变量:敏感信息用 AWS Secrets Manager,配置项用环境变量
  5. 幂等设计:同一事件可能被重试,确保函数幂等

总结

AWS Lambda + Node.js 是构建现代无服务器应用的高效组合。从简单的 HTTP API 到复杂的事件处理管道,Lambda 都能提供灵活且经济实惠的解决方案。关键在于理解冷启动、内存配置和事件驱动模型这些核心概念。

想要在 AWS 上获得更优的采购价格?通过多云平台购买 AWS 资源,可享受合作伙伴专属折扣,最高节省 25% 的云服务开支。立即访问 duoyun.io 了解详情。

需要专业云服务咨询?

我们的云架构师团队免费为你定制最优方案

免费咨询

相关文章

news

AWS reInvent 2025企业级重要发布

2026-04-23
news

2026年主权云与数据驻留法规

2026-04-23
optimization

AWS Spot实例批处理策略

2026-04-22