You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:07:48