CloudFormation输出数组报错,寻求跨嵌套栈共享端点解决方案
解决CloudFormation输出Network Firewall EndpointIds数组的格式错误及跨栈共享方法
错误提示
Template format error: Every Value member must be a string的核心原因是:CloudFormation的Outputs中Value字段必须为字符串类型,而!GetAtt NetFw.EndpointIds返回的是数组类型,不符合格式要求。
以下是三种可行的解决方法,适配不同的跨栈共享场景:
方法1:数组转字符串输出,导入后还原为数组
用!Join将端点ID数组转为逗号分隔的字符串输出,其他栈导入后再用!Split还原为数组。
修改后的输出模板
Outputs: NetFwEndpointIds: Description: 逗号分隔的Network FW端点ID字符串 Value: !Join [",", !GetAtt NetFw.EndpointIds] Export: Name: !Sub '${AWS::StackName}-EndpointIds'
依赖栈中使用示例
Parameters: FirewallStackName: Type: String Resources: # 示例资源,使用还原后的端点ID数组 ExampleResource: Type: AWS::Some::Resource Properties: EndpointIds: !Split [",", !ImportValue !Sub '${FirewallStackName}-EndpointIds']
方法2:逐个输出单个端点ID(适用于子网数量固定的场景)
如果Network Firewall关联的子网数量固定,可以用!Select逐个提取数组元素并输出,依赖栈分别导入后再组合成数组。
修改后的输出模板
Outputs: NetFwEndpointId1: Description: 第一个Network FW端点ID Value: !Select [0, !GetAtt NetFw.EndpointIds] Export: Name: !Sub '${AWS::StackName}-EndpointId1' NetFwEndpointId2: Description: 第二个Network FW端点ID Value: !Select [1, !GetAtt NetFw.EndpointIds] Export: Name: !Sub '${AWS::StackName}-EndpointId2' NetFwEndpointId3: Description: 第三个Network FW端点ID Value: !Select [2, !GetAtt NetFw.EndpointIds] Export: Name: !Sub '${AWS::StackName}-EndpointId3'
依赖栈中使用示例
Parameters: FirewallStackName: Type: String Resources: ExampleResource: Type: AWS::Some::Resource Properties: EndpointIds: - !ImportValue !Sub '${FirewallStackName}-EndpointId1' - !ImportValue !Sub '${FirewallStackName}-EndpointId2' - !ImportValue !Sub '${FirewallStackName}-EndpointId3'
方法3:嵌套栈直接传递参数(替代Export/Import)
如果是嵌套栈架构,无需使用Export,直接在父栈中获取数组并转为字符串后传递给子栈参数,子栈再还原为数组。
父栈模板示例
Resources: NetFwStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./network-firewall.yaml DependentStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./dependent-resource.yaml Parameters: FirewallEndpointIds: !Join [",", !GetAtt NetFwStack.Outputs.NetFwEndpointIds]
子栈模板(dependent-resource.yaml)示例
Parameters: FirewallEndpointIds: Type: String Resources: ExampleResource: Type: AWS::Some::Resource Properties: EndpointIds: !Split [",", !Ref FirewallEndpointIds]
内容的提问来源于stack exchange,提问作者NotADevOpsEngineer
相关产品推荐
相关产品推荐

