接收 Cloud Audit Logs 事件


本教程介绍如何使用 Cloud Audit Logs 部署经身份验证的 Cloud Run 服务,该服务接收来自 Cloud Storage 的事件。使用本教程部署生产工作负载。Eventarc 触发器根据 Cloud Audit Logs 条目过滤事件。如需了解详情,请参阅确定 Cloud Audit Logs 的事件过滤条件

您可以使用 Google Cloud Console 或 Google Cloud CLI 来完成本教程。

目标

在此教程中,您将学习以下操作:

  1. 创建 Cloud Storage 存储桶作为事件来源。

  2. 将事件接收器服务部署到 Cloud Run。

  3. 创建 Eventarc 触发器。

  4. 通过将文件上传到 Cloud Storage 存储桶来创建事件,并在 Cloud Run 日志中查看该事件。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。

请注意,默认情况下,Cloud Build 权限包含上传和下载 Artifact Registry 工件的权限

所需权限

如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

使用 Google Cloud 控制台或 gcloud CLI 完成以下步骤:

控制台

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage 和 Eventarc API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage 和 Eventarc API。

    启用 API

  8. 如需配置审核日志中记录的数据访问,请为 Google Cloud Storage 启用管理员读取数据读取数据写入日志类型:

    转到“审核日志”

  9. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  10. 点击创建服务账号
  11. 输入要在 Google Cloud 控制台中显示的服务账号名称。

    Google Cloud 控制台会根据此名称生成服务账号 ID。如有必要,请修改 ID。此 ID 创建后便无法更改。

  12. 可选:输入服务账号的说明。
  13. 如果您现在不想设置访问权限控制,请点击完成以完成服务账号的创建过程。

    如需立即设置访问权限控制,请点击创建并继续,然后继续执行下一步。

  14. 选择项目的 Cloud Run InvokerEventarc Event Receiver 角色,以授予与 Eventarc 触发器关联的服务账号。

    出于测试目的,这将为项目中的所有 Cloud Run 服务和作业授予 Cloud Run Invoker 角色;但是,您可以针对服务授予该角色。如需了解详情,请参阅授予 Cloud Run 服务权限

    请注意,如果您在未授予 Cloud Run Invoker 角色的情况下为经过身份验证的 Cloud Run 服务创建触发器,则触发器会成功创建且处于活动状态。但是,触发器将无法按预期运行,并且日志中会显示类似于以下内容的消息:

    The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
  15. 完成添加角色后,点击继续完成以完成服务账号的创建过程。

gcloud

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。
  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage 和 Eventarc API:

    gcloud services enable artifactregistry.googleapis.com、cloudbuild.googleapis.com、logging.googleapis.com、pubsub.googleapis.com、run.googleapis.com、storage.googleapis.com 和 eventarc.googleapis.com
  7. 安装 Google Cloud CLI。
  8. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  9. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  10. 确保您的 Google Cloud 项目已启用结算功能

  11. Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage 和 Eventarc API:

    gcloud services enable artifactregistry.googleapis.com、cloudbuild.googleapis.com、logging.googleapis.com、pubsub.googleapis.com、run.googleapis.com、storage.googleapis.com 和 eventarc.googleapis.com
  12. 更新 gcloud 组件:
    gcloud components update
  13. 使用您的账号登录:
    gcloud auth login
    
  14. 设置本教程中使用的配置变量:
    export REGION=us-central1
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}
    export SERVICE_NAME=helloworld-events
    
  15. 如需配置在审核日志中记录哪些数据访问,请为 storage.googleapis.com 服务启用 ADMIN_READDATA_READDATA_WRITE 日志类型:
    1. 读取您项目的 IAM 政策,并将其存储在一个文件中:
      gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
    2. /tmp/policy.yaml 中修改政策,仅添加或更改数据访问审核日志配置。
      auditConfigs:
      - auditLogConfigs:
      - logType: ADMIN_READ
      - logType: DATA_WRITE
      - logType: DATA_READ
      service: storage.googleapis.com
    3. 写入新的 IAM 政策:
      gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
      如果上述命令报告与其他更改发生冲突,请重复以上步骤(从读取项目的 IAM 政策开始)。
  16. 为项目创建服务账号:
    gcloud iam service-accounts create sample-service-account \
        --description="A sample service account" \
        --display-name="Sample service account"
    创建服务账号后,最多可能需要 7 分钟才能使用该服务账号。如果您在创建服务账号后立即尝试使用该服务账号,并且收到错误消息,请至少等待 60 秒再重试。
  17. 如需确认 sample-service-account 已创建,请运行以下命令:
    gcloud iam service-accounts list
    输出应类似如下所示:
    DISPLAY NAME                     EMAIL                                                               DISABLED
    Default compute service account  PROJECT_NUMBER-compute@developer.gserviceaccount.com                False
    Sample service account           sample-service-account@PROJECT_ID.iam.gserviceaccount.com           False
  18. 向与 Eventarc 触发器关联的服务账号的角色授予 Cloud Run Invoker (run.invoker) 和 Eventarc Event Receiver (roles/eventarc.eventReceiver):
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:sample-service-account@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/run.invoker"
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:sample-service-account@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/eventarc.eventReceiver"

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。

    出于测试目的,这将为项目中的所有 Cloud Run 服务和作业授予 Cloud Run Invoker 角色;但是,您可以针对服务授予该角色。如需了解详情,请参阅授予 Cloud Run 服务权限

    请注意,如果您在未授予 Cloud Run Invoker 角色的情况下为经过身份验证的 Cloud Run 服务创建触发器,则触发器会成功创建且处于活动状态。但是,触发器将无法按预期运行,并且日志中会显示类似于以下内容的消息:

    The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.

