AWS云原生开发实践,用Lambda、API Gateway和DynamoDB构建无服务器应用
无服务器架构是云原生的终极形态之一。开发者只需编写业务逻辑代码,剩下的扩容、高可用、安全补丁都由云平台负责。AWS的无服务器栈由Lambda(计算)、API Gateway(API管理)、DynamoDB(数据库)等组成,可以构建从简单API到复杂工作流的各种应用。本文将带你从零开始,构建一个完整的无服务器应用。
一、理解无服务器架构
1.1 什么是无服务器?
无服务器并不是没有服务器,而是开发者不需要关心服务器。AWS负责运行代码的基础设施,并按实际执行时间收费。当没有请求时,你的代码不会运行,也不会产生费用。
1.2 无服务器架构的组件
一个典型的无服务器应用由以下部分组成:
计算层:Lambda函数执行业务逻辑
API层:API Gateway暴露HTTP端点,触发Lambda
存储层:DynamoDB存储持久化数据
事件源:S3、SQS、EventBridge等触发Lambda
1.3 无服务器的优势
零运维:不需要管理操作系统、运行时、补丁
自动扩缩:从零到百万并发,自动处理
按需计费:只为实际执行付费,空闲时零成本
快速迭代:小函数独立部署,风险隔离
二、构建一个无服务器应用:待办事项服务
2.1 设计数据模型
在DynamoDB中创建一张表,名为“todos”。主键设计:
分区键:userId(String)
排序键:todoId(String)
这样设计可以快速查询某个用户的所有待办事项。
2.2 编写Lambda函数
使用Node.js编写CRUD函数。
创建待办事项:
javascript
复制下载
const AWS = require('aws-sdk');const dynamodb = new AWS.DynamoDB.DocumentClient();const { v4: uuidv4 } = require('uuid');exports.handler = async (event) => { const { userId, title } = JSON.parse(event.body); const todoId = uuidv4(); const createdAt = new Date().toISOString(); const params = { TableName: process.env.TABLE_NAME, Item: { userId, todoId, title, completed: false, createdAt } }; await dynamodb.put(params).promise(); return { statusCode: 201, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify({ todoId, title, completed: false }) };};
查询待办事项:
javascript
复制下载
exports.handler = async (event) => { const userId = event.queryStringParameters.userId; const params = { TableName: process.env.TABLE_NAME, KeyConditionExpression: 'userId = :userId', ExpressionAttributeValues: { ':userId': userId } }; const result = await dynamodb.query(params).promise(); return { statusCode: 200, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify(result.Items) };};
2.3 创建API Gateway
创建REST API,选择“新建API”
创建资源“/todos”
为资源添加方法:
POST:集成类型选择Lambda函数,指向创建函数
GET:集成类型选择Lambda函数,指向查询函数
启用CORS,允许前端跨域访问
部署API到某个阶段(如“prod”),获取调用URL
2.4 配置IAM权限
Lambda函数需要执行权限:写入CloudWatch Logs,读取和写入DynamoDB表。创建一个执行角色,附加以下策略:
AWSLambdaBasicExecutionRole(允许写入日志)
自定义策略,允许对DynamoDB表的读写操作
三、添加异步处理
3.1 使用EventBridge触发
当用户创建待办事项时,可能需要发送邮件通知或进行其他后台处理。可以用EventBridge解耦这些操作。
在创建待办事项的Lambda函数中,添加EventBridge事件发送代码:
javascript
复制下载
const eventbridge = new AWS.EventBridge();await eventbridge.putEvents({ Entries: [{ Source: 'todo.app', DetailType: 'TodoCreated', Detail: JSON.stringify({ userId, todoId, title }), EventBusName: 'default' }]}).promise();
3.2 创建事件消费者
创建另一个Lambda函数,订阅EventBridge事件,处理邮件发送等操作:
javascript
复制下载
exports.handler = async (event) => { for (const record of event['detail']) { const { userId, todoId, title } = JSON.parse(record.Detail); // 发送邮件、更新统计等 console.log(`Processing todo ${todoId} for user ${userId}`); }};
四、处理复杂工作流
4.1 使用Step Functions
对于涉及多个步骤、需要错误处理和重试的工作流,可以使用Step Functions。例如,创建一个待办事项后的处理流程:
验证输入数据
写入数据库
发送通知
更新用户统计
Step Functions可以定义每个步骤的重试策略和错误捕获路径。
4.2 定义状态机
json
复制下载
{ "StartAt": "ValidateInput", "States": { "ValidateInput": { "Type": "Task", "Resource": "arn:aws:lambda:validate", "Next": "WriteToDatabase" }, "WriteToDatabase": { "Type": "Task", "Resource": "arn:aws:lambda:write", "Next": "SendNotification", "Retry": [ { "ErrorEquals": ["DynamoDBException"], "IntervalSeconds": 2, "MaxAttempts": 3, "BackoffRate": 2 } ] }, "SendNotification": { "Type": "Task", "Resource": "arn:aws:lambda:send", "End": true } }}
五、监控与调试
5.1 CloudWatch Logs
每个Lambda函数的日志会自动写入CloudWatch Logs。可以在控制台查看日志,或使用Logs Insights查询:
text
复制下载
fields @timestamp, @message| filter @message like /ERROR/| sort @timestamp desc| limit 20
5.2 X-Ray追踪
启用X-Ray可以追踪请求在API Gateway、Lambda、DynamoDB之间的流转,可视化整个调用链,帮助定位性能瓶颈。
javascript
复制下载
const AWSXRay = require('aws-xray-sdk-core');const AWS = AWSXRay.captureAWS(require('aws-sdk'));
5.3 CloudWatch Metrics
Lambda自动上报调用次数、错误次数、持续时间等指标。可以设置CloudWatch告警,当错误率超过阈值时通知团队。
六、结语
无服务器架构让开发者可以专注于业务逻辑,而不是基础设施。通过Lambda、API Gateway、DynamoDB的组合,你可以快速构建弹性、可扩展、低成本的现代应用。随着业务增长,你可以逐步引入EventBridge、Step Functions等高级服务,处理更复杂的场景。无服务器不是银弹,但对于大多数Web应用、API后端、数据处理任务,它是最简单、最经济的选择。
如果需要更深入咨询了解可以联系全球代理上TG:@jinniuge 他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。不懂找他们就对了。
