我们正在无服务器框架之上运行更大的应用程序,并不断扩大我们的模块和用户群。我们所有的后端代码都位于单一存储库中,由 29 个无服务器服务(微服务)编译而成,由近 300 个 REST 和 WebSocket 端点组成。
我们正在 Github Actions 内进行部署,直到最近(过去几个月、几周)才出现任何问题。
不幸的是,我们的代码永远不会被调用,这使得我们自己的遥测系统也看不到错误。
当从 Github Actions“随机”执行
sls deploy
时,1 或 2 个函数似乎按照日志文件部署,但是当我们调用它们时,会记录 Cannot find module
错误。
错误与导入无关,我们可以从下面的堆栈跟踪中调查到它实际上是无服务器函数本身,在函数包中找不到。
2023-10-25T09:52:03.202Z undefined ERROR Uncaught Exception
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 's_putAnsweredQuestionnaire'\nRequire stack:\n- /var/runtime/UserFunction.js\n- /var/runtime/Runtime.js\n- /var/runtime/index.js",
"stack": [
"Runtime.ImportModuleError: Error: Cannot find module 's_putAnsweredQuestionnaire'",
"Require stack:",
"- /var/runtime/UserFunction.js",
"- /var/runtime/Runtime.js",
"- /var/runtime/index.js",
" at _loadUserApp (/var/runtime/UserFunction.js:225:13)",
" at Object.module.exports.load (/var/runtime/UserFunction.js:300:17)",
" at Object.<anonymous> (/var/runtime/index.js:43:34)",
" at Module._compile (internal/modules/cjs/loader.js:1114:14)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10)",
" at Module.load (internal/modules/cjs/loader.js:979:32)",
" at Function.Module._load (internal/modules/cjs/loader.js:819:12)",
" at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:75:12)",
" at internal/main/run_main_module.js:17:47"
]
}
详细信息和版本sls --version
Running "serverless" from node_modules
Framework Core: 3.22.0 (local) 3.21.0 (global)
Plugin: 6.2.2
SDK: 4.3.2
目标:node14
(静止)插件:
node14
。我们检查了什么
对于损坏的部署,CloudFormation 的日志不会显示任何错误。看起来堆栈的部署和平常一样。
从开发人员机器部署:如果我们专门从开发人员机器再次部署损坏的服务(检查标签和
sls deploy
以及正确的阶段参数等),它的工作率是 100%。这基本上就是我们现在所做的恢复程序。无服务器仪表板也不会显示受影响服务周围的任何失败部署。
问题
考虑到我们的应用程序的规模(30 个服务、300 个函数),我们是否会遇到 AWS 中一些我们不明显的限制?
我们可以在哪里继续寻找?
参考文献
3.38.0
版本并并行迁移到节点
16.20.0
来解决。这当然要求我们转向无服务器中的
nodejs16.x
目标。由于这些升级部署再次稳定。
不幸的是,由于我们的
nodejs18.x
依赖性,我们无法移动到
aws-sdk
目标。使用 Node 18 需要 AWS-SDKv3。