AWS Lambda运行for循环仅执行3次即终止,迁移自Heroku无报错日志
故障根因及修复方案
1. 最可能原因:AWS Lambda 超时触发强制终止
AWS Lambda默认超时时间为3秒,你的逻辑每次循环需要串行调用2次GitHub API,三次循环的总耗时刚好触碰到超时阈值,函数会被AWS后台直接强制杀掉,不会触发代码内的catch逻辑,也会出现日志未完全上报的情况。
- 修复方法:在Serverless Framework的
serverless.yml对应函数配置项中添加timeout: 30(单位为秒,最长可配置为900秒),预留足够的执行时间。
2. 循环变量声明漏洞
代码中for循环的i没有显式声明,属于隐式全局变量,异步执行场景下可能出现变量值被篡改的异常,将循环声明修改为:
for (let i = 0; i < files.data.length; i++) {
3. 异常捕获范围不全
当前try/catch仅包裹了createOrUpdateFileContents的调用逻辑,getFileContent调用未做异常捕获,如果该接口请求报错,会直接抛出未捕获异常终止函数执行,且可能出现日志打印不全的问题。建议将整个循环体逻辑移入try/catch中:
const workFlow = async (context) => { console.log("Getting files") let files = await context.octokit.repos.getContent({ owner: context.payload.repository.owner.login, repo: context.payload.repository.name, path: ".bit/workflows" }); console.log(files) console.log(files.data.length); for (let i = 0; i < files.data.length; i++) { try { let body = await data.getFileContent(context, `.bit/workflows/${files.data[i].name}`) body = body[0].data.content console.log("Getting file " + i) console.log(files.data[i]) await context.octokit.repos.createOrUpdateFileContents({ owner: context.payload.repository.owner.login, repo: context.payload.repository.name, path: `.github/workflows/${files.data[i].name}`, message: "Start workflows", content: body, committer: { name: `NAME`, email: "EMAIL", }, author: { name: `NAME`, email: "EMAIL", }, }) console.log("Got workfow files"); } catch (e) { console.log("Error in processing file index " + i) console.log(e) } } }
4. 可选优化项
- 调整Lambda内存配置:Lambda的内存大小和分配的CPU算力、网络带宽正相关,默认128MB的配置下接口请求耗时更高,可适当上调至256MB或更高,降低整体执行耗时。
- 增加耗时日志:在循环首尾增加耗时打印,可快速定位是否是GitHub API延迟过高导致的执行超时。
内容的提问来源于stack exchange,提问作者Ganning Xu
相关产品推荐
相关产品推荐

