本教程介绍如何使用 Cloud Audit Logs 部署经身份验证的 Cloud Run 服务,该服务接收来自 Cloud Storage 的事件。使用本教程部署生产工作负载。Eventarc 触发器根据 Cloud Audit Logs 条目过滤事件。如需了解详情,请参阅确定 Cloud Audit Logs 的事件过滤条件。
您可以使用 Google Cloud Console 或 Google Cloud CLI 来完成本教程。
目标
在此教程中,您将学习以下操作:
创建 Cloud Storage 存储桶作为事件来源。
将事件接收器服务部署到 Cloud Run。
创建 Eventarc 触发器。
通过将文件上传到 Cloud Storage 存储桶来创建事件,并在 Cloud Run 日志中查看该事件。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner
)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。
如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。
请注意,默认情况下,Cloud Build 权限包含上传和下载 Artifact Registry 工件的权限。
所需权限
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Cloud Build Editor (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Eventarc Admin (
roles/eventarc.admin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Admin (
roles/serviceusage.serviceUsageAdmin
) -
Storage Admin (
roles/storage.admin
)
如需详细了解如何授予角色,请参阅管理访问权限。
使用 Google Cloud 控制台或 gcloud CLI 完成以下步骤:
控制台
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage 和 Eventarc API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage 和 Eventarc API.
- 如需配置审核日志中记录的数据访问,请为 Google Cloud Storage 启用管理员读取、数据读取和数据写入日志类型:
-
在 Google Cloud 控制台中,转到服务账号页面。
- 点击创建服务账号。
-
输入要在 Google Cloud 控制台中显示的服务账号名称。
Google Cloud 控制台会根据此名称生成服务账号 ID。如有必要,请修改 ID。此 ID 创建后便无法更改。
- 可选:输入服务账号的说明。
-
如果您现在不想设置访问权限控制,请点击完成以完成服务账号的创建过程。
如需立即设置访问权限控制,请点击创建并继续,然后继续执行下一步。
- 选择项目的 Cloud Run Invoker 和 Eventarc 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.
- 完成添加角色后,点击继续和完成以完成服务账号的创建过程。
gcloud
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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
- 更新
gcloud
组件:gcloud components update
- 使用您的账号登录:
gcloud auth login
- 设置本教程中使用的配置变量:
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
- 如需配置在审核日志中记录哪些数据访问,请为
storage.googleapis.com
服务启用ADMIN_READ
、DATA_READ
和DATA_WRITE
日志类型:- 读取您项目的 IAM 政策,并将其存储在一个文件中:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- 在
/tmp/policy.yaml
中修改政策,仅添加或更改数据访问审核日志配置。auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com
- 写入新的 IAM 政策:
如果上述命令报告与其他更改发生冲突,请重复以上步骤(从读取项目的 IAM 政策开始)。gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
- 读取您项目的 IAM 政策,并将其存储在一个文件中:
- 为项目创建服务账号:
创建服务账号后,最多可能需要 7 分钟才能使用该服务账号。如果您在创建服务账号后立即尝试使用该服务账号,并且收到错误消息,请至少等待 60 秒再重试。gcloud iam service-accounts create sample-service-account \ --description="A sample service account" \ --display-name="Sample service account"
- 如需确认
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
- 向与 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 标准制品库以存储您的容器映像。控制台
- 在 Google Cloud 控制台中,进入制品库页面。
- 点击 创建制品库。
- 配置您的制品库:
- 输入唯一的名称。
- 在格式字段中,选择 Docker。
- 在模式字段中,选择标准。
- 在位置类型字段中,选择区域。
- 在区域列表中,选择 us-central1(爱荷华)。
- 接受其他默认值,然后点击创建。
gcloud
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
将 REPOSITORY
替换为 Artifact Registry 制品库的唯一名称。
创建 Cloud Storage 存储桶
本教程使用 Cloud Storage 作为事件来源。要创建存储桶,请执行以下操作:
控制台
- 在 Google Cloud 控制台中,前往存储桶页面。
- 点击 创建存储桶。
- 输入您的存储桶信息,然后点击继续以完成各个步骤:
- 请输入具有唯一性的名称。例如
eventarcbucket
。 - 选择区域作为位置类型。
- 选择 us-central1 (Iowa) 作为位置。
- 为默认存储类别选择标准。
- 在访问权限控制中选择统一。
- 请输入具有唯一性的名称。例如
- 点击创建。
gcloud
gsutil mb -l $REGION gs://events-tutorial-PROJECT_ID/
创建事件来源后,您可以在 Cloud Run 上部署事件接收器服务。
将事件接收器服务部署到 Cloud Run
部署接收和记录事件的 Cloud Run 服务。要部署示例事件接收器服务,请执行以下操作:
控制台
- 将示例代码库克隆到 GitHub 账号:
- 在 GitHub 上,导航到 GoogleCloudPlatform/golang-samples
- 点击创建分支 (Fork)。
- 如果出现提示,请选择克隆代码库的位置。
- 在 GitHub 上,导航到 GoogleCloudPlatform/java-docs-samples。
- 点击创建分支 (Fork)。
- 如果出现提示,请选择克隆代码库的位置。
- 在 GitHub 上,导航到 GoogleCloudPlatform/dotnet-docs-samples。
- 点击创建分支 (Fork)。
- 如果出现提示,请选择克隆代码库的位置。
- 在 GitHub 上,导航到 GoogleCloudPlatform/nodejs-docs-samples。
- 点击创建分支 (Fork)。
- 如果出现提示,请选择克隆代码库的位置。
- 在 GitHub 上,导航到 GoogleCloudPlatform/python-docs-samples。
- 点击创建分支 (Fork)。
- 如果出现提示,请选择克隆代码库的位置。
- 在 Google Cloud 控制台中,进入服务页面。
- 点击 创建服务,以显示创建服务表单。
- 选择从代码库持续部署。
对 GitHub 代码库的更改会自动内置到 Artifact Registry 的容器映像中,并部署到 Cloud Run。
- 点击使用 Cloud Build 进行设置,以打开使用 Cloud Build 进行设置表单。
- 出现提示时,启用 Cloud Build API 和 Artifact Analysis API。
- 选择 GitHub 作为代码库提供程序。
- 如果系统提示,请点击安装 Google Cloud Build。
- 选择克隆的 GitHub 代码库为代码库。
- 点击下一步。
- 在分支字段中,输入
^main$
。 - 选择 Dockerfile 作为 Build 类型,并提供 Dockerfile 的来源位置:
eventarc/audit-storage/Dockerfile
或
eventarc/audit_storage/Dockerfile
(Go)
- 点击保存。
- 在创建服务表单中,输入服务名称。例如
helloworld-events
。 - 选择 us-central1(Iowa) 作为您的服务所在的区域。
- 根据您要在 Cloud Run 服务上允许的入站流量,选择任何入站流量选项。
- 选择需要进行身份验证
- 点击创建。
Go
Java
.NET
Node.js
Python
gcloud
- 克隆 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
- 构建容器并将其上传到 Cloud Build:
gcloud builds submit --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/$SERVICE_NAME:v1
- 将容器映像部署到 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 服务。
控制台
- 在 Google Cloud 控制台中,转到触发器页面。
- 点击 创建触发器。
- 输入触发器名称。
这是触发器的 ID,必须以字母开头。最多可包含 63 个小写字母、数字或连字符。
- 选择触发器类型:
- 第一方:过滤从 Google Cloud 提供方(直接或通过 Cloud Audit Logs 条目)或使用 Pub/Sub 消息的提供商发送的事件。
- 第三方:过滤从第三方提供方发送的事件。
- 在事件提供方列表中,选择 Cloud Storage 作为事件来源。
- 在事件类型列表中,选择 storage.objects.create。
- 在区域列表中,选择 us-central1 以接收来自此区域的事件。
- 选择您创建的服务账号。例如,
SERVICE_ACCOUNT_ID@PROJECT_ID
.iam.gserviceaccount.com。 - 在事件目标位置列表中,选择 Cloud Run。
- 在选择 Cloud Run 服务列表中,选择 helloworld-events。
- 点击创建。 请注意,您还可以使用 Cloud Run 控制台页面创建 Eventarc 触发器。
gcloud
- 创建一个用于过滤 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
的触发器。 - 要确认
events-tutorial-trigger
已成功创建,请运行以下命令:gcloud eventarc triggers list --location=$REGION
此时会列出触发器
events-tutorial-trigger
,其目标为 helloworld-events
。
生成并查看事件
- 要生成事件,请执行以下操作:
控制台
- 使用文件名
random.txt
和文本“Hello World”创建文本文件。 - 在 Google Cloud 控制台中,前往存储桶页面。
- 选择您创建的存储桶。
- 在对象标签页中,点击上传文件,然后上传
random.txt
文件。
gcloud
将文本文件上传到 Cloud Storage:
echo "Hello World" > random.txt gsutil cp random.txt gs://events-tutorial-PROJECT_ID/random.txt
- 使用文件名
- 如需查看日志条目,请执行以下操作:
- 在 Google Cloud 控制台中,进入服务页面。
- 在服务列表中,点击您创建的服务的名称,以转到其服务详情页面。
- 点击日志标签页,以获取此服务的所有修订版本的请求日志及容器日志。您可以按日志严重级别进行过滤。
- 查找类似如下的日志条目:
其中,Detected change in Cloud Storage bucket: storage.googleapis.com/projects/_/buckets/BUCKET_NAME/objects/random.txt
BUCKET_NAME
是 Cloud Storage 存储桶的名称。 -
gcloud logging read "resource.labels.service_name=helloworld-events AND textPayload:random.txt" --format=json
- 查找类似如下的日志条目:
其中,Detected change in Cloud Storage bucket: storage.googleapis.com/projects/_/buckets/BUCKET_NAME/objects/random.txt
BUCKET_NAME
是 Cloud Storage 存储桶的名称。
控制台
gcloud
您已成功将事件接收器服务部署到 Cloud Run,创建 Eventarc 触发器,在 Cloud Storage 中生成事件并在 Cloud Run 日志中查看该事件。
清理
虽然当服务未在使用时 Cloud Run 不会产生费用,但您可能仍然需要为在 Artifact Registry 中存储容器映像、在 Cloud Storage 存储桶中存储文件以及 Eventarc 资源付费。您可以:
或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID