1 背景
目前有一个报表功能,希望能定时扫描统计Dynamodb 数据库并在月初生成上月统计分析数据并填入统计结果表中。
所以看能不能写一个定时任务来处理。但分析了一下场景,实际上和web应用服务器并没有关系且不希望统计功能占用到应用服务器资源影响运行。
-
利用cloudwatch 来实现定时任务的触发。
-
利用Lambda函数实现读取数据库,统计整理数据,并回写数据的功能。
这里好处是就完成应用web服务器直接查询统计结果数据即可,不用参与较高复杂度的统计分析回写操作。而利用cloudwatch和lambda可以做到即用即抛,逻辑切割的比较简洁。
2 实现
上面的逻辑构造测试数据可能比较复杂。这里就抽象一个简单模型来验证这套逻辑是否可行。
利用cloudwatch 产生一个5分钟一次的触发器,触发AWS lambda函数。而lambda函数的功能是去请求github服务器。并将测试结果存入到Dynamodb数据库中。这样就可以从Dynamodb表中拿到一个以5分钟为频率的的网络测试数据。
所需资源:本次lambda脚本采用nodejs编写
需要新建一个EC2NetTest的表,分区键为time(string)
2.1 编写AWS Lambda
进入lambd控制台-点击右上角创建函数
上传lambda函数,函数功能访问github,并记录访问耗并写入名为EC2NetTest 的Dynamodb表中。
关于函数依赖:部署程序包
如果您使用 Lambda 控制台编辑器编写您的函数,则控制台会管理部署程序包。如果您不需要添加任何库,则可以使用此方法。您也可以使用此方法更新在部署程序包中已经存在库的函数,前提是总大小不超过 3 MB。
如果您的函数依赖于 SDK for JavaScript 之外的库,请使用 npm 将它们包含在您的部署包中。确保本地环境中的 Node.js 版本与函数的 Node.js 版本相匹配
1 基于我们上面的描述我们填入代码/部署/测试
2 Lambda函数代码:
const DynamoDB = require('aws-sdk').DynamoDB;
const config = { region: 'cn-northwest-1' };
const client = new DynamoDB(config);
const docClient = new DynamoDB.DocumentClient(config, client);
const https = require('https')
exports.handler = function(event, context, callback) {
const startTime = new Date();
https.get('https://github.com', (res) => {
const endTime = new Date();
console.info(res.statusCode)
const costTimeMs = endTime.getTime() - startTime.getTime();
console.log(costTimeMs);
const params = {Item: {time: endTime.toISOString(), cost: costTimeMs, timestamp: endTime.getTime()}, TableName: 'EC2NetTest'};
docClient.put(params, (err, data) => {
if (err) {
console.error(err);
}
})
}).on('error', (e) => {
console.error(e);
}).on('end', () => {
console.info('end');
})
}
3 配置Lambda操作角色相应Dynamodb 数据表操作权限,点击进入角色。并在该角色详情界面->进入对应的自动创建的策略的详情界面->点击编辑策略
4 为该策略添加相应的Dynamodb表Put权限。保存更改。这样Lambda所需要的权限就都已经配置好了。
5 在Lambda创建对应测试事件,点击测试
到这里我们就实现了一个简单的lambda函数,实现了发请http请求并写数据库的操作。
2.2 使用cloudwatch event定时触发lambda
创建cloud watch 规则
编辑cloudwatch 规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rHWp0mGw-1607588257592)(C:\Users\jw.li\AppData\Roaming\Typora\typora-user-images\image-20201210140118950.png)]
左边编写触发规则。选择计划,使用cron表达式 0/5 * * * ? * 为每5分钟触发一次 。关于表达式文档 可以找到cron表达式写法
右边编写触发目标 选择lambda表达式,选择我们之前编写好的lambda函数即可。点击配置 并填写对应的规则名
3 结果
3.1 测试现象
3.2 关于月度报表统计功能
在上面文档中,我们测试了lambda 操作Dynamdb 数据库。所以这里我们可以通过配置lambda相应操作权限,操作对应的数据源数据库。然后再lambda中进行处理统计,处理完成后。写入到我们的结果表中。
而如何触发统计呢? 我们这里可以更改3中的cron计划表达式 。每月一号早上1点触发(UTC)
0 1 1 * ? *
这样就可以触发对应统计功能
ambda中进行处理统计,处理完成后。写入到我们的结果表中。
而如何触发统计呢? 我们这里可以更改3中的cron计划表达式 。每月一号早上1点触发(UTC)
0 1 1 * ? *
这样就可以触发对应统计功能