AWS Lambda 中 JavaScript 的高级 Serverless 函数

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

AWS Lambda 中 JavaScript 的高级 Serverless 函数:从理论到生产

基于 AWS Lambda 的 Serverless 架构已成为构建微服务和事件驱动系统的标准。如果您已经掌握了基本功能(来自 S3、API Gateway、DynamoDB 的触发器),那么是时候进入下一个级别了。在本文中,我们将探讨在 Node.js 上使用 AWS Lambda 的高级技术:冷启动优化、VPC 操作、层使用、合理的监控和调试。每个部分都附有实用的代码示例。



1. 冷启动优化

冷启动是 Serverless 函数性能的主要敌人。当 Lambda 函数一段时间未被使用时,AWS 会创建一个新容器,加载代码并初始化依赖项。这可能需要 200 毫秒到几秒钟。让我们看看如何最小化这种影响。



1.1. 使用全局作用域

处理程序外部的代码仅在创建容器时执行一次。将繁重操作移到那里:数据库连接、配置加载、SDK 初始化。

// ❌ 不好:每次调用都创建新连接exports.handler = async (event) => {  const AWS = require('aws-sdk');  const dynamoDB = new AWS.DynamoDB.DocumentClient();  // ...};

// ✅ 好:连接只创建一次const AWS = require('aws-sdk');const dynamoDB = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => { // 使用 dynamoDB};


1.2. 减小包大小

每个多余的模块都会增加加载时间。使用支持 tree-shaking 的 aws-sdk 版本 3,或仅导入所需的客户端:

// 代替完整 SDK:const { DynamoDBClient } = require('@aws-sdk/client-dynamodb');const { DynamoDBDocumentClient } = require('@aws-sdk/lib-dynamodb');


1.3. Provisioned Concurrency

对于延迟敏感的函数(例如,负载下的 API),启用 Provisioned Concurrency。这可确保指定数量的容器始终保持“热”状态。

// 通过 AWS CLI 的示例:aws lambda put-provisioned-concurrency-config \  --function-name my-function \  --qualifier PROD \  --provisioned-concurrent-executions 10


2. VPC 操作:安全与性能

当 Lambda 函数需要访问 VPC 内的资源(RDS、ElastiCache、私有 API)时,需要配置网络访问。但是,连接到 VPC 会因创建 ENI(弹性网络接口)而将冷启动时间增加 5-10 秒。



2.1. VPC 函数优化

  • 使用 VPC Endpoints 访问 AWS 服务(S3、DynamoDB、SQS)——这允许在不经过 NAT/Internet Gateway 的情况下访问它们。
  • 最小化子网数量——Lambda 在每个指定的子网中创建 ENI。限制为两个(不同的可用区)。
  • 缓存连接——如果函数连接到 RDS,请使用连接池(例如,PostgreSQL 的 pg-pool)。
const { Pool } = require('pg');

// 池在处理程序外部创建const pool = new Pool({ host: process.env.DB_HOST, database: 'mydb', max: 5, // 连接限制 idleTimeoutMillis: 30000,});

exports.handler = async (event) => { const client = await pool.connect(); try { const result = await client.query('SELECT NOW()'); return { statusCode: 200, body: result.rows }; } finally { client.release(); }};


2.2. VPC 和冷启动

如果冷启动至关重要,请考虑替代方案:

  • 使用 Aurora Serverless 或 DynamoDB 代替 RDS。
  • 将数据移至 ElastiCache (Redis) 并通过

博客

书籍推荐