我是AWS和一般云技術的新手。因此,如果下面的用例是一個微不足道的用例,請原諒我。
好吧,我在 Amazon DynamoDB 中有一個表,我正在使用 exportTableToPointInTime API (ExportsToS3) 按計劃在每天早上 6 點將其匯出到 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函式?
到目前為止,我已經嘗試了一種強硬的方式來實作這一目標,但這無疑是低效的,因為它在那里進行了休眠,而且λ函式在整個匯出程序中都在運行,從而導致了成本的影響。
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))。
做 {
await sleep(60000); //每1分鐘等待一次,然后呼叫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: '事件'。
有效載荷。JSON.stringify({ 'ExportStatus': exportStatus })
};
await lambda.invoke(paramsForInvocation).promise()。
};
有什么辦法可以讓它變得更好,或者上述解決方案可以嗎?
謝謝!!
uj5u.com熱心網友回復:
對于一個await呼叫,你在處理程式上缺少 "async "關鍵字。 修改一下
exports.handler = (event) => {
改為
exports.handler = async event => {
由于這是一個await呼叫,你需要'async'關鍵字與之配合。
讓我知道它是否解決了你的問題。
此外,我懷疑你不需要.promise(),因為它可能已經在回傳promise。無論如何,請嘗試使用&;如果沒有它,仍然無法作業。
在呼叫 dynamoDB await 之后,你可以呼叫另一個 lambda。這將確保你的lambda在dynamoDb匯出呼叫完成后被呼叫。
要呼叫第二個lambda,
- 你可以使用 aws sdk invoke 包。
- 使用eventBridge的putEvent api. 。
較晚的選項更好,因為它解耦了兩個lambdas &;同時,第一個lambda不必等待秒級呼叫的完成。(減少了lambda的時間,從而降低了成本)
uj5u.com熱心網友回復:實作這一目標的一個選擇是定義一個等待者,以便等待從exportTableToPointInTime回傳 "已完成 "狀態。
據我所知,DynamoDB 已經有一些默認的等待者,但是沒有一個用于匯出的等待者,所以你需要自己撰寫(你可以使用那些已經存在的等待者作為例子)。
。這里可以找到一篇描述如何使用和撰寫服務員的好帖子。
。這樣一來,如果匯出的時間少于 15 分鐘,你就可以在 Lambda 的限制范圍內抓住它,而不需要二級 lambda。
如果需要的時間超過15分鐘,你將需要將其解耦,在這里你有多種選擇,正如@Schepo和@wahmd所建議的:
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325332.html
標籤:
