【发布时间】:2019-05-03 20:40:24
【问题描述】:
我正在创建一个 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());
结果 => 这里1
[5秒等待]
这里2
但是,如果我调用使用异步代码的函数,例如Backup 类的start 方法(在所需的Backup.js 文件中),则会发生以下情况:
async start() {
try {
console.log("here3");
const data = await this.AppSync.getGraphqlApi({ apiId: this.apiId }).promise();
console.log("here4");
结果 => 这里1
[5秒等待]
这里2
这里3
执行结束
我拥有所有必需的角色,并且在本地部署或调用时无服务器报告没有问题。
这是我的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]
提前感谢您的帮助!
【问题讨论】:
-
能否请您在 start() 函数中发布 catch() 部分?会不会是this.AppSync.getGraphqlApi()抛出了一个已经被捕获但没有打印出来的异常?
标签: node.js async-await aws-lambda serverless-framework