清理未使用的孤立永久磁碟
实验
20 分钟
universal_currency_alt
5 积分
show_chart
中级
info
此实验可能会提供 AI 工具来支持您学习。
此内容尚未针对移动设备进行优化。
为获得最佳体验,请在桌面设备上访问通过电子邮件发送的链接。
GSP648

總覽
本實驗室會帶您運用 Cloud Functions 和 Cloud Scheduler,找出並清理浪費的雲端資源。過程中,您將排定 Cloud 函式的執行時間,找出並清理未連接的孤立永久磁碟。
學習內容
- 建立兩個永久磁碟。
- 建立 VM 並使用其中一個磁碟。
- 從 VM 卸載磁碟。
- 查看 Cloud 函式程式碼。
- 部署 Cloud 函式。
- 使用 Cloud Scheduler 工作測試 Cloud 函式。
架構
下圖說明本實驗室第一節使用的架構,您將排定 Cloud 函式的執行時間,找出並清理未使用的孤立永久磁碟。

設定和需求
在本節中,您將設定基礎架構和完成實驗室所需的身分。
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始研究室及登入 Google Cloud 控制台
-
點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要使用 Google Cloud 產品和服務,請點選「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
-
點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示
。
-
系統顯示視窗時,請按照下列步驟操作:
- 繼續操作 Cloud Shell 視窗。
- 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。
連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID:。輸出內容中有一行文字,宣告本工作階段的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
- 點按「授權」。
輸出內容:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project
輸出內容:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南。
工作 1:啟用 API 並複製存放區
-
在 Cloud Shell 啟用 Cloud Scheduler API:
gcloud services enable cloudscheduler.googleapis.com
-
複製存放區:
gsutil cp -r gs://spls/gsp648 . && cd gsp648
-
設定環境變數,並將存放區資料夾設為 $WORKDIR,本實驗室相關的所有指令都會在這個資料夾執行:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
WORKDIR=$(pwd)
-
設定這個實驗室的專案區域:
gcloud config set compute/region {{{project_0.default_region | "REGION"}}}
-
建立區域的變數:
export REGION={{{project_0.default_region | Region}}}
-
建立可用區的變數:
export ZONE={{{project_0.default_zone | Zone}}}
詳情請參閱區域和可用區說明文件。
注意:如果在自己的機器上執行 gcloud,各個工作階段都會保留這些設定。但在 Cloud Shell 中,每次啟動新工作階段或重新連線時,都必須進行這項設定。
工作 2:建立永久磁碟
-
在 Cloud Shell 中,前往 unattached-pd 目錄:
cd $WORKDIR/unattached-pd
-
將磁碟名稱匯出為變數:
export ORPHANED_DISK=orphaned-disk
export UNUSED_DISK=unused-disk
-
建立兩個磁碟:
gcloud compute disks create $ORPHANED_DISK --project=$PROJECT_ID --type=pd-standard --size=500GB --zone=$ZONE
gcloud compute disks create $UNUSED_DISK --project=$PROJECT_ID --type=pd-standard --size=500GB --zone=$ZONE
本實驗室使用 區域,但您可以選擇其他區域,只要在實驗室的其餘部分中保持一致即可。
-
確認已建立兩個磁碟:
gcloud compute disks list
輸出內容應如下所示:
NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS
orphaned-disk {{{project_0.default_zone | Zone}}} zone 500 pd-standard READY
unused-disk {{{project_0.default_zone | Zone}}} zone 500 pd-standard READY
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果已成功建立永久磁碟,就會看到評估分數。
建立永久磁碟
工作 3:建立 VM 並檢查磁碟
-
在 Cloud Shell 中建立執行個體:
gcloud compute instances create disk-instance \
--zone=$ZONE \
--machine-type=e2-medium \
--disk=name=$ORPHANED_DISK,device-name=$ORPHANED_DISK,mode=rw,boot=no
-
檢查連接至 VM 的磁碟:
gcloud compute disks describe $ORPHANED_DISK --zone=$ZONE --format=json | jq
輸出結果會與下列內容相似:
{
"creationTimestamp": "2019-06-12T12:21:25.546-07:00",
"id": "7617542552306904666",
"kind": "compute#disk",
"labelFingerprint": "42WmSpB8rSM=",
"lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00",
"name": "orphaned-disk",
"physicalBlockSizeBytes": "4096",
"selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/disks/orphaned-disk",
"sizeGb": "500",
"status": "READY",
"type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/diskTypes/pd-standard",
"users": [
"https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/instances/disk-instance"
],
"zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}"
}
在上述程式碼範例中,下列項目相當重要:
-
users 可識別磁碟連接的 VM。
-
lastAttachTimestamp 可識別磁碟上次連接至 VM 的時間。
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果已成功建立具備永久磁碟的 VM 執行個體,就會看到評估分數。
建立具備永久磁碟的 VM 執行個體
-
從 VM 卸載孤立磁碟:
gcloud compute instances detach-disk disk-instance --device-name=$ORPHANED_DISK --zone=$ZONE
-
檢查孤立磁碟:
gcloud compute disks describe $ORPHANED_DISK --zone=$ZONE --format=json | jq
輸出結果會與下列內容相似:
{
"creationTimestamp": "2019-06-12T12:21:25.546-07:00",
"id": "7617542552306904666",
"kind": "compute#disk",
"labelFingerprint": "42WmSpB8rSM=",
"lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00",
"lastDetachTimestamp": "2019-06-12T12:34:56.040-07:00",
"name": "orphaned-disk",
"physicalBlockSizeBytes": "4096",
"selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/disks/orphaned-disk",
"sizeGb": "500",
"status": "READY",
"type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/diskTypes/pd-standard",
"zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}"
}
在上述程式碼範例中,下列項目相當重要:
- 磁碟未列出任何
users,表示目前沒人使用。
- 現在有
lastDetachTimestamp 項目,表示磁碟上次從 VM 卸載的時間,也就是上次使用時間。
-
lastAttachTimestamp 欄位仍存在。
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果已成功從 VM 卸載孤立磁碟,就會看到評估分數。
從 VM 卸載孤立磁碟
工作 4:查看 Cloud 函式程式碼
-
在 Cloud Shell 中,輸出擷取專案內所有永久磁碟的程式碼區段:
cat $WORKDIR/unattached-pd/main.py | grep "(request)" -A 12
輸出內容如下所示:
def delete_unattached_pds(request):
# get list of disks and iterate through it:
disksRequest = compute.disks().aggregatedList(project=project)
while disksRequest is not None:
diskResponse = disksRequest.execute()
for name, disks_scoped_list in diskResponse['items'].items():
if disks_scoped_list.get('warning') is None:
# got disks
for disk in disks_scoped_list['disks']: # iterate through disks
diskName = disk['name']
diskZone = str((disk['zone'])).rsplit('/',1)[1]
print (diskName)
print (diskZone)
這個函式會使用 aggregatedList 方法,取得執行所在 Google Cloud 專案中的所有永久磁碟,並逐一檢查。
-
輸出程式碼區段,檢查 lastAttachTimestamp 欄位,並在欄位不存在時刪除磁碟:
cat $WORKDIR/unattached-pd/main.py | grep "handle never" -A 11
輸出內容如下所示:
# handle never attached disk - delete it
# lastAttachedTimestamp is not present
try:
if disk["lastAttachTimestamp"] is None:
print ("none!")
except KeyError:
print ("disk " + diskName + " was never attached - deleting")
deleteRequest = compute.disks().delete(project=project,
zone=diskZone, disk=diskName)
deleteResponse = deleteRequest.execute()
waitForZoneOperation(deleteResponse, project, diskZone)
print ("disk " + diskName + " was deleted")
continue
如果 lastAttachTimestamp 不存在,表示這個磁碟從未使用過,因此這個程式碼區段會刪除磁碟。
-
輸出程式碼區段,計算孤立磁碟的年齡、建立快照並刪除磁碟:
cat $WORKDIR/unattached-pd/main.py | grep "handle detached" -A 32
輸出內容如下所示:
# handle detached disk - snapshot and delete
# lastAttachTimestamp is present AND users is not present
try:
if disk['users'] is None and disk['lastDetachTimestamp'] is not None:
print ("users is none")
except KeyError:
print ("disk " + diskName + " has no users and has been detached")
detachTimestamp = dateutil.parser.parse(disk['lastDetachTimestamp'])
detachedFor = pytz.utc.localize(datetime.utcnow()) - detachTimestamp
print ("disk has been detached for " + str(detachedFor))
# update this for your preferred age
if detachedFor.days > -1:
# take a snapshot
snapShotName = diskName + str(int(time.time()))
print ("taking snapshot: " + snapShotName)
snapshotBody = {
"name": snapShotName
}
snapshotRequest = compute.disks().createSnapshot(project=project,
zone=diskZone, disk=diskName, body=snapshotBody)
snapshotResponse = snapshotRequest.execute()
waitForZoneOperation(snapshotResponse, project, diskZone)
print ("snapshot completed")
# delete the disk
print ("deleting disk " + diskName)
deleteRequest = compute.disks().delete(project=project, zone=diskZone, disk=diskName)
deleteResponse = deleteRequest.execute()
waitForZoneOperation(deleteResponse, project, diskZone)
print ("disk " + diskName + " was deleted")
continue
如果磁碟列出使用者,且有 lastDetachTimestamp,表示磁碟目前未使用,但過去曾用過。此時,系統就會執行這段程式碼。在本例中,Cloud 函式會建立磁碟快照來保留資料,然後刪除磁碟。
-
在 Cloud Shell 中點選「開啟編輯器」,開啟 Cloud Shell 編輯器來編輯 main.py 檔案。
注意:如果出現提示訊息,請點選「在新視窗中開啟」。
-
前往 gsp648/unattached-pd。
-
開啟 main.py。
-
編輯檔案的第 15 行,將 automating-cost-optimization 替換為您的專案 ID (類似如下):
project = '{{{ project_0.project_id | PROJECT ID}}}'
-
依序點選「檔案」>「儲存」,即可儲存檔案。
工作 5:部署 Cloud 函式
-
停用 Cloud Functions API:
gcloud services disable cloudfunctions.googleapis.com
-
重新啟用 Cloud Functions API:
gcloud services enable cloudfunctions.googleapis.com
-
在您的 Appspot 服務帳戶新增 artifactregistry.reader 權限:
gcloud projects add-iam-policy-binding {{{ project_0.project_id | PROJECT ID}}} \
--member="serviceAccount:{{{ project_0.project_id | PROJECT ID}}}@appspot.gserviceaccount.com" \
--role="roles/artifactregistry.reader"
-
在 Cloud Shell 中,部署 Cloud 函式:
cd ~/gsp648/unattached-pd
gcloud functions deploy delete_unattached_pds --gen2 --trigger-http --runtime=python310 --region {{{project_0.default_region | Region}}}
注意:
出現以下訊息時,請輸入 y:Allow unauthenticated invocations of new function [delete_unattached_pds]?(y/N)?
注意:
視區域而定,部署 Cloud 函式可能需要 2 到 5 分鐘。
-
將 Cloud 函式的觸發網址擷取為環境變數:
export FUNCTION_URL=$(gcloud functions describe delete_unattached_pds --format=json --region {{{project_0.default_region | Region}}} | jq -r '.url')
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果已成功部署 Cloud 函式,就會看見評估分數。
部署 Cloud 函式
工作 6:排定及測試 Cloud 函式
- 在 Cloud Shell 中,建立 App Engine 應用程式來使用 Cloud Scheduler:
gcloud app create --region={{{project_0.startup_script.app_region | REGION}}}
-
在 Cloud Shell 中,建立 Cloud Scheduler 工作,每天凌晨 2 點執行 Cloud 函式:
gcloud scheduler jobs create http unattached-pd-job \
--schedule="* 2 * * *" \
--uri=$FUNCTION_URL \
--location=$REGION
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果已成功建立 Cloud Scheduler 工作來執行 Cloud 函式,就會看見評估分數。
建立 Cloud Scheduler 工作來執行 Cloud 函式
-
手動觸發工作來進行測試:
gcloud scheduler jobs run unattached-pd-job \
--location=$REGION
-
確認已建立孤立磁碟的快照:
gcloud compute snapshots list
輸出結果會與下列內容相似:
NAME DISK_SIZE_GB SRC_DISK STATUS
orphaned-disk1560455894 500 {{{project_0.default_zone | Zone}}}/disks/orphaned-disk READY
-
確認未使用的磁碟和孤立磁碟已刪除:
gcloud compute disks list
輸出結果會與下列內容相似:
NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS
disk-instance {{{project_0.default_zone | Zone}}} zone 10 pd-standard READY
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果手動觸發工作並成功完成測試,就會看到評估分數。
手動觸發工作來進行測試
恭喜!
在本實驗室中,您完成了下列工作:
- 建立了兩個永久磁碟。
- 建立 VM 並使用其中一個磁碟。
- 已從 VM 卸載磁碟。
- 檢查 Cloud 函式程式碼。
- 部署 Cloud 函式。
- 使用 Cloud Scheduler 工作測試 Cloud 函式。
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2025 年 11 月 14 日
實驗室上次測試日期:2025 年 11 月 14 日
Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。