我正在创建一个AWS lambda函数,该函数应该定期备份S3上的AppSync API(由CloudWatch调度规则触发)。 它基于一个类,对于作为函数args(使用环境变量)传递的每个API,该API的每个元素都将运行备份作业。
如果仅使用节点运行它,那么它将正常工作。
但是,当我使用无服务器框架(serverless deploy
和serverless invoke local -f backup
)进行本地部署或测试时,无论我是否在处理程序函数的作用域内,执行都会在第一条异步指令处停止使用回调,Promise.then()或async / await语法。
我已经考虑过为备份操作的每个部分运行多个lambda函数,但是那样我会丢失共享上下文,这需要确保备份的每个部分都正确完成。
在handler.js
// for testing purposes
// works, waits 5 seconds and execute the rest of the code
console.log("here1");
await new Promise(resolve => setTimeout(resolve, 5000));
console.log("here2");
const allBackups = apiIds.map(apiId => new Backup(apiId));
allBackups.map(backup => backup.start());
结果=> here1
[等待5秒]
here2
但是,如果我调用一个使用异步代码的函数,例如start
类的Backup
方法(在所需的Backup.js
文件中),则会发生以下情况:< / p>
async start() {
try {
console.log("here3");
const data = await this.AppSync.getGraphqlApi({ apiId: this.apiId }).promise();
console.log("here4");
结果=> here1
[等待5秒]
here2
here3
执行结束
我具有所有必需的角色,并且无服务器报告在本地部署或调用时没有问题。
这是我的serverless.yml
文件:
service: [name]
provider:
name: aws
runtime: nodejs8.10
functions:
backup:
handler: handler.backup
environment:
[env variables, they are parsed properly]
timeout: 60
event:
schedule: [doesn't work as well, but it's not the issue here]
name: daily-appsync-backup
rate: cron(0 0 ** ? *)
enabled: false
role: [role]
预先感谢您的帮助!
答案 0 :(得分:0)
好,所以我找到了一个解决方案,我就是这样做的:
const allBackups = apiIds.map(apiId => new Backup(apiId));
await Promise.all(allBackups.map(async backup => backup.start()));
它不起作用,因为它到达了处理程序函数的末尾,并且不在乎是否有其他回调在等待。
(我还了解到,您可以await
一个async
函数,而不仅仅是一个Promise。)