嵌套CloudFormation构建EKS集群:子集群模板无法识别IAMRoleARN参数问题求助
看起来你遇到的是嵌套CloudFormation栈传参时的典型配置疏漏,我帮你梳理几个最可能的原因和排查步骤:
严格核对参数名称的大小写与拼写
CloudFormation的参数名称是大小写敏感的。虽然你的代码里写的是IAMRoleARN,但要仔细比对集群子栈的Parameters定义、父栈传参的键名,确保完全一致——哪怕是把IAMRoleARN写成IamRoleArn这种细微的大小写差异,都会导致系统识别不到参数。确认集群子栈模板是最新版本
既然你明确在集群子栈里定义了IAMRoleARN参数,首先要验证父栈引用的S3桶里的模板是不是修改后的最新版本。很多时候我们更新了本地模板,但忘记同步到S3,导致父栈调用的还是没有该参数的旧模板。可以直接打开S3中的模板文件,检查Parameters区块是否确实包含IAMRoleARN的定义。验证嵌套栈输出的引用逻辑
你用Fn::GetAtt获取IAM栈输出的写法是正确的,但可以额外确认下IAM栈的输出键名是不是ClusterRoleArn——如果IAM栈的Outputs里写的是其他名称(比如ClusterRoleARN),那父栈里的Outputs.ClusterRoleArn会获取不到值,不过这类错误通常提示输出不存在,而非参数不存在,顺手核对下更稳妥。确保集群子栈的参数定义在顶层
检查你的集群子栈模板,确认Parameters是模板的顶级元素,和Resources、Outputs同级。如果不小心把Parameters嵌套到了Resources或者其他区块里,CloudFormation会忽略这个定义,自然会认为参数不存在。正确的结构应该是:AWSTemplateFormatVersion: "2010-09-09" Parameters: IAMRoleARN: Type: String Description: ARN of the IAM role created for the cluster in the EKS IAM stack # 其他参数... Resources: Cluster: Type: "AWS::EKS::Cluster" Properties: # 资源配置...用硬编码值做测试排查
可以临时把父栈里的IAMRoleARN参数值换成一个有效的IAM角色ARN(比如从IAM控制台复制一个),然后重新部署父栈。如果这样集群子栈能正常创建,说明问题出在父栈获取IAM栈输出的环节;如果还是报同样的错误,那肯定是集群子栈模板本身的参数定义有问题。
按照这些步骤排查,应该能很快定位到问题所在。
内容的提问来源于stack exchange,提问作者Kevin Homan

