引言:什么是 Serverless 和 AWS Lambda?
\n\nServerless(无服务器计算)是一种云计算模型,开发者完全无需管理服务器基础设施。您只需编写代码,将其上传到云端,提供商(AWS、Google Cloud、Azure)会根据事件自动运行代码,并按需扩展资源。您只需为代码的实际执行时间(和请求次数)付费。
\n\nAWS Lambda 是 Amazon Web Services 旗下的旗舰无服务器服务。它允许您使用多种语言运行代码,包括 JavaScript (Node.js),而无需配置和管理服务器。Lambda 非常适合处理 HTTP 请求(通过 API Gateway)、后台任务、处理来自 S3 的文件、响应 DynamoDB 数据库中的更改以及许多其他场景。
\n\n在本文中,我们将从 A 到 Z 全面解析基于 JavaScript 的 AWS Lambda:从创建第一个函数到部署、监控和优化。
\n\n主体部分:创建和管理基于 Node.js 的 Lambda 函数
\n\n1. 创建第一个 Lambda 函数
\n\n进入 AWS Lambda 控制台,点击“创建函数”。选择“从头开始”选项。指定一个名称(例如 my-first-lambda),并选择运行时环境 Node.js 20.x(或最新的稳定版本)。
Node.js 函数的基本结构如下:
\n\nexports.handler = async (event, context) => {\n // event - 传递给函数的数据(例如 HTTP 请求)\n // context - 运行时环境信息(例如请求 ID)\n\n console.log('收到事件:', JSON.stringify(event, null, 2));\n\n // 您的业务逻辑\n const response = {\n statusCode: 200,\n body: JSON.stringify({\n message: '来自 Lambda 的问候!',\n input: event\n }),\n };\n\n return response; // AWS Lambda 期望返回值\n};\n\n\n在这个简单示例中,函数接收一个事件并返回一个 JSON 响应。如果函数通过 API Gateway 调用,event 将包含 HTTP 方法、请求头、请求体等。
重要提示: 始终使用 async/await 处理异步操作(数据库查询、API 调用)。如果函数不是异步的,它必须返回一个 Promise 或使用回调函数。
2. 触发器和集成
\n\nLambda 的强大之处在于 触发器——来自其他 AWS 服务的事件,用于触发您的函数。我们来看三个最流行的基于 JavaScript 的选项。
\n\n2.1. 通过 API Gateway 处理 HTTP 请求
\n这是创建 REST API 最常见的场景。您将 API Gateway 触发器附加到 Lambda。在这种情况下,event 将包含 HTTP 请求的结构。处理示例:
exports.handler = async (event) => {\n const httpMethod = event.httpMethod;\n const path = event.path;\n const queryParams = event.queryStringParameters || {};\n const body = event.body ? JSON.parse(event.body) : {};\n\n console.log(`方法:${httpMethod},路径:${path}`);\n\n if (httpMethod === 'GET' && path === '/hello') {\n return {\n statusCode: 200,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: `你好,${queryParams.name || '世界'}!` })\n };\n }\n\n return {\n statusCode: 404,\n body: JSON.stringify({ error: 'Not Found' })\n };\n};\n\n\n2.2. 处理来自 S3 的文件
\nLambda 可以在 S3 存储桶中上传或删除文件时自动触发。这非常适合创建图像缩略图、转换视频或索引数据。
\n\nconst AWS = require('aws-sdk');\nconst s3 = new AWS.S3();\n\nexports.handler = async (e