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优惠、充值秒到账、官网下单享双重售后支持。不懂找他们就对了。