使用用户管理的服务账号配置日志回流

本页面介绍了如何通过创建已配置的接收器来路由日志 使用用户代管式服务账号默认情况下,日志记录功能会为资源中的所有接收器使用一个日志记录服务账号。不过, 如果您的日志接收器位于不同的项目中 您自己的用户代管式服务账号 用户管理的项目中的 Identity and Access Management 权限 服务账号。

只有在出现以下情况时,您才能创建使用用户代管式服务账号的接收器: 接收器目标位置是日志存储桶或 Google Cloud 项目。本文档中的示例展示了如何设置使用用户管理的服务账号的接收器,其中目的地是日志存储桶。

准备工作

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 确保您拥有一个用户管理的服务账号,然后将以下变量设置为用户管理的服务账号的适当值:

    • CUSTOM_SA_PROJECT_ID:包含用户管理的服务账号的项目的项目 ID。

    • CUSTOM_SA:用户管理的服务账号的电子邮件地址。

    如需了解如何创建服务账号,请参阅创建服务账号

  3. 确保您有一个可用作日志接收器目标位置的日志存储桶,然后将以下变量设置为适合您的日志存储桶的值。如有必要,请创建日志存储桶

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

    • LOCATION:位置 日志存储桶中的角色

    • BUCKET_NAME:名称 日志存储桶中的角色

  4. 确定需要 您计划创建日志接收器的项目中是否存在 将以下变量设置为相应的值:

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

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

      gcloud logging settings describe --project=SINK_PROJECT_ID
      

      在响应中,以 loggingServiceAccountId 开头的行会列出您的服务账号的电子邮件地址。

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

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

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

授予 IAM 角色

本部分介绍创建使用 用户代管式服务账号。

允许用户管理的服务账号将日志条目写入接收器目标位置

向用户管理的服务账号授予将日志条目写入您将在后续步骤中创建的接收器目标所需的权限。接收器的目标位置将是存储在名为 LOG_BUCKET_PROJECT_ID 的项目中的日志存储桶。

如需向用户管理的服务账号授予所需权限,请在包含日志存储桶的项目中向其授予 Logs Bucket Writer 角色 (roles/logging.bucketWriter):

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

如需详细了解上述命令,请参阅 gcloud projects add-iam-policy-binding

配置服务账号模拟

配置默认的 Cloud Logging 服务账号 LOGGING_SA。 以便它可以模拟用户代管式服务账号 CUSTOM_SA。默认的 Cloud Logging 服务账号 存在于您要创建的 Google Cloud 项目中 创建使用用户代管式服务账号的日志接收器。

如需配置服务账号模拟,请向用户管理的服务账号中的 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'

服务账号模拟涉及两个主账号:服务账号 它不具备访问资源的权限; 拥有访问资源权限的服务账号。在本课中, 在这种情况下,用户代管式服务账号就是拥有权限的账号 因为它能够将日志条目写入接收器目标位置 它是项目中名为 LOG_BUCKET_PROJECT_ID 的日志存储桶。 Logging 服务账号拥有 拥有路由日志的权限。

如需详细了解“服务账号令牌创建者”角色,请参阅用于管理和冒充服务账号的角色:服务账号令牌创建者角色

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

让主账号能以用户代管式服务账号的身份运行操作

向将创建接收器的主账号授予执行下列操作所需的权限 作为用户代管式服务账号运行操作。

如需授予所需权限,请在存储用户管理的服务账号 CUSTOM_SA_PROJECT_ID 的 Google Cloud 项目中向主账号授予 Service Account User 角色 (roles/iam.serviceAccountUser)。

在运行以下命令之前,请先进行以下替换:

  • PRINCIPAL:您要验证的主账号的标识符 授予此角色的权限。主账号标识符通常采用以下格式:PRINCIPAL-TYPE:ID。例如 user:my-user@example.com。 如需查看 PRINCIPAL 可以采用的格式的完整列表,请参阅主账号标识符

执行 gcloud iam service-accounts add-iam-policy-binding 命令:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='PRINCIPAL' \
--role='roles/iam.serviceAccountUser'

如果您使用的是自定义角色,则主账号需要拥有 iam.serviceAccounts.actAs 权限。

如需详细了解“服务账号用户”角色,请参阅用于管理和冒充服务账号的角色:服务账号用户角色

创建使用用户管理的服务账号的日志回流

如需使用用户管理的服务账号创建接收器,请运行 gcloud logging sinks create 命令并添加 --custom-writer-identity 选项。

在运行以下命令之前,请先进行以下替换:

  • SINK_NAME:日志接收器的名称。

执行 gcloud logging sinks create 命令:

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

验证接收器是否在路由日志

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

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

  1. 运行 gcloud logging write 命令:

    在运行以下命令之前,请先进行以下替换:

    • LOG_NAME:日志的名称。例如,您可以 将此字段设置为 mylog

    执行 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
    

后续步骤