使用用户代管式服务帐号配置日志接收器

本页面介绍如何创建配置了用户代管式服务帐号的接收器以路由日志。默认情况下,Logging 会为资源中的所有接收器使用 Logging 服务帐号。但是,如果您的日志接收器位于不同的项目中,您可以创建和管理自己的用户代管式服务帐号,这样就可以集中管理包含用户管理的服务帐号的项目中的 Identity and Access Management 权限。

仅当接收器目标位置为日志存储桶时,您才能创建使用用户代管式服务帐号的接收器。

须知事项

  1. 如需使用本指南中的命令行示例,请安装并配置 Google Cloud CLI

  2. 确保您拥有用户代管式服务帐号。如需了解如何创建服务帐号,请参阅创建服务帐号

  3. 如需使用本文档中的命令,请确定以下值:

    • DESTINATION_PROJECT_ID:包含日志存储桶的项目的 ID。

    • CUSTOM_SA_PROJECT_ID:包含用户代管式服务帐号的项目的 ID。

    • SINK_PROJECT_ID:您计划创建日志接收器的项目的 ID。

    • CUSTOM_SA:用户代管式服务帐号。如需了解如何创建服务帐号,请参阅创建服务帐号

      用户代管式服务帐号的格式如下所示:

      SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    • LOGGING_SA:默认的 Logging 服务帐号。如需获取此电子邮件,请运行以下命令:

         gcloud logging settings describe --project=SINK_PROJECT_ID
      

      输出中包含有关您服务帐号的以下信息:

      loggingServiceAccountId: serviceAccount:[email protected]

    • BUCKET_NAME:日志存储桶的名称。

      日志存储桶的接收器目标路径如下所示:

      logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME

  4. 在包含用户代管式服务帐号的项目中,确保不强制执行组织政策布尔值限制条件 iam.disableCrossProjectServiceAccountUsage。默认情况下,系统会强制执行此限制条件。如需停用此限制条件,以便将服务帐号附加到另一个项目中的资源,请运行以下命令:

      gcloud resource-manager org-policies disable-enforce \
      iam.disableCrossProjectServiceAccountUsage \
      --project=CUSTOM_SA_PROJECT_ID
    

    如需详细了解如何跨项目启用服务帐号,请参阅允许跨项目关联服务帐号

授予 IAM 角色

本部分介绍创建使用用户代管式服务帐号的接收器的前提条件。

在包含日志接收器目标位置的日志存储桶项目中,执行以下操作:

  1. 向用户代管式服务帐号授予 Logs Bucket Writer 角色 (roles/logging.bucketWriter)。借助此角色,用户代管式服务帐号可以将日志写入日志存储桶:

     gcloud projects add-iam-policy-binding DESTINATION_PROJECT_ID \
     --member="serviceAccount:CUSTOM_SA" \
     --role="roles/logging.bucketWriter"
    

在您要创建使用用户代管式服务帐号的日志接收器的 Google Cloud 项目中,执行以下操作:

  1. 向用户代管式服务帐号上的 Cloud Logging 服务帐号授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator):

      gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
      --project=CUSTOM_SA_PROJECT_ID \
      --member="serviceAccount:LOGGING_SA" \
      --role="roles/iam.serviceAccountTokenCreator"
    

    上述命令可让 Logging 服务帐号使用 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator) 模拟用户代管式服务帐号。

    服务帐号模拟涉及两个主帐号:缺少资源访问权限的服务帐号,以及有权访问资源的权限传送服务帐号。在这种情况下,用户代管式服务帐号是权限分配帐号,因为它能够将日志写入目标项目中的日志存储桶。Logging 服务帐号有权路由日志。

    如需详细了解 Service Account Token Creator 角色,请参阅管理和模拟服务帐号的角色:Service Account Token Creator 角色

    如需详细了解服务帐号模拟,请参阅服务帐号模拟简介

  2. 向创建日志接收器的主帐号授予 Service Account User 角色 (roles/iam.serviceAccountUser)。具体而言,主帐号需要服务帐号的 iam.serviceAccounts.actAs 权限:

     gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
     --member 'user:[email protected]' \
     --role "roles/iam.serviceAccountUser"
    

    上述命令允许用户以用户管理的服务帐号运行操作。

    如需详细了解 Service Account User 角色,请参阅管理和模拟服务帐号的角色:Service Account User 角色

创建使用用户代管式服务帐号的日志接收器

gcloud

如需使用用户代管式服务帐号创建接收器,请将变量替换为您自己的信息,并使用 --custom-writer-identity 标志运行 gcloud logging sinks create 命令:

    gcloud logging sinks create SINK_NAME logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME \
    --custom-writer-identity=serviceAccount:CUSTOM_SA \
    --project=SINK_PROJECT_ID

API

  1. 如需在 Google Cloud 项目中创建日志接收器,请使用 Logging API 中的 projects.sinks.create。在 LogSink 对象中,传递 customWriterIdentity 参数,并在方法请求正文中提供相应的必需值:

    • name:接收器的标识符。请注意,创建接收器后,您无法重命名接收器,但可以删除它并创建新的接收器。
    • destination:您希望将日志路由到的日志存储桶。目标路径采用以下格式:

      logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME
      
  2. 调用 projects.sinks.create 以创建接收器。

如需详细了解如何使用 Logging API 创建接收器,请参阅 LogSink 参考文档。

验证您的接收器是否路由日志

在本部分中,您将使用 gcloud CLI 写入和读取日志条目,以验证接收器是否正确地路由日志。

如需验证您的接收器是否正确路由日志,请执行以下操作:

  1. 使用您自己的信息替换这些变量,并使用 gcloud logging write 命令写入示例日志条目:

    gcloud logging write LOG_NAME "Test log entry" --project=SINK_PROJECT_ID
    

    上一条命令返回以下消息:

    Created log entry.

  2. 如需读取您刚刚写入的日志条目,请运行以下命令:

    gcloud logging read 'textPayload="Test log entry"' \
    --bucket=BUCKET_NAME --location=LOCATION \
    --view=_AllLogs --project=SINK_PROJECT_ID
    

后续步骤