CloudFormation创建NLB目标组报错Id属性必须为字符串如何解决?
错误根因
你将InstanceID参数的类型设置为List<AWS::EC2::Instance::Id>,此时通过!Ref InstanceID返回的结果是实例ID的数组集合,但Targets配置项下的每个Id字段要求传入单个字符串类型的实例ID,直接把数组赋值给单个Id字段就会触发类型不匹配的报错。
修复方案
方案1:自动遍历实例列表生成Targets(推荐)
使用CloudFormation原生的!ForEach函数遍历实例ID列表,自动生成所有实例的Target配置,适配任意数量的关联实例,修改后的完整模板如下:
Parameters: InstanceID: Description: 请选择需要关联的实例ID Type: List<AWS::EC2::Instance::Id> Description: 选择实例ID关联到目标组 VPC: Description: 目标组所属的VPC Type: AWS::EC2::VPC::Id ConstraintDescription: 选择目标组对应的VPC ID Resources: EC2TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: HealthCheckIntervalSeconds: 30 HealthCheckProtocol: TCP HealthCheckTimeoutSeconds: 10 HealthyThresholdCount: 3 Name: NLBTargetGroupForEndpointService Port: 22 Protocol: TCP TargetType: instance # 遍历实例ID列表生成Targets配置 Targets: !ForEach Instance: !Ref InstanceID Output: Id: !Ref Instance UnhealthyThresholdCount: 3 VpcId: !Ref VPC Tags: - Key: Name Value: EC2TargetGroup - Key: Port Value: 22 - Key: Protocol Value: TCP
注意:如果你的CloudFormation环境不支持
!ForEach函数(2023年之前的旧版本环境),可以使用方案2。
方案2:手动指定列表下标取值
如果关联的实例数量固定,可以通过!Select函数从列表中取出单个实例ID赋值给Id字段,比如绑定2个实例的写法如下:
Targets: - Id: !Select [0, !Ref InstanceID] - Id: !Select [1, !Ref InstanceID]
如果需要绑定N个实例,依次添加下标为0、1、2...N-1的条目即可。
内容的提问来源于stack exchange,提问作者Rakesh Karn
相关产品推荐
相关产品推荐

