本教程介绍了如何排查在使用 Eventarc 通过 Cloud Audit Logs 将事件从 Cloud Storage 路由到未经身份验证的 Cloud Run 服务时遇到的运行时错误。
目标
本教程介绍如何完成以下任务:
- 创建 Artifact Registry 标准制品库以存储您的容器映像。
- 创建 Cloud Storage 存储桶作为事件来源。
- 构建和上传容器映像,并将其部署到 Cloud Run。
- 创建 Eventarc 触发器。
- 将文件上传到 Cloud Storage 存储桶。
- 排查和修复运行时错误。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
- 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, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.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, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
如果您是项目创建者,则会被授予基本 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
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
Cloud Build Editor (
- 对于 Cloud Storage,为
ADMIN_READ
、DATA_WRITE
和DATA_READ
数据访问类型启用审核日志记录。- 读取与您的 Google Cloud 项目、文件夹或组织关联的 Identity and Access Management (IAM) 政策,并将其存储在临时文件中:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- 在文本编辑器中,打开
/tmp/policy.yaml
,然后仅在auditConfigs
部分中添加或更改审核日志配置:auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- 写入新的 IAM 政策:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
如果上述命令报告与其他更改发生冲突,请重复以上步骤(从读取 IAM 政策开始)。如需了解详情,请参阅使用 API 配置数据访问审核日志。
- 读取与您的 Google Cloud 项目、文件夹或组织关联的 Identity and Access Management (IAM) 政策,并将其存储在临时文件中:
- 将
eventarc.eventReceiver
角色授予 Compute Engine 服务账号:export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- 如果您在 2021 年 4 月 8 日或之前启用了 Pub/Sub 服务账号,请将
iam.serviceAccountTokenCreator
角色授予 Pub/Sub 服务账号:gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- 设置本教程中使用的默认值:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
创建 Artifact Registry 标准制品库
创建 Artifact Registry 标准制品库以存储您的容器映像:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
将 REPOSITORY
替换为制品库的唯一名称。
创建 Cloud Storage 存储桶
在两个区域中各创建一个 Cloud Storage 存储桶作为 Cloud Run 服务的事件来源:
在
us-east1
中创建一个存储桶:export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gsutil mb -l us-east1 gs://${BUCKET1}
在
us-west1
中创建一个存储桶:export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gsutil mb -l us-west1 gs://${BUCKET2}
创建事件来源后,在 Cloud Run 上部署事件接收器服务。
部署事件接收器
部署接收和记录事件的 Cloud Run 服务。
通过克隆 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
查看本教程的代码,其中包含以下内容:
事件处理脚本,用于接收传入事件作为 HTTP
POST
请求中的 CloudEvent:Go
Java
.NET
Node.js
Python
使用事件处理脚本的服务器:
Go
Java
.NET
Node.js
Python
用于定义服务的运营环境 Dockerfile。Dockerfile 的内容因语言而异。
Go
Java
.NET
Node.js
Python
使用 Cloud Build 构建容器映像,并将映像上传到 Artifact Registry:
export PROJECT_ID=$(gcloud config get-value project) export SERVICE_NAME=troubleshoot-service 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 \ --allow-unauthenticated
部署成功后,命令行会显示服务网址。
创建触发器
部署 Cloud Run 服务后,设置触发器以通过审核日志监听来自 Cloud Storage 的事件。
创建 Eventarc 触发器以监听使用 Cloud Audit Logs 路由的 Cloud Storage 事件:
gcloud eventarc triggers create troubleshoot-trigger \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
这将创建一个名为
troubleshoot-trigger
的触发器。要确认
troubleshoot-trigger
已创建,请运行以下命令:gcloud eventarc triggers list
输出应类似如下所示:
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
生成并查看事件
确认您已成功部署服务并可以接收来自 Cloud Storage 的事件。
创建一个文件并上传到
BUCKET1
存储桶:echo "Hello World" > random.txt gsutil cp random.txt gs://${BUCKET1}/random.txt
监控日志以检查服务是否已收到事件。如需查看日志条目,请完成以下步骤:
过滤日志条目并以 JSON 格式返回输出:
gcloud logging read "resource.labels.service_name=troubleshoot-service \ AND textPayload:random.txt" \ --format=json
查找类似如下的日志条目:
"textPayload": "Detected change in Cloud Storage bucket: ..."
请注意,系统最初不会返回任何日志条目。这表示设置中存在问题,您必须进行调查。
调查问题
完成相应过程以调查服务未收到事件的原因。
初始化时间
虽然触发器会立即创建,但触发器最多可能需要两分钟来传播和过滤事件。运行以下命令以确认触发器处于活跃状态:
gcloud eventarc triggers list
输出会指示触发器的状态。在以下示例中,troubleshoot-trigger
将在 14:16:56 之前变为活跃状态:
NAME TYPE DESTINATION_RUN_SERVICE ACTIVE
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service By 14:16:56
触发器处于活跃状态后,再次将文件上传到存储桶。事件会写入 Cloud Run 服务日志。如果服务未收到事件,可能与事件的大小有关。
审核日志
在本教程中,Cloud Storage 事件使用 Cloud Audit Logs 进行路由并发送到 Cloud Run。确认是否为 Cloud Storage 启用了审核日志。
在 Google Cloud 控制台中,进入审核日志页面。
- 选中 Google Cloud Storage 复选框。
- 确保已选择管理员读取、数据读取和数据写入日志类型。
启用 Cloud Audit Logs 后,再次将文件上传到存储桶并检查日志。如果服务仍然未收到事件,这可能与触发器位置有关。
触发器位置
不同位置可能有多个资源,您必须过滤来自与 Cloud Run 目标位于同一区域的来源的事件。如需了解详情,请参阅 Eventarc 支持的位置和了解 Eventarc 位置。
在本教程中,您将 Cloud Run 服务部署到了 us-central1
。由于您将 eventarc/location
设置为 us-central1
,因此还在同一位置创建了触发器。
但是,您在 us-east1
和 us-west1
位置创建了两个 Cloud Storage 存储桶。如需从这些位置接收事件,您必须在这些位置创建 Eventarc 触发器。
创建位于 us-east1
的 Eventarc 触发器:
确认现有触发器的位置:
gcloud eventarc triggers describe troubleshoot-trigger
将位置和区域设置为
us-east1
:gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
通过构建容器映像并将其部署到 Cloud Run 来重新部署事件接收器。
创建位于
us-east1
的新触发器:gcloud eventarc triggers create troubleshoot-trigger-new \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
确认触发器已创建:
gcloud eventarc triggers list
触发器最多可能需要两分钟来完成初始化,然后才能开始路由事件。
如需确认触发器现在已正确部署,请生成并查看事件。
您可能遇到的其他问题
使用 Eventarc 时,您可能会遇到其他问题。
事件大小
您发送的事件不得超过事件大小的限制。
之前可传送事件的触发器停止工作
验证来源正在生成事件。检查 Cloud Audit Logs 并确保受监控服务正在发出日志。如果记录了日志,但事件未被传送,请与支持团队联系。
验证存在与触发器同名的 Pub/Sub 主题。 Eventarc 使用 Pub/Sub 作为其传输层,并且使用现有的 Pub/Sub 主题,或者自动为您创建主题并进行管理。
- 如需列出触发器,请参阅
gcloud eventarc triggers list
。 如需列出 Pub/Sub 主题,请运行以下命令:
gcloud pubsub topics list
验证 Pub/Sub 主题名称是否包含已创建的触发器的名称。例如:
name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123
如果缺少 Pub/Sub 主题,请再次为特定提供商、事件类型和 Cloud Run 目标位置创建触发器。
- 如需列出触发器,请参阅
验证是否已为服务配置触发器。
在 Google Cloud 控制台中,进入服务页面。
点击相应服务的名称,打开其服务详情页面。
点击触发器标签页。
系统应该会列出与服务关联的 Eventarc 触发器。
使用 Pub/Sub 指标类型验证 Pub/Sub 主题和订阅的健康状况。
您可以使用
subscription/dead_letter_message_count
指标监控转发的无法传送的消息。此指标显示 Pub/Sub 从订阅转发的无法传送的消息数量。如果消息未发布到主题,请检查 Cloud Audit Logs 并确保受监控服务正在发出日志。如果记录了日志,但事件未被传送,请与支持团队联系。
您可以使用
subscription/push_request_count
指标并按response_code
和subcription_id
对指标进行分组,以便监控推送订阅如果报告了推送错误,请检查 Cloud Run 服务日志。如果接收端点返回不正常状态代码,则表示 Cloud Run 代码未按预期工作,您必须与支持团队联系。
如需了解详情,请参阅创建指标阈值提醒政策。
清理
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除教程资源
删除您在本教程中部署的 Cloud Run 服务:
gcloud run services delete SERVICE_NAME
其中,
SERVICE_NAME
是您选择的服务名称。您还可以从 Google Cloud 控制台中删除 Cloud Run 服务。
移除您在教程设置过程中添加的任何 gcloud CLI 默认配置。
例如:
gcloud config unset run/region
或
gcloud config unset project
删除在本教程中创建的其他 Google Cloud 资源:
- 删除 Eventarc 触发器:
将gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
替换为您的触发器的名称。
- 删除 Eventarc 触发器: