Serverless部署Lambda时Cognito环境变量被解析为对象报错
问题根因
- 资源引用解析失败:在
provider.environment块中直接使用CloudFormation原生!Ref语法引用resources.Resources下自定义的Cognito资源时,Serverless Framework不会自动解析该语法的返回值,而是将Ref对应的结构对象{ Ref: "资源逻辑ID" }直接注入Lambda环境变量。Node.js运行时对对象做隐式字符串转换时就会输出[object Object],不符合Cognito API对ID的字符串格式要求,直接触发参数校验报错。 - 区域配置错误:配置中
REGION: ca-central-1a是AWS可用区ID,不是Cognito服务要求的区域ID,就算ID解析正确也会因为区域参数不合法调用失败。
修复步骤
- 替换引用语法:将provider层环境变量中的
!Ref写法替换为Serverless Framework原生支持的资源引用格式${资源逻辑ID},框架会在部署阶段自动将其解析为对应的资源ID字符串。 - 修正区域参数:将错误的可用区ID替换为正确的区域值
ca-central-1。 - 修正后的provider配置参考:
provider: name: aws runtime: nodejs12.x environment: USER_POOL_ID: ${CognitoUserPool} CLIENT_ID: ${CognitoUserPoolClient} REGION: ca-central-1
- 本地调试兼容:如果使用Serverless Offline做本地调试,需将插件升级到6.0及以上版本,旧版本对resources块下自定义资源的引用存在解析bug;本地调试阶段也可以临时在本地.env文件中写入测试用的Cognito资源ID,云端部署时配置中的引用值会自动覆盖本地调试值。
- 重新执行
sls deploy完成部署后,可先到Lambda控制台核对环境变量值:正常User Pool ID格式为区域ID_随机字符串(例如ca-central-1_Abc123Xyz),User Pool Client ID为26位左右的字母数字组合字符串,确认值格式正确后再调用接口即可。
内容的提问来源于stack exchange,提问作者Sukh Gill
相关产品推荐
相关产品推荐

