【发布时间】:2021-11-14 10:23:25
【问题描述】:
总的来说,我是 AWS 和云技术的新手。所以,如果下面的用例是微不足道的,请多多包涵。
嗯,我在 Amazon DynamoDB 中有一个表,我每天早上 6 点使用 exportTableToPointInTime API (ExportsToS3) 将其导出到 Amazon S3。正在以这种方式使用 AWS Lambda 函数完成 -
const AWS = require("aws-sdk");
exports.handler = async (event) => {
const dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
const tableParams = {
S3Bucket: '<s3-bucket-name>',
TableArn: '<DynamoDB-Table-ARN>',
ExportFormat: 'DYNAMODB_JSON'
};
await dynamodb.exportTableToPointInTime(tableParams).promise();
};
AWS Lambda 函数的 CFT 模板负责创建 lambda 角色和策略等,以及使用 Cloudwatch 事件进行调度。此设置有效,并且表每天在预定时间导出到目标 Amazon S3 存储桶。
现在,我想要的下一件事是,在导出到 Amazon S3 完成后,我应该能够调用另一个 lambda 函数并将导出状态传递给该 lambda 函数,该函数对其进行一些处理。
我面临的问题是,上面的 lambda 函数几乎立即完成执行,exportTableToPointInTime 调用返回状态为 IN_PROGRESS。
我尝试捕获上述调用的响应,例如 -
const exportResponse = await dynamodb.exportTableToPointInTime(tableParams).promise();
console.log(exportResponse);
这个的输出是 -
{
"ExportDescription": {
"ExportArn": "****",
"ExportStatus": "IN_PROGRESS",
"StartTime": "2021-09-20T16:51:52.147000+05:30",
"TableArn": "****",
"TableId": "****",
"ExportTime": "2021-09-20T16:51:52.147000+05:30",
"ClientToken": "****",
"S3Bucket": "****",
"S3SseAlgorithm": "AES256",
"ExportFormat": "DYNAMODB_JSON"
}
}
我只是用 **** 混淆了日志中的一些值
可以看出,exportTableToPointInTime API 调用不会等待表完全导出。如果有,它会将 ExportStatus 返回为 COMPLETED 或 FAILED。
有没有一种方法可以设计上述用例来实现我的要求 - 仅在导出实际完成时调用另一个 lambda 函数?
到目前为止,我已经尝试了一种蛮力的方法来做到这一点并且可行,但它肯定似乎效率低下,因为它在那里进入睡眠状态,并且 lambda 函数在导出的整个期间都在运行,导致成本影响。
exports.handler = async (event) => {
const dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
const tableParams = {
S3Bucket: '<s3-bucket-name>',
TableArn: '<DynamoDB-Table-ARN>',
ExportFormat: 'DYNAMODB_JSON'
};
const exportResponse = await dynamodb.exportTableToPointInTime(tableParams).promise();
const exportArn = exportResponse.ExportDescription.ExportArn;
let exportStatus = exportResponse.ExportDescription.ExportStatus;
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
do {
await sleep(60000); //waiting every 1 min and then calling listExports API
const listExports = await dynamodb.listExports().promise();
const filteredExports = listExports.ExportSummaries.filter(e => e.ExportArn == exportArn);
const currentExport = filteredExports[0];
exportStatus = currentExport.ExportStatus;
}
while (exportStatus == 'IN_PROGRESS');
var lambda = new AWS.Lambda();
var paramsForInvocation = {
FunctionName: 'another-lambda-function',
InvocationType: 'Event',
Payload: JSON.stringify({ 'ExportStatus': exportStatus })
};
await lambda.invoke(paramsForInvocation).promise();
};
可以做些什么来改善它或者上面的解决方案可以吗?
谢谢!!
【问题讨论】:
-
您可以让您的第二个 Lambda 函数由 this example 中的 S3 事件触发吗? S3 事件只会在 S3 文件创建完成时触发
-
如果由于某种原因导出到 s3 API 失败怎么办?我猜在那种情况下它不会创建 S3 文件,对吧?
标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb