You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:40:44