在serverless.yml中用SSM设置logRetentionInDays遇整数类型错误求方案
解决Serverless.yml中SSM参数配置logRetentionInDays的类型问题
嘿,我来帮你搞定这个问题!你猜的完全没错——问题出在SSM参数被读取成了字符串类型,而logRetentionInDays要求必须是大于0的整数,所以才会抛出这个报错。下面给你几个可行的解决思路:
方法一:用CloudFormation内置函数强制转换类型
Serverless Framework支持直接在配置中使用CloudFormation的内置函数,其中!Int可以把字符串格式的数字转换成整数类型。你可以这样修改配置:
service: order-service provider: name: aws runtime: nodejs8.10 stage: ${opt:stage, 'dev'} # 假设你这里的stage配置是正常的 logRetentionInDays: !Int ${ssm:/${self:provider.stage}/order-service/log-retention}
⚠️ 注意:你的SSM参数值必须是纯数字字符串(比如"30"),不能包含引号、空格或其他非数字字符,否则转换会失败。
方法二:通过自定义变量+插件转换类型
如果CloudFormation的内置函数不好使,你可以借助Serverless插件来处理类型转换。比如使用serverless-plugin-utils插件:
- 先安装插件:
npm install serverless-plugin-utils --save-dev
- 然后修改
serverless.yml配置:
service: order-service plugins: - serverless-plugin-utils custom: # 先读取SSM参数到自定义变量 rawLogRetention: ${ssm:/${self:provider.stage}/order-service/log-retention} # 用插件把字符串转成整数 logRetentionInt: ${utils:int(${self:custom.rawLogRetention})} provider: name: aws runtime: nodejs8.10 stage: ${opt:stage, 'dev'} logRetentionInDays: ${self:custom.logRetentionInt}
额外验证步骤
在尝试上面的方法前,建议先做两个验证,排除其他问题:
- 先把
logRetentionInDays直接写成数字(比如30),确认服务能正常部署,排除其他配置错误。 - 登录AWS控制台查看你的SSM参数,确保参数值是纯数字,没有多余的格式字符。
内容的提问来源于stack exchange,提问作者Matti Simperi
相关产品推荐
相关产品推荐

