使用Serverless Compose跨栈传参报错:serverless-sequelize-migrations插件问题
问题:Serverless Compose栈间传参在迁移脚本中失效
我通过Serverless Compose在栈之间传递变量,部署Lambda时能正常读取到环境变量,但运行自定义脚本执行SQL迁移(使用serverless-sequelize-migrations插件)时出现错误,报错信息如下:
Cannot resolve serverless.yml: Variables resolution errored with: - Cannot resolve variable at "provider.environment.DB_PORT": The param "dbport" cannot be resolved from CLI options or stage params. If you are using Serverless Framework Compose, make sure to run commands via Compose so that all parameters can be resolved Error: Error: Command failed: serverless migrations down at checkExecSyncError (node:child_process:885:11) at execSync (node:child_process:957:15) at Scripts.execute (/Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless-plugin-scripts/lib/index.js:113:35) at Scripts.runHook (/Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless-plugin-scripts/lib/index.js:108:12) at PluginManager.runHooks (/Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless/lib/classes/plugin-manager.js:530:15) at runNextTicks (node:internal/process/task_queues:60:5) at process.processImmediate (node:internal/timers:447:9) at async PluginManager.invoke (/Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless/lib/classes/plugin-manager.js:564:9) at async PluginManager.run (/Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless/lib/classes/plugin-manager.js:604:7) at async Serverless.run (/Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless/lib/serverless.js:179:5) at async /Users/christoffer/Documents/code/konsult-gpt/node_modules/serverless/scripts/serverless.js:834:9
相关配置片段
serverless_compose.yml
services: service: path: service migration: path: migration params: dbport: ${service.port}
service/serverless.yml
resources: Outputs: port: Value: 3306
migration/serverless.yml
plugins: - serverless-sequelize-migrations - serverless-plugin-scripts Provider: environment: DB_PORT: ${param:dbport} functions: myLambda: handler: org.MyHandler memorySize: 2048 timeout: 20 custom: scripts: hooks: 'deploy:deploy': serverless migrations down
问题原因与解决方法
问题核心是:自定义脚本里直接调用serverless migrations down会启动独立的Serverless进程,脱离了Compose的上下文,无法获取到Compose传递的dbport参数。
解决步骤
- 修改迁移脚本的调用方式
将serverless migrations down替换为serverless compose run migration migrations down,让命令在Compose上下文内执行,确保参数能被正确解析。修改后的migration/serverless.yml脚本配置:
custom: scripts: hooks: 'deploy:deploy': serverless compose run migration migrations down
- 明确服务依赖顺序
在serverless_compose.yml中给migration服务添加dependsOn,确保service服务先部署完成,输出的port参数能被正常传递:
services: service: path: service migration: path: migration dependsOn: service params: dbport: ${service.port}
- 统一使用Compose命令部署
部署时必须用serverless compose deploy,而不是单独部署migration服务,保证Compose全程管理参数传递流程。
如果端口是固定值,也可以直接在migration/serverless.yml中硬编码DB_PORT: 3306,但通过Compose上下文调用是最贴合当前架构的解决方案。
内容的提问来源于stack exchange,提问作者user2270439
相关产品推荐
相关产品推荐