创建 Artifact Registry 标准制品库

创建 Artifact Registry 标准制品库以存储您的容器映像。

控制台

  1. 在 Google Cloud 控制台中,进入制品库页面。

    前往制品库

  2. 点击 创建制品库
  3. 配置您的制品库:
    1. 输入唯一的名称
    2. 格式字段中,选择 Docker
    3. 模式字段中,选择标准
    4. 位置类型字段中,选择区域
    5. 区域列表中,选择 us-central1(爱荷华)
  4. 接受其他默认值,然后点击创建

gcloud

gcloud artifacts repositories create REPOSITORY \
    --repository-format=docker \
    --location=$REGION

REPOSITORY 替换为 Artifact Registry 制品库的唯一名称。

创建 Cloud Storage 存储桶

本教程使用 Cloud Storage 作为事件来源。要创建存储桶,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往存储桶页面。

    进入“存储桶”

  2. 点击创建存储桶
  3. 输入您的存储桶信息,然后点击继续以完成各个步骤:
    1. 请输入具有唯一性的名称。例如 eventarcbucket
    2. 选择区域作为位置类型
    3. 选择 us-central1 (Iowa) 作为位置
    4. 默认存储类别选择标准
    5. 访问权限控制中选择统一
  4. 点击创建

gcloud

gsutil mb -l $REGION gs://events-tutorial-PROJECT_ID/

创建事件来源后,您可以在 Cloud Run 上部署事件接收器服务。

将事件接收器服务部署到 Cloud Run

部署接收和记录事件的 Cloud Run 服务。要部署示例事件接收器服务,请执行以下操作:

控制台

  1. 将示例代码库克隆到 GitHub 账号:
  2. Go

    1. 在 GitHub 上,导航到 GoogleCloudPlatform/golang-samples
    2. 点击创建分支 (Fork)。
    3. 克隆按钮的屏幕截图。
    4. 如果出现提示,请选择克隆代码库的位置。

    Java

    1. 在 GitHub 上,导航到 GoogleCloudPlatform/java-docs-samples
    2. 点击创建分支 (Fork)。
    3. 克隆按钮的屏幕截图。
    4. 如果出现提示,请选择克隆代码库的位置。

    .NET

    1. 在 GitHub 上,导航到 GoogleCloudPlatform/dotnet-docs-samples
    2. 点击创建分支 (Fork)。
    3. 克隆按钮的屏幕截图。
    4. 如果出现提示,请选择克隆代码库的位置。

    Node.js

    1. 在 GitHub 上,导航到 GoogleCloudPlatform/nodejs-docs-samples
    2. 点击创建分支 (Fork)。
    3. 克隆按钮的屏幕截图。
    4. 如果出现提示,请选择克隆代码库的位置。

    Python

    1. 在 GitHub 上,导航到 GoogleCloudPlatform/python-docs-samples
    2. 点击创建分支 (Fork)。
    3. 克隆按钮的屏幕截图。
    4. 如果出现提示,请选择克隆代码库的位置。
  3. 在 Google Cloud 控制台中,进入服务页面。
  4. 进入 Service

  5. 点击 创建服务,以显示创建服务表单。
  6. 选择从代码库持续部署

    对 GitHub 代码库的更改会自动内置到 Artifact Registry 的容器映像中,并部署到 Cloud Run。

  7. 点击使用 Cloud Build 进行设置,以打开使用 Cloud Build 进行设置表单。
    1. 出现提示时,启用 Cloud Build APIArtifact Analysis API
    2. 选择 GitHub 作为代码库提供程序
    3. 如果系统提示,请点击安装 Google Cloud Build
    4. 选择克隆的 GitHub 代码库为代码库
    5. 点击下一步
    6. 分支字段中,输入 ^main$
    7. 选择 Dockerfile 作为 Build 类型,并提供 Dockerfile 的来源位置:
      • eventarc/audit-storage/Dockerfile

      • eventarc/audit_storage/Dockerfile(Go)
    8. 点击保存
  8. 创建服务表单中,输入服务名称。例如 helloworld-events
  9. 选择 us-central1(Iowa) 作为您的服务所在的区域
  10. 根据您要在 Cloud Run 服务上允许的入站流量,选择任何入站流量选项。
  11. 选择需要进行身份验证
  12. 点击创建

