概述

一、配置和使用 GCS 审计日志

二、配置和使用 GCS Usage Logs

三、将 GCS Usage Logs 导入到 BigQuery 进行结构化存储和查询


概述

Google Cloud Storage (GCS) 是 Google Cloud 的对象存储,适用于长期存储视频、图片、日志等非结构化内容文件。如果涉及到海量用户内容上传和下载,那么追踪对象访问记录,进行统计分析和错误排查,会是一个常见的需求。这时可以利用 GCS 的访问日志来满足需求。下面介绍开通和使用 GCS 访问日志的一些方法。

一、配置和使用 GCS 审计日志

Google Cloud 很多产品都提供审计日志,帮助用户查询“谁,在何地,做了什么”的问题。GCS 的审计日志包含 Admin Activity Logs 和 Data Access Logs。我们可以用 Data Access Logs 审计日志来查看不同用户对 GCS 上对象文件的访问操作。

为了节省用户费用,GCS 的审计日志默认是关闭的。可以在控制台 IAM 菜单的 Audit Logs 查看其状态,并将其打开。

如果 Google Cloud Stroage 的各个审计日志项都是”-”状态,说明没有打开。可以选中后在右侧配置面板打开各项日志,并保存配置。

审计日志打开后,其状态应该如下所示。

审计日志打开后,对象的访问日志会实时导入到 Google Cloud 日志服务。可以在日志服务的 Log Explorer 中进行查看。注意在查询表达式栏中输入’resource.type=”gcs_bucket”’。

在列出的对象访问日志中,可以查看到每次访问的详细信息。比如展开一个访问记录,可以看到访问的操作是创建或下载,访问的用户账号,访问的对象 URI,访问的结果等等。

需要注意的是,Storage Audit Log 审计日志开启后,可以看到授权实名用户访问的记录。但是看不到匿名用户的访问记录,和通过 Google Cloud CDN 的访问记录。

比如用下面两种方式访问对象,不会产生日志。

1. 直接用对象链接下载

$ curl https://storage.googleapis.com/hk-publish/index.html

2. 通过 CDN 下载

$ curl http://35.244.150.103/index.html

如果需要查看匿名用户的访问记录,那么需要使用 GCS 的 Usage Logs。

二、配置和使用 GCS Usage Logs

GCS 的 Usage Logs 不像审计日志一样自动导入到日志服务,而是会导出到对象存储。所以首先需要创建一个存放日志的对象存储桶。

gsutil mb -l ASIA-EAST2 gs://youzhi-lab-logs-bucket 

给 Usage Logs 服务的服务账号提供写访问日志存储桶的权限。

gsutil iam ch group:cloud-storage-analytics@google.com:legacyBucketWriter gs://youzhi-lab-logs-bucket

打开目标桶的 Usage Logs,并将其日志输出桶设为刚建好的日志存储桶。同时也可以设置一个日志文件前缀,相当于目录。

gsutil logging set on -b gs://youzhi-lab-logs-bucket -o hk-publish-access-log/ gs://hk-publish

确认目标桶的日志已经打开。

gsutil logging get gs://hk-publish

应该看到类似如下输出。

{"logBucket": "youzhi-lab-logs-bucket", "logObjectPrefix": "hk-publish-access-log/"}

日志打开之后,GCS 日志服务会每小时一次把目标桶的访问日志输出到日志存储桶,生成日志文件。可以等1-2小时后到日志存储桶查看。

但是手工下载和查看日志存储桶中的众多文件非常耗时,也不方便。我们建议将日志再转存到 Google Cloud 数据仓库 BigQuery,方便使用 SQL 进行查询,也可以接入其它数据分析工具和展示报表。

三、将 GCS Usage Logs 导入到 BigQuery 进行结构化存储和查询

首先创建一个 BigQuery 数据集,用来存放 GCS 日志。下面操作使用 BigQuery 的命令行工具。但也可以在控制台操作。

bq mk --location asia-east2 storage_logs

下面要用官方提供的 schema 文件创建一个数据表,并导入一个日志文件。可以到日志文件存储桶,拷贝一个 Usage Logs 日志文件的 URI。

下载 Schema 文件并导入一个日志文件。导入任务会根据 Schema 文件自动创建一个表。

wget http://storage.googleapis.com/pub/cloud_storage_usage_schema_v0.json

bq load --skip_leading_rows=1 storage_logs.usage \\
gs://youzhi-lab-logs-bucket/hk-publish-access-log/_usage_2020_12_07_02_00_00_04a229c0feedd60cb4_v0 \\
./cloud_storage_usage_schema_v0.json

导入完成后,可以到 BigQuery 控制台查看表中的数据。

上述操作成功后,删除导入的日志文件,并导入剩余的其它日志文件。

gsutil rm gs://youzhi-lab-logs-bucket/hk-publish-access-log/_usage_2020_12_07_02_00_00_04a229c0feedd60cb4_v0

bq load --skip_leading_rows=1 storage_logs.usage \\
"gs://youzhi-lab-logs-bucket/hk-publish-access-log/_usage_2020*" \\
./cloud_storage_usage_schema_v0.json

导入完成后会看到如下提示。

可以在 BigQuery 中用对象名搜索特定对象的访问记录列表。

以上是用命令行对存量日志做批量导入。对增量日志,也可以用定时导入任务来自动化导入。

首先删除之前已经导入过的日志。

gsutil rm "gs://youzhi-lab-logs-bucket/hk-publish-access-log/_usage_2020*"

然后在 BigQuery 的 Data Transfers 菜单创建一个导入任务。进行如下配置。注意选择的频率是每小时一次——这是自动任务可以执行的最高频率。另外,写入模式为 Append,追加写入。

定时导入任务配置完后,点击保存。等待几小时,可以看到完成的任务状态。

之后,可以在 BigQuery 里随时查看 GCS 的对象访问记录,也可以用程序执行查询,根据结果触发后续操作。

不过需要注意,通过 gsutil 工具,或者控制台做的上传、修改、下载等操作,由于属于审计日志范畴,不会在 Usage Log 里记录。这些日志需要通过第一节所介绍的审计日志查看方式来查询。


相关推荐