PowerShell中用AWS CLI创建CloudWatch告警遇字符串解析错误求助
解决PowerShell中AWS CLI创建CloudWatch告警的JSON格式错误
问题场景
在PowerShell中循环为多个EC2实例创建CloudWatch告警时,执行以下脚本出现字符串格式化错误:
$instanceNames = "i-000000123456789", "i-000000123456777"; foreach ($instanceName in $instanceNames) { aws cloudwatch put-metric-alarm --alarm-name 'Major Alert > Memory Usage exceeds 90%' --alarm-description 'Major Alert > Memory Usage exceeds 90%' --actions-enabled --alarm-actions 'arn:aws:sns:us-east-1:123456789:Test_Topic' 'arn:aws:sns:us-east-1:123456777:Test_Topic' --metric-name 'Memory % Committed Bytes In Use' --namespace 'CWAgent' --statistic 'Average' --dimensions '[{"Name":"InstanceId","Value":"'$instanceName'"}]' --period 300 --evaluation-periods 1 --datapoints-to-alarm 1 --threshold 90 --comparison-operator 'GreaterThanThreshold' --treat-missing-data 'missing' }
错误信息
Error formatting a string: Input string was not in a correct format..
At line:4 char:1
aws cloudwatch put-metric-alarm --alarm-name 'Major Alert > Memory Us ...
- CategoryInfo : InvalidOperation: ({0}" }]:String) [], RuntimeException
- FullyQualifiedErrorId : FormatError
核心原因
PowerShell会将包含{}的字符串识别为格式化字符串占位符(类似"{0}" -f "value"的语法),同时原脚本中混用单双引号拼接变量的方式,导致JSON结构被错误解析,触发格式化错误。
解决方法
方法1:使用Here-String构建JSON维度
Here-String(@"开头/结尾)可直接插入变量,无需手动转义双引号,同时避免PowerShell解析{}为格式化占位符:
$instanceNames = "i-000000123456789", "i-000000123456777"; $snsArns = 'arn:aws:sns:us-east-1:123456789:Test_Topic', 'arn:aws:sns:us-east-1:123456777:Test_Topic' foreach ($instanceName in $instanceNames) { # 用Here-String构建维度JSON $dimensions = @" [{"Name":"InstanceId","Value":"$instanceName"}] "@ aws cloudwatch put-metric-alarm ` --alarm-name "Major Alert > Memory Usage exceeds 90% - $instanceName" ` --alarm-description "Major Alert > Memory Usage exceeds 90% for instance $instanceName" ` --actions-enabled ` --alarm-actions $snsArns ` --metric-name 'Memory % Committed Bytes In Use' ` --namespace 'CWAgent' ` --statistic 'Average' ` --dimensions $dimensions ` --period 300 ` --evaluation-periods 1 ` --datapoints-to-alarm 1 ` --threshold 90 ` --comparison-operator 'GreaterThanThreshold' ` --treat-missing-data 'missing' }
注:给告警名称添加实例ID,避免重复告警名冲突
方法2:多维度场景的适配
如果需要配置多维度(比如磁盘监控),同样用Here-String简化写法:
$dimensions = @" [{"Name":"instance","Value":"C:"},{"Name":"InstanceId","Value":"$instanceName"},{"Name":"objectname","Value":"LogicalDisk"}] "@
方法3:用ConvertTo-Json生成JSON字符串(推荐)
先构建PowerShell对象数组,再转换为JSON字符串,彻底避免手动拼接的格式错误:
foreach ($instanceName in $instanceNames) { # 构建维度对象数组 $dimensionObjects = @( @{ Name = "InstanceId" Value = $instanceName }, @{ Name = "instance" Value = "C:" }, @{ Name = "objectname" Value = "LogicalDisk" } ) # 转换为压缩格式的JSON $dimensions = $dimensionObjects | ConvertTo-Json -Compress aws cloudwatch put-metric-alarm ` --alarm-name "Major Alert > Memory Usage exceeds 90% - $instanceName" ` --alarm-description "Major Alert > Memory Usage exceeds 90% for instance $instanceName" ` --actions-enabled ` --alarm-actions $snsArns ` --metric-name 'Memory % Committed Bytes In Use' ` --namespace 'CWAgent' ` --statistic 'Average' ` --dimensions $dimensions ` --period 300 ` --evaluation-periods 1 ` --datapoints-to-alarm 1 ` --threshold 90 ` --comparison-operator 'GreaterThanThreshold' ` --treat-missing-data 'missing' }
内容的提问来源于stack exchange,提问作者Money Times
相关产品推荐
相关产品推荐