gcloud

  1. 克隆 GitHub 代码库:

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
    cd golang-samples/eventarc/audit_storage
    

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
    cd java-docs-samples/eventarc/audit-storage

    .NET

    git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
    cd dotnet-docs-samples/eventarc/audit-storage

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
    cd nodejs-docs-samples/eventarc/audit-storage

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    cd python-docs-samples/eventarc/audit-storage
  2. 构建容器并将其上传到 Cloud Build:
    gcloud builds submit --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/$SERVICE_NAME:v1
    
  3. 将容器映像部署到 Cloud Run:
    gcloud run deploy $SERVICE_NAME \
        --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/$SERVICE_NAME:v1
    

    在系统提示允许未经身份验证的调用时,输入 n

    部署成功后,命令行会显示服务网址。

现在,您已将名为 helloworld-events 的事件接收器服务部署到 Cloud Run,接下来可以设置触发器了。

创建 Eventarc 触发器

Eventarc 触发器会将来自 Cloud Storage 存储桶的事件发送到 helloworld-events Cloud Run 服务。

控制台

  1. 在 Google Cloud 控制台中,转到触发器页面。

    转到“触发器”

  2. 点击 创建触发器
  3. 输入触发器名称

    这是触发器的 ID,必须以字母开头。最多可包含 63 个小写字母、数字或连字符。

  4. 选择触发器类型
    • 第一方:过滤从 Google Cloud 提供方(直接或通过 Cloud Audit Logs 条目)或使用 Pub/Sub 消息的提供商发送的事件。
    • 第三方:过滤从第三方提供方发送的事件。
  5. 事件提供方列表中,选择 Cloud Storage 作为事件来源。
  6. 事件类型列表中,选择 storage.objects.create
  7. 区域列表中,选择 us-central1 以接收来自此区域的事件。
  8. 选择您创建的服务账号。例如,SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com。
  9. 事件目标位置列表中,选择 Cloud Run
  10. 选择 Cloud Run 服务列表中,选择 helloworld-events
  11. 点击创建
  12. 请注意,您还可以使用 Cloud Run 控制台页面创建 Eventarc 触发器。

gcloud

  1. 创建一个用于过滤 Cloud Storage 事件并且使用您创建的服务账号的触发器:
    gcloud eventarc triggers create events-tutorial-trigger \
        --destination-run-service=$SERVICE_NAME \
        --destination-run-region=$REGION \
        --event-filters="type=google.cloud.audit.log.v1.written" \
        --event-filters="serviceName=storage.googleapis.com" \
        --event-filters="methodName=storage.objects.create" \
        --service-account=sample-service-account@PROJECT_ID.iam.gserviceaccount.com
    PROJECT_ID 替换为 Google Cloud 项目 ID。

    其中:

    • type:指定在满足触发器的过滤条件时创建审核日志。
    • serviceName:写入审核日志的服务,即 Cloud Storage。
    • methodName:要审核的操作,即 storage.objects.create
    这将创建一个名为 events-tutorial-trigger 的触发器。
  2. 要确认 events-tutorial-trigger 已成功创建,请运行以下命令:
    gcloud eventarc triggers list --location=$REGION
  3. 此时会列出触发器 events-tutorial-trigger,其目标为 helloworld-events

生成并查看事件

  1. 要生成事件,请执行以下操作:

    控制台

    1. 使用文件名 random.txt 和文本“Hello World”创建文本文件。
    2. 在 Google Cloud 控制台中,前往存储桶页面。

      进入“存储桶”

    3. 选择您创建的存储桶。
    4. 对象标签页中,点击上传文件,然后上传 random.txt 文件。

    gcloud

    将文本文件上传到 Cloud Storage:

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://events-tutorial-PROJECT_ID/random.txt
  2. 如需查看日志条目,请执行以下操作:
  3. 控制台

    1. 在 Google Cloud 控制台中,进入服务页面。

      进入 Service

    2. 在服务列表中,点击您创建的服务的名称,以转到其服务详情页面。
    3. 点击日志标签页,以获取此服务的所有修订版本的请求日志及容器日志。您可以按日志严重级别进行过滤。
    4. 查找类似如下的日志条目:
      Detected change in Cloud Storage bucket: storage.googleapis.com/projects/_/buckets/BUCKET_NAME/objects/random.txt
      其中,BUCKET_NAME 是 Cloud Storage 存储桶的名称。

    gcloud

    1. gcloud logging read "resource.labels.service_name=helloworld-events AND textPayload:random.txt" --format=json
    2. 查找类似如下的日志条目:
      Detected change in Cloud Storage bucket: storage.googleapis.com/projects/_/buckets/BUCKET_NAME/objects/random.txt
      其中,BUCKET_NAME 是 Cloud Storage 存储桶的名称。

您已成功将事件接收器服务部署到 Cloud Run,创建 Eventarc 触发器,在 Cloud Storage 中生成事件并在 Cloud Run 日志中查看该事件。

清理

虽然当服务未在使用时 Cloud Run 不会产生费用,但您可能仍然需要为在 Artifact Registry 中存储容器映像在 Cloud Storage 存储桶中存储文件以及 Eventarc 资源付费。

您可以:

  1. 删除容器映像

  2. 删除存储桶

  3. 删除 Eventarc 触发器

或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

删除 Google Cloud 项目:

gcloud projects delete PROJECT_ID

后续步骤