AWS CloudFormation中Fn::ImportValue+!Sub无法找到导出值问题
关键排查点:确保导入侧变量替换后的值与导出名称完全一致
已知导出的实际名称是Stack-02-Schwartz-us-east-2b-PublicSubnetB-AZ,对应导出侧的模板变量是${AWS::StackName}-${OwnerID}-${PublicAvailabilityZoneB}-PublicSubnetB-AZ,导入侧用的是${NetworkStackParameter}-${OwnerID}-${PublicAvailabilityZoneB}-PublicSubnetB-AZ,按以下步骤逐一排查:
核对NetworkStackParameter的实际传入值
这个参数必须完全等于VPC栈的栈名Stack-02,注意大小写、拼写和空格——CloudFormation对导出名称的匹配是严格大小写敏感的,哪怕一个字母大小写错了都匹配不上。检查EC2栈部署时该参数的输入值是否准确。验证OwnerID变量在两个栈中的一致性
导出侧的OwnerID是Schwartz,确认EC2栈里的OwnerID参数/变量值完全相同,有没有拼写错误、多余字符或者格式问题(比如带了不必要的引号)。检查PublicAvailabilityZoneB的取值
导出侧的该变量值是us-east-2b,确认EC2栈里的对应变量有没有写成us-east-2(少了后缀b)或者大小写错误,可用区格式必须完全一致。确认导入侧的Sub语法嵌套正确
不管是YAML还是JSON格式,要保证Sub和ImportValue的嵌套写法正确:
YAML正确示例:BastionInstance: Type: AWS::EC2::Instance Properties: AvailabilityZone: !ImportValue !Sub "${NetworkStackParameter}-${OwnerID}-${PublicAvailabilityZoneB}-PublicSubnetB-AZ"JSON正确示例:
"BastionInstance": { "Type": "AWS::EC2::Instance", "Properties": { "AvailabilityZone": { "Fn::ImportValue": { "Fn::Sub": "${NetworkStackParameter}-${OwnerID}-${PublicAvailabilityZoneB}-PublicSubnetB-AZ" } } } }注意YAML里的字符串要加双引号包裹,避免变量解析异常。
确认两个栈在同一AWS区域
CloudFormation导出值是区域级资源,VPC栈和EC2栈必须部署在同一个区域(比如us-east-2),跨区域无法导入。检查VPC栈的导出状态
确认VPC栈状态是CREATE_COMPLETE或UPDATE_COMPLETE,并且在AWS控制台的CloudFormation导出页面能看到目标导出名称存在。如果VPC栈部署失败,导出值不会被创建。
内容的提问来源于stack exchange,提问作者James

