[AWS] Serverless Kinesis trigger Lambda and using ses to send email
Kinesis trigger Lambda flow
When kinesis stream receive order_placed
event then trigger Lambda which will call ses
(Simple Email Service) to send email.
serverless.yml
provider:
name: aws
runtime: nodejs12.x
lambdaHashingVersion: 20201221
apiGateway:
shouldStartNameWithService: true
iam:
role:
statements:
- Effect: Allow
Action:
- dynamodb:PutItem
- dynamodb:GetItem
Resource:
- arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/ordersTable
- Effect: Allow
Action:
- kinesis:PutRecord
Resource:
- arn:aws:kinesis:#{AWS::Region}:#{AWS::AccountId}:stream/order-events
- Effect: Allow
Action:
- ses:SendEmail
Resource:
- "*"
Condition:
StringEquals:
ses:FromAddress:
- <PROVIDER_EMAIL>
functions:
...
notifyCakeProducer:
handler: handler.notifyCakeProducer
events:
- stream:
arn: arn:aws:kinesis:#{AWS::Region}:#{AWS::AccountId}:stream/order-events
environment:
region: ${self.provider.region}
cakeProducerEmail: <....>
orderingSystemEmail: <....>
helper file:
Kinesis Record
is base64
format.
"use strict";
function parsePayload(record) {
const json = Buffer.from(record.kinesis.data, "base64").toString("utf8");
return JSON.parse(json);
}
module.exports.getRecords = (event) => {
return event.Records.map(parsePayload);
};
handler.js
module.exports.notifyCakeProducer = async (event) => {
const records = kinesisHelper.getRecords(event);
const ordersPlaced = records.filter((r) => r.eventType === "order_placed");
if (ordersPlaced <= 0) {
return "there is nothing";
}
return cakeProducerManager
.handlePlacedOrders(ordersPlaced)
.then(() => {
return "everything went well";
})
.catch((error) => {
return error;
});
};
cakeProducerManager.js
"use strict";
const AWS = require("aws-sdk");
const ses = new AWS.SES({
region: process.env.region,
});
const CAKE_PRODUCER_EMAIL = process.env.cakeProducerEmail;
const ORDERING_SYSTEM_EMAIL = process.env.orderingSystemEmail;
module.exports.handlePlacedOrders = (ordersPlaced) => {
var ordersPlacedPromises = [];
for (let order of ordersPlaced) {
const temp = notifyCakeProducerByEmail(order);
ordersPlacedPromises.push(temp);
}
return Promise.all(ordersPlacedPromises);
};
function notifyCakeProducerByEmail(order) {
const params = {
Destination: {
ToAddresses: [CAKE_PRODUCER_EMAIL],
},
Message: {
Body: {
Text: {
Data: JSON.stringify(order),
},
},
Subject: {
Data: "New cake order",
},
},
Source: ORDERING_SYSTEM_EMAIL,
};
return ses
.sendEmail(params)
.promise()
.then((data) => {
return data;
});
}
分类:
AWS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-03-03 [Cypress] Combine Custom Cypress Commands into a Single Custom Command
2020-03-03 [Unit Testing Angular] RxJS Marble testing for Component
2017-03-03 [Ramda] R.project -- Select a Subset of Properties from a Collection of Objects in Ramda
2017-03-03 [Ramda] Refactor a Promise Chain to Function Composition using Ramda
2016-03-03 [AngualrJS] Using Angular-Cache for caching http request
2015-03-03 [Javascript] Introduce to Webpack