如何向CloudFormation模板传递键值对列表参数?遇Split函数报错
错误原因分析
你遇到的错误有两层核心问题:
Fn::Split参数不合法:要么LinuxSSMParameterTags未传递有效字符串值(比如参数类型设为List<String>而非String,或者值为空),导致Split缺少必要的第二个参数;- Tags属性类型不匹配:即便Split执行成功,它返回的是字符串数组,但
AWS::SSM::Parameter的Tags属性要求的是键值对对象列表(格式为[{Key: "标签键", Value: "标签值"}, ...]),字符串数组无法直接赋值给该属性。
解决方案
根据你传递标签参数的格式,选择对应的修正方式:
方式1:参数为键=值,键=值格式的字符串
如果LinuxSSMParameterTags是类似Env=Prod,App=Monitoring的字符串,需要拆分每个键值对后构造符合要求的标签格式。注意需使用CloudFormation 2023-09-01及以上版本(支持!ForEach):
AWSTemplateFormatVersion: 2023-09-01 Resources: LinuxCWConfigSSMParameter: Type: "AWS::SSM::Parameter" Properties: Name: !Ref LinuxSSMParameterName Tags: !ForEach TagPair in !Split [",", !Ref LinuxSSMParameterTags] - Key: !Select [0, !Split ["=", !Ref TagPair]] Value: !Select [1, !Split ["=", !Ref TagPair]] Type: "String" Value: | { "agent": { "metrics_collection_interval": 60 }, "metrics": { "metrics_collected": { "mem": { "measurement": [ {"name": "mem_active", "rename": "MemoryActive"}, {"name": "mem_available", "rename": "MemoryAvailable"}, {"name": "mem_available_percent", "rename": "%MemoryAvailable"}, {"name": "mem_buffered", "rename": "MemoryBuffered"}, {"name": "mem_cached", "rename": "MemoryCached"}, {"name": "mem_free", "rename": "MemoryFree"}, {"name": "mem_inactive", "rename": "MemoryInactive"}, {"name": "mem_total", "rename": "MemoryTotal"}, {"name": "mem_used", "rename": "MemoryUsed"}, {"name": "mem_used_percent", "rename": "%MemoryUsed"} ] } }, "append_dimensions": { "InstanceId": "${aws:InstanceId}" } } }
方式2:参数为JSON格式的标签数组字符串
如果LinuxSSMParameterTags已经是符合Tags格式的JSON字符串(比如[{"Key":"Env","Value":"Prod"},{"Key":"App","Value":"Monitoring"}]),直接用!FromJson转换即可:
Tags: !FromJson !Ref LinuxSSMParameterTags
额外检查
确保LinuxSSMParameterTags参数的类型设置为String,而非List<String>,因为!Split的第二个参数必须是字符串类型。
内容的提问来源于stack exchange,提问作者user1876809
相关产品推荐
相关产品推荐

