1. 問題描述
給某個客戶做CloudWatch名額優化,修改 AWS.EC2.Windwos.CloudWatch.json 配置檔案,删除上傳 Memory-usedutilization (也可能為其他值)名額的配置,但是删除此配置并重新開機了SSM服務後仍會有 Memory-usedutilization 的名額上傳到CloudWatch
2. 處理思路
-
步驟1:再次重新開機SSM
結果:此名額仍會上傳到CloudWatch
思考:會不會是有什麼緩存導緻的?那我停止了SSM服務,是否還會有名額上傳到CloudWatch?
-
步驟2:關閉SSM服務,10分鐘後檢視
結果:所有名額仍然在繼續上傳到CloudWatch
思考:SSM服務都停止了,為什麼還會有名額在上傳,非常不科學,那把對應EC2附加的角色摘除,是否還能上傳名額呢?
-
步驟3:修改EC2的角色為無角色,20分鐘後檢視
結果:所有名額仍然會上傳到CloudWatch
思考:非常見鬼,伺服器上SSM服務停止了,角色摘除了,檢查伺服器内部也沒有配置AK/SK,仍會有名額上傳。
- 步驟4:檢視
結果:amazon-ssm-agent.log
點選 這裡 了解看到了以下資訊: -> 要執行的指令和配置已經成功傳入 2019-04-08 17:01:11 INFO [ssm-document-worker] [e116d321-7464-4dd9-bd4e-b5a7b00a2e2e] [DataBackend] {"DocumentInformation":{"DocumentID":"e116d321-7464-4dd9-bd4e-b5a7b00a2e2e", -> 随後, SSM agent 嘗試重新開機 CloudWatch 插件 Get-Process -Name AWS.CloudWatch -ErrorAction SilentlyContinue | Select ProcessName, Id | ConvertTo-Json -> 但是遇到報錯 2019-04-08 17:01:24 INFO [LongRunningPluginsManager] The execution of command returned Exit Status: 1 2019-04-08 17:01:24 ERROR [LongRunningPluginsManager] Powershell script to get process ID of the Cloudwatch executable currently running failed with error - The term 'ConvertTo-Json' is not recognized as the name of a cmdlet, function, -> 這個報錯意味着指令 'ConvertTo-Json' 沒有被 Powershell 識别出 SSM agent 所啟動的 CloudWatch Plugin 是一個單獨的程序。 在 SSM agent 退出時, SSM agent 會調用 Powershell 來擷取 CloudWatch Plugin 的程序資訊,随後關閉這個程序。 由于 'ConvertTo-Json' 沒有成功執行,導緻了 SSM agent 未能關閉 AWS.CloudWatch 程序。 由此推測,這些未被關閉的程序仍在使用舊的配置檔案來上傳 CloudWatch 資料。 -> 檢視相關文檔, 'ConvertTo-Json' 這個指令是在 Powershell 3.0 或以上提供的。 在 AWS 提供的 Windows 2008 R2 (ami-04d3dc91707f96a37) 鏡像中, Powershell 的版本已經是3.0. 但由于我們的執行個體不是官方鏡像,是以不能排除是由于 Powershell 版本過低導緻的問題。
ConvertTo-Json
3. 異常原因
因為作業系統為Windows 2008 R2 ,且是通過本地遷移到AWS的,系統的Powershell版本未做過更新,版本過低,
是以重新開機 Amazon SSM Agent 服務并不會真正的殺掉正在運作的AWS.CloudWatch 程序,無論怎麼重新開機服務,
SSM Agent仍會使用舊的配置檔案,導緻修改後的配置不生效
4. 處理步驟
我們可以分兩部分來處理這個問題。一個是先讓 SSM agent 的配置生效,另一個是修複 Powershell 來避免後續更新配置出現問題。
- 确認配置檔案 C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json 已經更新到期望的樣子。(即已經移除 Memory-usedutilization 這個名額)
- 停止 SSM agent 服務
AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值? - 檢查 AWS.CloudWatch 這個程序是否仍在進行
AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值? - 關閉所有正在運作的 AWS.CloudWatch 程序
AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值? - 确認所有 AWS.CloudWatch 程序都關閉後,再次啟動 SSM agent
AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值? -
更新Powershell
可以通過如下指令檢查 Powershell 的版本:
PS C:\Users\Administrator> get-host Name : ConsoleHost Version : 2.0 <----
在進行更新動作前,建議您先做好備份,萬一更新出現問題也能恢複。
點選 這裡 檢視更新方法。
5. 驗證方式
- 檢查 CloudWatch, 觀察是否仍有
的值上傳,如果沒有,說明新配置已生效Memory-usedutilization
- Powershell 執行
,确認版本在3.0以上get-host
7. 事後思考
很多時候,出現問題時首先通過日志進行排查,能節約大量的時間