如何通过DefinitionSubstitutions向Step Functions传递SSM StringList子网列表
解决方案
Step Functions 的 DefinitionSubstitutions 本身仅支持字符串类型的替换,不支持直接传入列表类型,你可以通过以下方案解决硬编码子网数量的问题:
方案:搭配 Step Functions 内置字符串拆分函数实现动态列表注入
无需拆分子网逐个传入,直接将整段逗号分隔的子网字符串传入后,在状态机内动态拆分得到列表,可适配任意数量的子网场景:
- 调整 CloudFormation 配置
# Cloud Formation Parameters: ListOfSubnets: Type: AWS::SSM::Parameter::Value<CommaDelimitedList> Resources: MyStateMachine: Type: AWS::Serverless::StateMachine Properties: DefinitionUri: step-functions.asl.yaml DefinitionSubstitutions: # 将整个子网列表拼接为单个逗号分隔字符串传入 SubnetListStr: !Join [",", !Ref ListOfSubnets]
- 调整 Step Functions ASL 配置
# Step Function MyECSTask: Type: Task Resource: arn:aws:states:::ecs:runTask.waitForTaskToken Parameters: ... NetworkConfiguration: AwsvpcConfiguration: ... # 用内置函数将逗号分隔字符串拆为子网列表,后缀.$表示该字段为动态计算值 Subnets.$: States.StringSplit('${SubnetListStr}', ',')
如果你的SSM参数中可能存在多余的空值,还可以搭配States.ArrayFilter函数过滤掉无效的空字符串元素。如果场景允许不使用外部ASL文件,也可以直接将状态机定义inline写在CloudFormation的Definition属性中,直接把!Ref ListOfSubnets赋值给Subnets字段,CloudFormation会直接把列表类型的值注入到ASL中,不需要做字符串拆分处理。
内容的提问来源于stack exchange,提问作者lmika
相关产品推荐
相关产品推荐

