1. 總覽
在現代組織中,來自各種來源的資料量不斷增加。這通常需要隔離及分類資料,以便策略性地儲存及保護資料,但如果仍以手動方式進行,這項工作很快就會變得既昂貴又不可能。
在本程式碼研究室中,我們將瞭解如何自動分類上傳至 Cloud Storage 的資料,並將資料移至對應的儲存空間值區。我們會使用 Cloud Pub/Sub、Cloud Functions、Cloud Data Loss Prevention 和 Cloud Storage 達成這個目標。
學習內容
- 建立 Cloud Storage bucket,做為隔離和分類管道的一部分。
- 建立一個簡單的 Cloud Functions 函式,在上傳檔案時叫用 DLP API。
- 建立 Pub/Sub 主題和訂閱項目,以在檔案處理完成時收到通知。
- 將範例檔案上傳至隔離值區,以叫用 Cloud Functions 函式
- 使用 DLP API 檢查及分類檔案,並將檔案移至適當的值區。
軟硬體需求
- 已設定帳單的 Google Cloud 專案。如果沒有,請建立一個。
2. 開始設定
在本程式碼研究室中,我們將使用 Cloud Shell,透過指令列佈建及管理不同的雲端資源和服務。下列指令會開啟 Cloud Shell 和 Cloud Shell 編輯器,並複製隨附專案存放區:
請執行 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 是專為儲存及存取 Google 基礎架構資料且符合 REST 樣式的服務。
服務帳戶權限
服務帳戶是特殊類型的帳戶,應用程式和虛擬機器可透過這類帳戶發出授權 API 呼叫。
App Engine 預設服務帳戶
App Engine 預設服務帳戶會代表在 App Engine 中執行的應用程式,在 Cloud 專案中執行工作。根據預設,這個服務帳戶會存在於專案中,並獲派「編輯者」角色。
首先,我們會將管理資料外洩防護工作所需的 DLP 管理員角色授予服務帳戶:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.admin
最後,授予 DLP API 服務代理人角色,讓服務帳戶取得 BigQuery、儲存空間、資料儲存庫、Pub/Sub 和金鑰管理服務的權限:
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 時,系統會自動建立這個服務帳戶,且一開始不會授予任何角色。現在就來授予檢視者角色:
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 bucket
現在我們需要建立 3 個 Cloud Storage 值區來儲存資料:
- 隔離區儲存空間:資料一開始會上傳至這個位置。
- 機密資料 bucket:DLP API 判斷為機密的資料會移至這個 bucket。
- 非機密資料 bucket:DLP API 判斷為非機密的資料會移至這個 bucket
我們可以一次使用 gsutil 指令建立所有三個 bucket:
gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
請記下剛才建立的 bucket 名稱,後續步驟會用到。
4. Pub/Sub 主題和訂閱項目
Cloud Pub/Sub 可在應用程式之間提供多對多的非同步訊息傳遞功能。發布者會建立訊息,並發布至稱為「主題」的訊息來源。訂閱者會透過訂閱項目接收這些訊息。根據該訂閱項目,在本例中,DLP 工作執行完畢後,Cloud Function 會將檔案移至各自的 bucket。
首先,請建立主題。每當有檔案新增至隔離區儲存空間值區,系統就會在這裡發布訊息。我們將其命名為「classify-topic」
gcloud pubsub topics create classify-topic
主題發布訊息時,系統會通知訂閱項目。現在,請建立名為「classify-sub」的 Pub/Sub 訂閱項目:
gcloud pubsub subscriptions create classify-sub --topic classify-topic
該訂閱項目會觸發第二個 Cloud Function,啟動 DLP 工作來檢查檔案,並將檔案移至適當位置。
5. Cloud Functions
Cloud Functions 可讓我們部署依事件執行的簡易非同步單一用途函式,完全不必管理伺服器或執行階段環境。我們將使用 dlp-cloud-functions-tutorials/gcs-dlp-classification-python/ 中的 main.py 檔案,部署 2 個 Cloud 函式
取代變數
建立函式前,我們需要先替換 main.py 檔案中的部分變數。
在 Cloud Shell 編輯器中,調整 main.py,將第 28 到 34 行的專案 ID 和 bucket 變數值,替換為先前建立的對應 bucket:
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 中,將目錄變更為 gcs-dlp-classification-python,其中包含 main.py 檔案:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python
現在可以部署一些函式了。
首先,請部署 create_DLP_job 函式,並將 [YOUR_QUARANTINE_BUCKET] 換成正確的值區名稱。只要有新檔案上傳至指定的 Cloud Storage 隔離區 bucket,就會觸發這項函式,並為每個上傳的檔案建立 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 指令,確認兩個雲端函式是否都已成功部署:
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
如要瞭解設定會如何處理檔案,請將所有測試檔案上傳至隔離區
bucket:
gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]
一開始,檔案會放在我們上傳檔案的隔離區值區中。如要驗證這點,請在上傳檔案後立即列出隔離 bucket 的內容:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
如要查看我們啟動的一連串事件,請先前往 Cloud Functions 頁面:
按一下「create_DLP_job」create_DLP_job函式的「動作」選單,然後選取「查看記錄檔」:

在函式的記錄中,我們看到每個檔案至少有 4 個項目,指出:
- 函式執行作業已啟動
- 函式已針對特定檔案觸發
- 已建立工作
- 函式已執行完畢

每個檔案的 create_DLP_job 函式完成後,系統就會啟動對應的 DLP 工作。前往 DLP 工作頁面,查看佇列中的 DLP 工作清單:
畫面上會列出「待處理」、「執行中」或「已完成」的工作。每個檔案都對應我們上傳的其中一個檔案:

點選任一工作 ID 即可查看詳細資料。
返回 Cloud Functions 頁面並查看 resolve_DLP 函式的記錄,您會看到每個檔案至少有 8 個項目,表示:
- 函式執行作業已啟動
- 收到 Pub/Sub 通知
- 對應的資料遺失防護工作名稱
- 狀態碼
- 機密資料的例項數量 (如有)
- 檔案要移至的值區
- 資料遺失防護工作已完成檔案剖析
- 函式已執行完畢

所有對 resolve_DLP 函式的呼叫執行完畢後,請再次查看隔離區儲存空間的內容:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
這次應該完全空白。不過,如果您對其他值區執行上述相同指令,就會發現檔案已完美地分別存放在對應的值區中!
7. 清除
我們已瞭解如何搭配使用 DLP API 和 Cloud Functions 來分類資料,現在要清除專案中建立的所有資源。
刪除專案
如有需要,也可以刪除整個專案。前往 GCP 主控台的「Cloud Resource Manager」頁面:
在專案清單中,選取我們一直在處理的專案,然後按一下「刪除」。系統會提示您輸入專案 ID。輸入後,按一下「關機」。
或者,您也可以直接透過 Cloud Shell 和 gcloud 刪除整個專案:
gcloud projects delete [PROJECT_ID]
如要逐一刪除不同元件,請參閱下一節。
Cloud Functions
使用 gcloud 刪除這兩個雲端函式:
gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP
儲存空間 Bucket
使用 gsutil 移除所有上傳的檔案,並刪除 buckets:
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 Function
- 我們建立了 Cloud Functions,可啟動 DLP 工作,根據檔案中包含的機密資料進行分類
- 我們上傳了測試資料,並查看 Cloud Functions 的 Stackdriver 記錄,瞭解實際運作情形