排查凭据问题

本文档提供的信息可帮助您排查 Compute Engine 虚拟机实例上的 Ops Agent 授权和凭据问题。

如果 Ops Agent 报告访问权限或授权错误;或者如果代理似乎运行正常,但没有数据;或者提醒政策没有按您的预期发挥作用;则检查您的虚拟机实例的凭据是否正确,包括它们是否指定了正确的项目:

  • 如果您使用的是具有标准(非私钥)凭据的 Compute Engine 虚拟机实例,则数据不太可能发送到错误的项目,但您的凭据仍可能不足。如需了解凭据,请参阅授权 Ops Agent。要验证您的凭据,请参阅验证 Compute Engine 凭据

  • 如果您在 Compute Engine 实例上使用私钥凭据,则凭据可能无效,或者它们可能来自错误的项目。如需了解凭据,请参阅授权 Ops Agent。要验证您的凭据,请参阅验证私钥凭据

验证 Compute Engine 凭据

使用 Google Cloud 控制台的 Compute Engine 虚拟机实例页面,以验证您的 Compute Engine 虚拟机实例是否具有足够的 Ops Agent 凭据。凭据通常会添加到所有新的 Compute Engine 虚拟机实例的默认服务账号中,但创建实例时可能会覆盖这些默认值。

在 Google Cloud 控制台的导航面板中,选择 Compute Engine,然后选择虚拟机实例

前往虚拟机实例

  1. 如有必要,将当前 Google Cloud 项目更改为与您的 Compute Engine 虚拟机实例关联的一个项目。例如,如果系统提示您启用结算功能,则表示当前项目中没有任何 Compute Engine 虚拟机实例。
  2. 虚拟机实例页面中,点击您的虚拟机实例的名称。随即会显示虚拟机实例的详情页面。
  3. 虚拟机实例详情页面中,查看 Cloud API 访问权限范围标题下的内容:
    • 如果看到“允许所有 Cloud API 的全面访问权限”,则表明您拥有足够的凭据。
    • 如果您在 Stackdriver Monitoring API(Cloud Monitoring API 的旧名称)旁边看到您拥有只写完整权限,则表明您拥有足够的凭据。
    • 否则,实例的默认服务账号不具有代理所需的凭据。要在实例上使用代理,您必须添加私钥服务账号凭据。如需了解相关说明,请参阅添加凭据

如果您拥有正确的默认凭据,请直接跳到在 Linux 和 Windows 上安装

验证私钥凭据

要验证虚拟机实例上是否安装了有效的私钥凭据,请首先验证凭据文件是否存在于其预期位置,然后验证凭据文件中的信息是否有效。可以使用 Google Cloud 控制台的 IAM 和管理 > 服务账号部分撤消以前有效的凭据。 如果不存在有效凭据,请参阅添加凭据,以替换现有凭据或添加新凭据。

凭据是否存在?

要查看您的实例上是否存在私钥服务账号凭据,请在您的实例上运行以下 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 和管理 > 服务账号部分中显示的内容比对。

如果存在以下任一情况,则凭据文件无效:

  • 您检查的是 Compute Engine 虚拟机实例,但凭据文件中的 Google Cloud 项目不是包含您的实例的项目。
  • 列出的服务账号不存在,可能已被删除。
  • 列出的服务账号没有启用正确的角色。它至少应具有用于指标收集的 roles/monitoring.metricWriter (Monitoring Metric Writer),以及用于写入日志的 roles/logging.logWriter (Logs Writer)。
  • 私钥不存在,可能已被撤消。

如果服务账号没有问题,但私钥已被撤消,那么您可以创建一个新的私钥,并将其复制到您的实例。否则,您必须按照以下添加凭据部分中所述创建新的服务账号。

生成新的凭据

如果凭据无效,请执行以下步骤:

  1. 对于包含需要使用私钥授权的实例(创建时不包括访问权限范围 https://www.googleapis.com/auth/monitoring.write 的 Compute Engine 实例)的每个连接项目,创建一个服务账号并生成一个私钥(如果它们不存在)。请按以下步骤操作:
    1. 在 Google Cloud 控制台的导航面板中,选择 Monitoring,然后选择  Monitoring 设置

      转到 Monitoring 设置

    2. 选择摘要标签页。确定包含相关 Compute Engine 资源的项目,然后进入 Google Cloud 控制台
    3. 转到 Google Cloud 控制台的 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 字段的值与您刚为其生成凭据的受监控项目的值相匹配。