排解憑證問題

本文提供的資訊可協助您排解 Compute Engine VM 執行個體上的作業套件代理程式授權和憑證問題。

如果 Ops Agent 回報存取權或授權錯誤,或者代理程式似乎正常執行,但卻沒有任何資料,或快訊政策未如預期運作,請檢查 VM 執行個體的憑證是否正確,包括憑證所指定的專案是否正確:

  • 如果您使用具有標準 (而非私密金鑰) 憑證的 Compute Engine VM 執行個體,即表示資料不可能進入錯誤專案,但您的憑證仍可能不足。如要瞭解憑證,請參閱「授權作業套件代理程式」。如要驗證您的憑證,請參閱「驗證 Compute Engine 憑證」。

  • 如果您在 Compute Engine 執行個體中使用私密金鑰憑證,則憑證可能會無效,或憑證可能來自錯誤專案。如要瞭解憑證,請參閱「授權作業套件代理程式」。如要驗證憑證,請參閱驗證私密金鑰憑證

驗證 Compute Engine 憑證

使用 Google Cloud 主控台的 Compute Engine「VM instances」(VM 執行個體) 頁面,驗證 Compute Engine VM 執行個體是否擁有 Ops Agent 的充分憑證。憑證通常會新增至所有新的 Compute Engine VM 執行個體的預設服務帳戶,但建立執行個體時可以覆寫這些預設值。

前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

前往「VM instances」(VM 執行個體) 頁面

如果您是使用搜尋列尋找這個頁面,請選取子標題為「Compute Engine」的結果

  1. 如有必要,請將目前 Google Cloud 專案變更為與 Compute Engine VM 執行個體相關聯的專案。舉例來說,如果系統提示您「啟用計費功能」,則表示目前專案中沒有任何 Compute Engine VM 執行個體。
  2. 在「VM Instances」(VM 執行個體) 頁面中,按一下 VM 執行個體的名稱。畫面會隨即顯示 VM 執行個體的詳細資料頁面。
  3. 在「VM instance details」(VM 執行個體詳細資料) 頁面的「Cloud API access scopes」(Cloud API 存取權範圍) 標題下查看以下項目:
    • 如果您看到「Allow full access to all Cloud APIs」(允許所有 Cloud API 的完整存取權),表示您擁有充分憑證。
    • 如果您在「Stackdriver Monitoring API」旁邊發現 Cloud Monitoring API 的舊名稱,且您擁有「Write Only」(唯寫) 或「Full」(完整) 權限,表示您擁有充分憑證。
    • 否則,就表示執行個體的預設服務帳戶沒有代理程式所需的憑證。如要在執行個體中使用代理程式,您必須新增私密金鑰服務帳戶憑證。如需操作說明,請參閱新增憑證

如果您具備正確的預設憑證,請直接略過並前往在 Linux 和 Windows 上安裝的說明。

驗證私密金鑰憑證

如要驗證是否已在您的 VM 執行個體上安裝有效的私密金鑰憑證,請先驗證憑證檔案是否存在於其預期位置,然後驗證憑證檔案中的資訊是否有效。之前有效的憑證可使用 Google Cloud 控制台的「IAM & Admin」(IAM 與管理員) >「Service accounts」(服務帳戶) 部分撤銷。如果沒有有效憑證,請參閱新增憑證,取代現有憑證或新增憑證。

是否存在憑證?

如要查看私密金鑰服務帳戶憑證是否位於您的執行個體上,請在您的執行個體上執行下列 Linux 指令:

sudo cat $GOOGLE_APPLICATION_CREDENTIALS
sudo cat /etc/google/auth/application_default_credentials.json

如果任何指令顯示如下所示的檔案,表示您的執行個體可能擁有有效的私密金鑰憑證。如果兩個指令都顯示一個檔案,則系統會使用由 GOOGLE_APPLICATION_CREDENTIALS 表示的檔案。

{
  "type": "service_account",
  "project_id": "{your-project-id}",
  "private_key_id": "{your-private-key-id}",
  "private_key": "{your-private-key}",
  "client_email": "{your-project-number}-{your-key}@developer.gserviceaccount.com",
  "client_id": "{your-client-id}",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "{x509-cert-url}",
  "client_x509_cert_url": "{client-x509-cert-url}"
}

