CloudFormation配置Lambda VpcConfig报类型校验错误如何解决
问题根因
报错核心是VpcConfig配置段的两个字段类型不符合要求,同时存在CloudFormation内置函数的语法错误:
SecurityGroupIds和SubnetIds字段强制要求传入*字符串数组(JSONArray)*格式,哪怕只绑定1个安全组/子网,也必须用列表结构传值,当前写法直接传入了单个字符串值,触发类型校验失败- 现有配置存在多处语法问题:
- YAML键值对缺空格:
Type:String不符合YAML语法,键和值之间必须加空格 - 内置函数名拼写错误:
!importValue首字母未大写,正确短函数名为!ImportValue Fn::Sub、!ImportValue的传参格式错误:!ImportValue直接接收要导入的导出值名称作为参数,不能写成'fn::sub': xxx的键值对对象格式,多个子网ID也不能直接堆在!ImportValue层级下
- YAML键值对缺空格:
修正方案
1. 修正Parameters段配置
补全YAML必要的空格,调整参数语义明确为「对应资源的CloudFormation导出值名称」:
Parameters: SecurityGroupIdExportName: Description: VPC安全组ID对应的跨栈导出值名称 Type: String Default: 'sg-importkey' SubnetId1ExportName: Description: 第一个可用区子网ID对应的跨栈导出值名称 Type: String Default: 'sb1-importkey' SubnetId2ExportName: Description: 第二个可用区子网ID对应的跨栈导出值名称 Type: String Default: 'sb2-importkey'
2. 修正VpcConfig配置段
将安全组、子网ID都改为列表格式传入,每个资源值单独用!ImportValue导入后作为列表项:
VpcConfig: SecurityGroupIds: - !ImportValue !Ref SecurityGroupIdExportName SubnetIds: - !ImportValue !Ref SubnetId1ExportName - !ImportValue !Ref SubnetId2ExportName
额外注意事项
- 如果跨栈导出名称是固定值不需要动态传入,可以省略Parameters定义,直接在
!ImportValue后写死导出名称即可,例如- !ImportValue sg-importkey - 后续如果需要绑定更多安全组、子网,只需要在对应列表下新增列表项,单独导入对应资源ID即可
- 配置Lambda VPC访问公网时,记得确保绑定的子网有指向NAT网关的默认路由,否则Lambda依然无法访问公网
内容的提问来源于stack exchange,提问作者user3143361
相关产品推荐
相关产品推荐

