1. 概览
在现代组织中,来自各种来源的数据数量与日俱增。这通常需要隔离和分类数据,以便有策略地存储和保护数据。如果仍然需要手动处理数据,这项任务将很快变得成本高昂且无法完成。
在此 Codelab 中,我们将了解如何自动对上传到 Cloud Storage 的数据进行分类,并将其移动到相应的存储分区。我们将使用 Cloud Pub/Sub、Cloud Functions、Cloud Data Loss Prevention 和 Cloud Storage 完成此操作。
您将执行的操作
- 创建 Cloud Storage 存储分区,以用作隔离和分类流水线的一部分。
- 创建一个在上传文件时调用 DLP API 的简单 Cloud Functions 函数。
- 创建 Pub/Sub 主题和订阅,以在文件处理完成时向您发出通知。
- 将示例文件上传到隔离区以调用 Cloud Functions 函数
- 使用 DLP API 对文件进行检查和分类,并将其移动到适当的存储分区。
所需条件
- 设置了结算信息的 Google Cloud 项目。如果没有,您必须创建一个。
2. 准备工作
在此 Codelab 中,我们将通过 Cloud Shell 使用命令行预配和管理不同的云资源和服务。以下命令将打开 Cloud Shell 和 Cloud Shell Editor,并克隆配套项目代码库:
使用 gcloud config set project [PROJECT_ID]
设置项目,以确保使用的项目正确无误
启用 API
在您的 Google Cloud 项目上启用所需的 API:
- Cloud Functions API - 管理轻量级用户提供的为响应事件而执行的函数。
- Cloud Data Loss Prevention (DLP) API - 提供检测、风险分析和去标识化文本、图片和 Google Cloud Platform 存储库中隐私敏感片段的方法。
- Cloud Storage - Google Cloud Storage 是一项 RESTful 服务,用于在 Google 的基础架构上存储和访问数据。
服务账号权限
服务账号是一种特殊类型的账号,应用和虚拟机使用它来进行已获授权的 API 调用。
App Engine 默认服务账号
App Engine 默认服务账号用于代表在 App Engine 中运行的应用执行 Cloud 项目中的任务。默认情况下,此服务账号存在于您的项目中,并且分配有 Editor 角色。
首先,我们将向服务账号授予管理数据泄露防护作业所需的 DLP Administrator 角色:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.admin
最后,授予 DLP API Service Agent 角色,该角色将允许服务账号对 bigquery、storage、datastore、pubsub 和 Key Management 服务的权限:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.serviceAgent
DLP 服务账号
除了 App Engine 服务账号之外,我们还将使用 DLP 服务账号。此服务账号是在启用 DLP API 时自动创建的,最初未被授予任何角色。我们来为其授予 Viewer 角色:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:service-`gcloud projects list --filter="PROJECT_ID:$GOOGLE_CLOUD_PROJECT" --format="value(PROJECT_NUMBER)"`@dlp-api.iam.gserviceaccount.com \ --role roles/viewer
3. Cloud Storage 存储分区
现在,我们需要创建 3 个 Cloud Storage 存储分区来存储数据:
- 隔离存储分区:我们的数据最初会上传到此处。
- 敏感数据存储分区:由 DLP API 确定的敏感数据将移至此处。
- 非敏感数据存储分区:由 DLP API 确定的不属于敏感数据的数据将移至此处
我们可以使用 gsutil 命令一次性创建所有三个存储分区:
gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
记下您刚刚创建的存储分区的名称,稍后我们会用到。
4. Pub/Sub 主题和订阅
Cloud Pub/Sub 在应用之间提供多对多的异步消息传递。发布者将创建一条消息并将其发布到称为“主题”的消息 Feed 中。订阅者将通过订阅来接收这些消息。在我们的例子中,基于该订阅,我们会在 DLP 作业运行后让 Cloud Functions 函数将文件移动到其各自的存储分区中。
首先,我们来创建一个主题。每次向我们的隔离区存储分区添加文件时,系统都会在此处发布一条消息。我们将其命名为“classify-topic”
gcloud pubsub topics create classify-topic
当主题发布消息时,订阅将收到通知。我们来创建一个名为“classify-sub”的 PubSub 订阅:
gcloud pubsub subscriptions create classify-sub --topic classify-topic
该订阅将触发第二个 Cloud Functions 函数,该函数将启动 DLP 作业,该作业将检查文件并将其移动到正确位置。
5. Cloud Functions
借助 Cloud Functions,我们可以部署基于事件的轻量级异步单一用途函数,而无需管理服务器或运行时环境。我们将使用提供的 main.py
文件(位于 dlp-cloud-functions-tutorials/gcs-dlp-classification-python/
)部署 2 个 Cloud Functions 函数
替换变量
我们需要先替换 main.py
文件中的一些变量,然后才能创建函数。
在 Cloud Shell 编辑器中,使用之前创建的相应存储分区替换第 28 到 34 行的项目 ID 和存储分区变量的值,从而调整 main.py:
main.py
PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
"""The bucket the to-be-scanned files are uploaded to."""
STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
"""The bucket to move "sensitive" files to."""
SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
"""The bucket to move "non sensitive" files to."""
NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'
此外,请将 pub/sub 主题变量的值替换为在上一步中创建的 pub/sub 主题:
""" Pub/Sub topic to notify once the DLP job completes."""
PUB_SUB_TOPIC = 'classify-topic'
部署函数
在 Cloud Shell 中,将目录更改为 main.py
文件所在的 gcs-dlp-classification-python:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python
现在该部署一些函数了。
首先,部署 create_DLP_job
函数,将 [YOUR_QUARANTINE_BUCKET] 替换为正确的存储分区名称。此函数会在有新文件上传到指定的 Cloud Storage 隔离区时触发,并会为每个上传的文件创建 DLP 作业:
gcloud functions deploy create_DLP_job --runtime python37 \ --trigger-event google.storage.object.finalize \ --trigger-resource [YOUR_QUARANTINE_BUCKET]
接下来,部署 resolve_DLP
函数,指明我们的主题作为该函数的触发器。此函数会监听上述函数的后续 DLP 作业中启动的 Pub/Sub 通知。一旦收到 Pub/Sub 通知,它就会获取 DLP 作业的结果,并相应地将文件移动到敏感存储分区或非敏感存储分区:
gcloud functions deploy resolve_DLP --runtime python37 \ --trigger-topic classify-topic
验证
使用 gcloud functions describe
命令验证两个 Cloud Functions 函数是否已成功部署:
gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP
成功部署后,输出将读取 ACTIVE
以了解状态。
6. 使用示例数据进行测试
完成所有设置后,我们现在可以使用一些示例文件进行测试。在 Cloud Shell 中,将当前工作目录更改为 sample_data
:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data
我们的示例文件由 txt 和 csv 文件组成,其中包含各种数据。带有“sample_s”前缀的文件将包含敏感数据,而前缀为“sample_n”则不能。例如,sample_s20.csv 包含的格式为美国社会保障号:
sample_s20.csv
Name,SSN,metric 1,metric 2
Maria Johnson,284-73-5110,5,43
Tyler Parker,284-73-5110,8,17
Maria Johnson,284-73-5110,54,63
Maria Johnson,245-25-8698,53,19
Tyler Parker,475-15-8499,6,67
Maria Johnson,719-12-6560,75,83
Maria Johnson,616-69-3226,91,13
Tzvika Roberts,245-25-8698,94,61
另一方面,sample_n15.csv 中的数据不会被视为敏感数据:
sample_n15.csv
record id,metric 1,metric 2,metric 3
1,59,93,100
2,53,13,17
3,59,67,53
4,52,93,34
5,14,22,88
6,18,88,3
7,32,49,5
8,93,46,14
为了了解设置会如何处理文件,请将所有测试文件上传到隔离区
存储分区:
gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]
最初,我们的文件会位于我们所上传文件的隔离区中。如需验证这一点,请在上传文件后立即列出隔离区的内容:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
如需查看我们已经启动的一系列活动,请先前往 Cloud Functions 页面:
点击 create_DLP_job 函数的“操作”菜单,然后选择“查看日志”:
在此函数的日志中,我们至少会看到每个文件对应的 4 个条目,这表明:
- 函数执行已开始
- 已针对特定文件触发了该函数
- 已创建作业
- 函数已执行完毕
针对每个文件的 create_DLP_job 函数完成后,系统会启动相应的 DLP 作业。前往 DLP 作业页面,查看队列中的 DLP 作业列表:
您将看到“待处理”“正在运行”或“已完成”的作业列表。其中每个文件都与我们上传的一个文件对应:
您可以点击其中任一作业的 ID 来查看更多详情。
如果您返回 Cloud Functions 页面并检查 resolve_DLP 函数,则会看到每个文件至少 8 个条目,分别表示:
- 函数执行已开始
- 收到 Pub/Sub 通知
- 相应 DLP 作业的名称
- 状态代码
- 敏感数据的实例数(如果有)
- 文件将移动到的存储分区
- DLP 作业已完成文件解析
- 函数已执行完毕
在对 resolve_DLP 函数的所有调用都完成运行后,再次查看隔离区的内容:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
这次,它应该是完全空的。不过,如果您针对其他存储分区运行相同的命令,会发现我们的文件已完全隔离到对应的存储分区中!
7. 清理
现在,我们已经了解了如何将 DLP API 与 Cloud Functions 结合使用来对数据进行分类,下面我们来清理项目,使其包含已创建的所有资源。
删除项目
如果您愿意,可以删除整个项目。在 GCP Console 中,转到 Cloud Resource Manager 页面:
在项目列表中,选择我们一直使用的项目,然后点击删除。此时,系统会提示您输入项目 ID。输入项目 ID,然后点击关停。
或者,您可以使用 gcloud 直接从 Cloud Shell 中删除整个项目:
gcloud projects delete [PROJECT_ID]
如果您希望逐个删除不同的组件,请继续学习下一部分。
Cloud Functions
使用 gcloud 删除我们的两个 Cloud Functions 函数:
gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP
存储分区
使用 gsutil 移除所有已上传的文件并删除存储分区:
gsutil rm -r gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
Pub/Sub
首先使用 gcloud 删除 Pub/Sub 订阅:
gcloud pubsub subscriptions delete classify-sub
最后,使用 gcloud 删除 Pub/Sub 主题:
gcloud pubsub topics delete classify-topic
8. 恭喜!
哇哈!你做到了。您已了解如何结合使用 DLP API 和 Cloud Functions 来自动对文件进行分类!
所学内容
- 我们创建了 Cloud Storage 存储分区来存储我们的敏感数据和非敏感数据
- 我们创建了 Pub/Sub 主题和订阅来触发 Cloud Functions 函数
- 我们创建了 Cloud Functions,旨在启动 DLP 作业,根据文件中包含的敏感数据对文件进行分类
- 我们上传了测试数据,并查看了 Cloud FunctionsStackdriver 日志(用于了解进程的运行情况)