天天看點

AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值?

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 來避免後續更新配置出現問題。

  1. 确認配置檔案 C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json 已經更新到期望的樣子。(即已經移除 Memory-usedutilization 這個名額)
  2. 停止 SSM agent 服務
    AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值?
  3. 檢查 AWS.CloudWatch 這個程序是否仍在進行
    AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值?
  4. 關閉所有正在運作的 AWS.CloudWatch 程序
    AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值?
  5. 确認所有 AWS.CloudWatch 程序都關閉後,再次啟動 SSM agent
    AWS上Windows Server 自定義監控删除了指定名額,還會繼續上傳值?
  6. 更新Powershell

    可以通過如下指令檢查 Powershell 的版本:

    PS C:\Users\Administrator> get-host
    Name             : ConsoleHost
    Version          : 2.0  <----
               

    在進行更新動作前,建議您先做好備份,萬一更新出現問題也能恢複。

    點選 這裡 檢視更新方法。

5. 驗證方式

  1. 檢查 CloudWatch, 觀察是否仍有

    Memory-usedutilization

    的值上傳,如果沒有,說明新配置已生效
  2. Powershell 執行

    get-host

    ,确認版本在3.0以上

7. 事後思考

很多時候,出現問題時首先通過日志進行排查,能節約大量的時間

繼續閱讀