CloudFormation对象中如何正确使用ImportValue引用跨堆栈导出值
问题根因
配置不生效的核心问题:在!Sub包裹的字符串字面量内直接写{ Fn::ImportValue: ... }格式的固有函数声明,CloudFormation根本不会解析。!Sub的执行逻辑是仅识别、替换字符串内${}包裹的占位符,嵌在字符串内容里的固有函数JSON语法会被当成普通文本直接输出,最终传入参数的就是字面量文本{ Fn::ImportValue: xxx },完全拿不到跨栈导出的实际值。
另外原写法给ImportValue结构额外套了一层引号,就算语法层面能识别,最终输出也会带多余的大括号、引号,格式完全错误。
可用配置
直接用!Sub的双参数写法即可,把需要跨栈导入的值提前定义为模板变量,所有固有函数的解析会在变量替换阶段完成,不会出现嵌套不识别、转义错误的问题:
Input: !Sub - '{"InstanceId":["${TargetEc2Id}"],"AutomationAssumeRole":["${EC2AmazonSSMAutomationRole.Arn}"]}' - TargetEc2Id: !ImportValue !Sub "${ProjectName}-ec2-instance-id"
注意事项
!ImportValue原生支持搭配!Sub拼接动态导出名称,不需要把函数结构硬塞到JSON字符串里- 上述写法最终输出的Input是标准合法JSON字符串:
InstanceId数组内为实际导入的EC2实例ID,AutomationAssumeRole数组内为对应角色的ARN,完全匹配SSM Automation的参数格式要求 - 所有CloudFormation固有函数都不能直接写在
!Sub的字符串模板内部当文本处理,需要动态获取的值统一放到!Sub第二个参数的变量映射表中赋值
内容的提问来源于stack exchange,提问作者tuioku
相关产品推荐
相关产品推荐

