CloudFormation模板部署EKS集群时List类型参数使用!Sub函数报错的问题求助
解决CloudFormation EKS模板中的Fn::Sub ValidationError问题
你遇到的这个ValidationError确实是因为错误使用了!Sub函数,咱们来一步步拆解原因和修复方案:
错误根源
你的ListOfSecurityGroupIDs和ListOfSubnetIDs参数定义的是List类型(List<AWS::EC2::SecurityGroup::Id>和List<AWS::EC2::Subnet::Id>),本质是数组。而!Sub(即Fn::Sub)的核心作用是替换字符串中的变量,它只能处理字符串类型的输入,无法直接解析数组。当你在SecurityGroupIds和SubnetIds里用!Sub ${ListOfSecurityGroupIDs}时,CloudFormation尝试把数组强制转换成字符串,自然就触发了验证错误。
排查思路
- 核对参数类型与函数兼容性:先明确每个参数的类型,再检查你使用的CloudFormation函数是否支持该类型。比如List类型的参数不能直接传给
!Sub,因为!Sub只认字符串。 - 查看资源属性的要求:
AWS::EKS::Cluster的ResourcesVpcConfig属性中,SecurityGroupIds和SubnetIds本身就支持接收List类型的输入,完全不需要额外转换。
修复后的模板
把模板中ResourcesVpcConfig部分的代码修改为直接引用参数即可:
Resources: EKSCluster: Type: AWS::EKS::Cluster Properties: Name: !Sub ${ClusterName} Version: !Sub ${ClusterVersion} RoleArn: !Sub ${RoleArnValue} ResourcesVpcConfig: SecurityGroupIds: !Ref ListOfSecurityGroupIDs SubnetIds: !Ref ListOfSubnetIDs
这里用!Ref来引用List类型的参数,它会直接返回整个数组,完美匹配EKS集群对这两个属性的要求。
另外,模板中Name、Version、RoleArn的!Sub用法是没问题的,因为这些参数都是字符串/数字类型,!Sub可以正常处理。
验证注意点
你原来的AWS CLI部署命令不需要做任何修改,因为List类型的参数用逗号分隔多个值的传递格式是正确的,修复后的模板可以直接接收这些参数。
内容的提问来源于stack exchange,提问作者Unknowntiou
相关产品推荐
相关产品推荐

