多Windows EC2实例执行脚本后CloudWatch日志仅显单条输出问题排查
多Windows EC2实例执行SSM PowerShell脚本后CloudWatch日志仅显示单实例输出的排查与解决
核心原因
当通过AWS Systems Manager的AWS-RunPowerShellScript批量执行脚本时,若所有实例的输出被配置写入同一个固定名称的CloudWatch日志流,后续实例的输出会覆盖之前的内容。这是因为CloudWatch日志流是顺序写入的,相同流的新日志会直接覆盖或冲掉旧的输出内容(取决于SSM命令的日志写入逻辑)。
另外,默认情况下SSM会为每个实例的命令执行生成独立的日志流(格式通常为命令ID/实例ID),如果看不到多实例日志,大概率是手动指定了固定日志流名称,导致所有实例往同一流写入。
解决步骤
1. 修正CloudWatch日志流配置
执行SSM命令时,确保日志流使用动态变量生成,而非固定名称:
- 勾选「启用CloudWatch日志」
- 指定日志组(例如
/aws/ssm/windows-pv-drivers-audit) - 日志流名称填写
{CommandId}/{InstanceID},这样每个实例的命令执行会生成独立的日志流,彻底避免覆盖问题 - 确认SSM实例关联的IAM角色拥有
cloudwatch:PutLogEvents和cloudwatch:CreateLogStream权限
2. 优化脚本(可选但推荐)
原脚本功能正常,但Win32_Product类会触发MSI安装包的一致性检查,可能拖慢实例性能。建议替换为注册表查询,同时增强输出的实例标识信息:
# 通过注册表查询AWS PV Drivers信息,避免Win32_Product的性能问题 $pvRegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" $pvInfo = Get-ItemProperty -Path $pvRegPath | Where-Object { $_.DisplayName -eq "AWS PV Drivers" } | Select-Object @{Name='Name'; Expression={$_.DisplayName}}, @{Name='Version'; Expression={$_.DisplayVersion}} # 添加实例标识属性 $pvInfo | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $env:COMPUTERNAME -Force $pvInfo | Add-Member -MemberType NoteProperty -Name "InstanceId" -Value (Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/instance-id) -Force # 输出结果 $pvInfo
3. 排查已有日志
进入目标CloudWatch日志组,检查是否存在多个以命令ID/实例ID命名的日志流——可能你之前忽略了这些流,误以为只有单实例输出。
内容的提问来源于stack exchange,提问作者MickyD
相关产品推荐
相关产品推荐

