如何实现网站接收数据触发AWS Lambda发邮件并备份到DynamoDB
解决方案
前置配置检查
- 为你的Lambda执行角色新增DynamoDB写入权限,开放
dynamodb:PutItem操作到你的Users表 - 确认你的DynamoDB
Users表的主键为id,如果主键名不同请同步修改后续代码里的Item字段
整合后完整代码
var AWS = require('aws-sdk'); // 统一配置区域 AWS.config.update({ region: "us-east-1" }); var ses = new AWS.SES(); var documentClient = new AWS.DynamoDB.DocumentClient(); var RECEIVER = 'contactus@example.com'; // 替换为你的收件邮箱 var SENDER = 'contactus@example.com'; // 替换为你的SES发件邮箱 var ALLOW_ORIGIN = 'example.com'; // 替换为你的网站域名 var response = { "isBase64Encoded": false, "headers": { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': ALLOW_ORIGIN}, "statusCode": 200, "body": "{\"result\": \"Success.\"}" }; exports.handler = async function (event, context) { console.log('Received event:', event); try { // 1. 发送邮件逻辑 await sendEmail(event); // 2. 写入DynamoDB逻辑 await saveToDynamo(event); // 两个操作都成功返回响应 return response; } catch (err) { console.error('操作失败:', err); return { ...response, statusCode: 500, body: JSON.stringify({result: 'Fail', error: err.message}) } } }; function sendEmail (event) { var params = { Destination: { ToAddresses: [RECEIVER] }, Message: { Body: { Text: { Data: 'name: ' + event.name + '\nphone: ' + event.phone + '\nemail: ' + event.email + '\ndesc: ' + event.desc, Charset: 'UTF-8' } }, Subject: { Data: 'Website Referral Form: ' + event.name, Charset: 'UTF-8' } }, Source: SENDER }; // 回调转promise方便await调用 return ses.sendEmail(params).promise(); } function saveToDynamo(event) { const params = { TableName: "Users", // 如果你的表名不同请修改 Item:{ // 生成唯一id避免主键冲突,不需要可以换成你自己的主键生成规则 id : Date.now() + Math.random().toString(36).substr(2), name: event.name, phone: event.phone, desc: event.desc, email: event.email } }; return documentClient.put(params).promise(); }
核心修改说明
- 统一使用async/await处理异步逻辑,避免原代码回调和async混用导致的时序问题,保证邮件发送和数据存储两个操作都执行完成后再返回响应
- DynamoDB的写入字段全部从表单提交的event对象中获取,替换原代码中写死的测试值
- 新增唯一主键生成逻辑,避免重复id导致的DynamoDB写入覆盖问题
- 增加统一错误捕获,出错时会返回具体错误信息方便排查
内容的提问来源于stack exchange,提问作者Nick Tran
相关产品推荐
相关产品推荐

