如何在CloudFormation中结合!Split、!GetAtt和!Sub引用环境相关嵌套栈子网ID?
CloudFormation 正确组合 !Split、!GetAtt 和 !Sub 处理嵌套栈子网字符串
假设你的嵌套栈逻辑ID为VpcStack,其输出的逗号分隔子网ID字符串属性是LambdaSubnetsString,以下是正确用法示例及错误避坑:
核心场景:将子网字符串拆分为列表(给Lambda的VpcConfig用)
直接按「先获取字符串,再拆分」的顺序嵌套函数即可,这是最常用的场景:
LambdaFunction: Type: AWS::Lambda::Function Properties: # 省略其他必填属性(Runtime、Code等) VpcConfig: SubnetIds: !Split [",", !GetAtt VpcStack.LambdaSubnetsString]
- 逻辑:
!GetAtt先从嵌套栈取出逗号分隔的子网字符串,!Split以逗号为分隔符将其拆分为字符串列表,完全匹配Lambda的SubnetIds参数要求(列表类型)。
结合 !Sub 使用拆分后的子网ID
如果需要在格式化字符串中引用拆分后的某个子网,先通过!Select提取目标元素,再在!Sub中引用:
SubnetDescriptionTag: Type: AWS::EC2::Tag Properties: ResourceType: AWS::EC2::Subnet ResourceId: !Select [0, !Split [",", !GetAtt VpcStack.LambdaSubnetsString]] Key: Description Value: !Sub "Lambda使用的第一个子网:${FirstSubnet}" Variables: FirstSubnet: !Select [0, !Split [",", !GetAtt VpcStack.LambdaSubnetsString]]
常见错误避坑
- 函数顺序颠倒:把
!Split的分隔符和目标字符串写反,比如!Split [!GetAtt VpcStack.LambdaSubnetsString, ","],!Split的第一个参数必须是分隔符(字符串或能解析为字符串的表达式),第二个才是要拆分的内容。 - !GetAtt 内嵌套函数:错误写法如
!GetAtt VpcStack.!Split [",", LambdaSubnetsString],!GetAtt的参数只能是资源逻辑ID+属性名,不能在属性位置嵌套其他函数。 - !Sub 内直接嵌套复杂函数:错误写法如
!Sub "子网列表:${!Split [",", !GetAtt VpcStack.LambdaSubnetsString]}",!Sub的变量引用不能直接嵌套!Split这类函数,需先将函数结果赋值给变量再引用。
内容的提问来源于stack exchange,提问作者JustANoob
相关产品推荐
相关产品推荐