如果不存在任何憑證檔案,請參閱新增憑證一文。

憑證是否有效?

在憑證檔案中,「project_id」欄位是您的 Google Cloud 專案,「client_email」會識別專案中的服務帳戶,「private_key_id」則會識別服務帳戶中的私密金鑰。請將這個資訊與Google Cloud 控制台中「IAM & Admin」(IAM 與管理) >「Service accounts」(服務帳戶) 部分顯示的內容進行比對。

如果符合以下任一條件,則憑證檔案無效:

  • 您正在檢查 Compute Engine VM 執行個體,但憑證檔案中的Google Cloud 專案並非包含您執行個體的專案。
  • 所列服務帳戶不存在。可能已遭刪除。
  • 所列服務帳戶未啟用正確角色,應至少擁有指標收集適用的 roles/monitoring.metricWriter (監控指標寫入者),以及記錄寫入適用的 roles/logging.logWriter (記錄寫入者)。
  • 私密金鑰不存在。可能已遭到撤銷。

如果服務帳戶正確,但私密金鑰已撤銷,則您可以建立新的私密金鑰,並將其複製到執行個體。否則,您必須如下面的新增憑證一節所述,建立新的服務帳戶。

產生新憑證

如果憑證無效,請採取下列步驟:

  1. 針對包含需要私密金鑰授權之執行個體的每個已連結專案 (在沒有存取範圍的情況下建立的 Compute Engine 執行個體 https://www.googleapis.com/auth/monitoring.write),建立服務帳戶,並產生私密金鑰 (若尚不存在)。請按照下列步驟操作:
    1. 前往 Google Cloud 控制台的 「Settings」(設定) 頁面

      前往「設定」

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果

    2. 選取「指標範圍」分頁標籤。
    3. 找出包含有問題的 Compute Engine 資源的專案,然後前往 Google Cloud 主控台
    4. 前往 Google Cloud 控制台的「IAM Service Accounts」(IAM 服務帳戶) 頁面,選取 Google Cloud 專案,建立新的服務帳戶,然後為該服務帳戶產生新的私密金鑰。

      如要執行這些步驟,請採取下列任一做法:

      • 前往「IAM 服務帳戶」頁面,選取 Google Cloud 專案,然後按照「 建立服務帳戶」一文中的步驟操作:

        前往 IAM 服務帳戶

      • 按一下下列按鈕,然後選取您的 Google Cloud 專案:

        建立服務帳戶並下載金鑰

        上一個按鈕會自動建立金鑰,並下載至本機系統,供代理程式專屬服務帳戶使用。如有必要,這個程序也會建立必要的服務帳戶,並確保服務帳戶具備正確的權限。專屬代理程式的服務帳戶名稱與 stackdriver-1234@PROJECT_ID.iam.gserviceaccount.com 類似。完成這些動作後,您會收到類似下列的對話方塊通知:

        橫幅:通知使用者已建立服務帳戶和金鑰。

  2. 替換執行個體中與有問題的服務帳戶對應的私密金鑰。

    • 在 Linux 中,替換位於 /etc/google/auth/application_default_credentials.json 中的私密金鑰。
    • 在 Windows 中,替換位於 C:\ProgramData\Google\Auth\application_default_credentials.json. 詳情請參閱「 將私密金鑰複製到您的執行個體」。
  3. 重新啟動代理程式

    • 在 Linux 上執行 sudo service stackdriver-agent restart
    • 在 Windows 中,進入服務管理主控台,然後重新啟動 Cloud Monitoring 服務。

如果您有多個專案需要新的私密金鑰,請針對每個專案重複這個程序。

如要驗證私密金鑰是否正確,請參閱「是否有憑證?」一節。 具體情況如下:

  • 讀取執行個體中的私密金鑰 JSON 檔案,例如 (在 Linux 中): sudo cat /etc/google/auth/application_default_credentials.json
  • 確保 project_id 欄位的值與您剛才為其產生憑證的受控專案的值相符。