跳至主要內容

GCP Lab 實作挑戰

8 個可分段進行的實作,從前置檢查、結果驗證到資源清理

8 實作練習
5 學習主題
0 已完成
實作進度 0 / 8

先選一個 Lab,再確認環境

Lab 1–7 先執行下方共用準備;Lab 8 是只讀練習,可直接開始,不需為此新增 Billing。

每個 Lab 約 15–45 分鐘,可分段進行;帳號權限設定與服務等待時間會影響實際耗時。這些練習可能計費,Cloud SQL 與本例監控 VM 不適用 e2-micro 的免費運算額度。

網站提供指令與自我檢核,不會替你執行或驗證雲端資源。遇到錯誤先停止操作;中途離開也能直接展開各 Lab 的清理指令。

每次開始前:確認帳號、專案與工作目錄

使用同一個 Cloud Shell Bash 分頁,先把 YOUR_PROJECT_ID 改成自己的獨立練習專案,再執行整個區塊。後續每個 Lab 都從第一步開始;不要在正式專案照貼。這裡只檢查環境,不會替你建立付費資源。若只做 Lab 8,可略過此準備,直接依該 Lab 的只讀步驟操作。

Cloud Shell · Bash
coa_lab_setup() {
  unset PROJECT_ID ACCOUNT REGION ZONE
  local lab_project='YOUR_PROJECT_ID'
  if [[ "$lab_project" == 'YOUR_PROJECT_ID' || ! "$lab_project" =~ ^[a-z][a-z0-9-]{4,28}[a-z0-9]$ ]]; then
    printf '請先修改 lab_project,填入你的 Project ID。\n' >&2
    return 1
  fi
  local lab_account lab_billing
  lab_account="$(gcloud config get-value account)" || return 1
  if [[ -z "$lab_account" || "$lab_account" == '(unset)' ]]; then
    printf '目前沒有登入帳號,請先完成 Cloud Shell 登入。\n' >&2
    return 1
  fi
  gcloud projects describe "$lab_project" --format='table(projectId,name)' || return 1
  lab_billing="$(gcloud billing projects describe "$lab_project" --format='value(billingEnabled)')" || return 1
  if [[ "$lab_billing" != 'true' && "$lab_billing" != 'True' ]]; then
    printf '此專案尚未啟用 Billing,請先確認帳單連結。\n' >&2
    return 1
  fi
  gcloud config set project "$lab_project" || return 1
  export PROJECT_ID="$lab_project" ACCOUNT="$lab_account"
  export REGION='us-central1' ZONE='us-central1-a'
  export LAB_RUN="${LAB_RUN:-$(date -u +%y%m%d%H%M%S)-$RANDOM}"
  if [[ -z "${LAB_DIR:-}" || ! -d "$LAB_DIR" ]]; then
    LAB_DIR="$(mktemp -d -t coa-labs.XXXXXX)" || return 1
    export LAB_DIR
  fi
  printf '帳號:%s\n專案:%s\n本次識別:%s\n本機目錄:%s\n' "$ACCOUNT" "$PROJECT_ID" "$LAB_RUN" "$LAB_DIR"
}
coa_lab_setup

確認輸出的帳號與專案名稱後再繼續。LAB_RUN 會加在資源名稱中,方便辨識本次建立的項目;保留這個分頁與識別值,清理時仍會用到。切換專案或重開分頁後,請重新核對本次資源,不要猜名稱刪除。

確認結果:Project ID 與預期一致,Billing 檢查成功,最後列出帳號、專案、本次識別與本機目錄。若任一步驟失敗,先處理錯誤,不要往下建立資源。

教材核對:2026-10-15。原有完成標記保留;若要依新版重做,可在該 Lab 取消完成標記。

難度
主題
Lab 01
入門 20 分鐘 運算與部署
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

確認名稱帶有自己的 LAB_RUN,再刪除。VM 掛載的磁碟會一併刪除;不要使用省略確認的 --quiet。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
VM_NAME="coa-vm-$LAB_RUN"
VM_HTTP_RULE="coa-http-$LAB_RUN"
gcloud compute instances delete "$VM_NAME" --project="$PROJECT_ID" \
  --zone="$ZONE" --delete-disks=all
gcloud compute firewall-rules delete "$VM_HTTP_RULE" --project="$PROJECT_ID"
gcloud compute instances list --project="$PROJECT_ID" --filter="name=$VM_NAME"
gcloud compute disks list --project="$PROJECT_ID" --filter="name=$VM_NAME"
gcloud compute firewall-rules list --project="$PROJECT_ID" --filter="name=$VM_HTTP_RULE"

即使中途失敗,也可展開頁首的本次清理指令。未建立的資源可能回報找不到;只處理本次名稱,不刪其他 VM。

確認結果: 三份查詢都不再列出本次資源;若另建了快照或保留 IP,也需另外確認。

Lab 02
入門 20 分鐘 儲存與資料庫
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

僅刪除這個新建、可丟棄的練習 bucket。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
SITE_BUCKET="$PROJECT_ID-coa-site-$LAB_RUN"
printf '將清理本次 bucket:gs://%s\n' "$SITE_BUCKET"
gcloud storage rm --recursive "gs://$SITE_BUCKET"
gcloud storage buckets list --project="$PROJECT_ID" --filter="name:$SITE_BUCKET"

本例從建立時就停用 soft delete。其他 bucket 的 soft delete、版本保留或 retention 設定不同,刪除後不一定立刻停止儲存計費。

確認結果: 列出本次名稱的結果應為空;不要刪整個專案或其他 bucket。

Lab 03
入門 25 分鐘 運算與部署
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

先核對映像路徑屬於這個 Lab,再刪除服務、本次映像與 runtime service account。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
RUN_SERVICE="coa-run-$LAB_RUN"
RUN_DIR="$LAB_DIR/cloud-run"
RUN_SA="$RUN_SERVICE@$PROJECT_ID.iam.gserviceaccount.com"
gcloud run services delete "$RUN_SERVICE" --project="$PROJECT_ID" --region="$REGION"
if [[ -s "$RUN_DIR/image.txt" ]]; then
  RUN_IMAGE="$(cat "$RUN_DIR/image.txt")"
  printf '請核對這是本次映像:%s\n' "$RUN_IMAGE"
  gcloud artifacts docker images delete "$RUN_IMAGE" --project="$PROJECT_ID" --delete-tags
fi
gcloud iam service-accounts delete "$RUN_SA" --project="$PROJECT_ID"
gcloud run services list --project="$PROJECT_ID" --region="$REGION" --filter="metadata.name=$RUN_SERVICE"

若部署在記錄映像前失敗,請到 Artifact Registry 依本次服務名稱查找。來源上傳、建構紀錄等也可能保留,請檢查本次產物與 Billing;不要刪共享儲存庫或宣稱刪服務就零費用。

確認結果: 本次服務與 runtime 身分不再存在;已核對映像及來源建構的剩餘產物。

Lab 04
進階 30 分鐘 網路
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

依 VM、規則、subnet、VPC 的順序清理,避免相依資源阻止刪除。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
NET_NAME="coa-vpc-$LAB_RUN"
SUBNET_NAME="coa-subnet-$LAB_RUN"
gcloud compute instances delete "coa-web-$LAB_RUN" "coa-client-$LAB_RUN" \
  --project="$PROJECT_ID" --zone="$ZONE" --delete-disks=all
gcloud compute firewall-rules delete "coa-iap-$LAB_RUN" "coa-http-in-$LAB_RUN" --project="$PROJECT_ID"
# 若停在 deny 測試,這條規則可能還存在;先列出,再只刪本次名稱。
DENY_RULE="$(gcloud compute firewall-rules list --project="$PROJECT_ID" --filter="name=coa-deny-out-$LAB_RUN" --format='value(name)')"
if [[ -n "$DENY_RULE" ]]; then
  gcloud compute firewall-rules delete "coa-deny-out-$LAB_RUN" --project="$PROJECT_ID"
fi
gcloud compute networks subnets delete "$SUBNET_NAME" --project="$PROJECT_ID" --region="$REGION"
gcloud compute networks delete "$NET_NAME" --project="$PROJECT_ID"

如果最後 VPC 仍有相依資源,不要改刪其他網路。先查本次 VM/規則是否清完,尤其是中途離開時的 deny。

確認結果: 本次 VPC、subnet、VM、磁碟與防火牆規則不再存在。

Lab 05
進階 25 分鐘 安全與 IAM
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

刪除這個 Lab 新建的專用身分,其上的模擬授權也隨之移除。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
READER_SA="coa-read-$LAB_RUN@$PROJECT_ID.iam.gserviceaccount.com"
IAM_BUCKET="$PROJECT_ID-coa-iam-$LAB_RUN"
gcloud storage rm --recursive "gs://$IAM_BUCKET"
gcloud iam service-accounts delete "$READER_SA" --project="$PROJECT_ID"
gcloud iam service-accounts list --project="$PROJECT_ID" --filter="email=$READER_SA"
gcloud storage buckets list --project="$PROJECT_ID" --filter="name:$IAM_BUCKET"

不要清除其他人的 IAM 綁定,也不需要停用專案 API 或刪除專案。

確認結果: 本次 service account 與 bucket 都不再列出。

Lab 06
進階 45 分鐘 儲存與資料庫
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

本 Lab 不保留正式資料。只刪這個練習實例;若開啟刪除保護,先核對範圍再於 Console 關閉本次實例的保護。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
SQL_INSTANCE="coa-sql-$LAB_RUN"
gcloud sql instances delete "$SQL_INSTANCE" --project="$PROJECT_ID"
gcloud sql instances list --project="$PROJECT_ID" --filter="name=$SQL_INSTANCE"

刪除時不要為練習資料另選保留/最終備份。若帳號設定或操作保留了備份,仍可能計費;到 Cloud SQL「備份」頁依本次實例名稱核對並清理,不可假設刪實例就刪除所有備份。

確認結果: 本次實例不再列出,並已在備份頁核對本次實例是否有 retained/final backup。

Lab 07
進階 30 分鐘 維運與監控
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

依存下的完整資源名稱刪除,不列出全部政策/管道再批次刪除。即使中途離開也能獨立執行本區。

Cloud Shell(Bash)
: "${PROJECT_ID:?請先完成頁首共用準備}" "${LAB_RUN:?請先完成頁首共用準備}" "${LAB_DIR:?請先完成頁首共用準備}"
MON_VM="coa-monitor-$LAB_RUN"
MON_DIR="$LAB_DIR/monitoring"
if [[ -s "$MON_DIR/policy-name.txt" ]]; then
  POLICY_NAME="$(cat "$MON_DIR/policy-name.txt")"
  gcloud monitoring policies delete "$POLICY_NAME" --project="$PROJECT_ID"
fi
if [[ -s "$MON_DIR/channel-name.txt" ]]; then
  CHANNEL_NAME="$(cat "$MON_DIR/channel-name.txt")"
  gcloud beta monitoring channels delete "$CHANNEL_NAME" --project="$PROJECT_ID"
fi
gcloud compute instances delete "$MON_VM" --project="$PROJECT_ID" --zone="$ZONE" --delete-disks=all
gcloud compute firewall-rules delete "$MON_VM-iap" --project="$PROJECT_ID"
gcloud compute instances list --project="$PROJECT_ID" --filter="name=$MON_VM"
gcloud monitoring policies list --project="$PROJECT_ID" --filter="displayName=coa-cpu-$LAB_RUN"
gcloud beta monitoring channels list --project="$PROJECT_ID" --filter="displayName=coa-email-$LAB_RUN"

若管道仍被政策引用,先核對本次政策是否刪除成功;不要用 --force 或刪除其他專案通知來繞過相依關係。 若本機檔案遺失,依 coa-cpu-本次識別/coa-email-本次識別到 Console 找回並核對完整名稱,只清理本次資源。

確認結果: 查詢不再列出本次資源,原有其他政策與管道保持存在。

Lab 08
入門 15 分鐘 維運與監控
中途離開?查看本次資源清理

只針對此 Lab 與本次 LAB_RUN。這裡不會執行指令,也不會自動標成完成;先核對專案與資源名稱。

本 Lab 沒有建立雲端資源,不需要刪除任何專案或服務。

Cloud Shell(Bash)
gcloud compute instances create --help
gcloud version
gcloud config get-value project

說明頁可能使用分頁器,按 q 離開。遇到不熟悉旗標先查 --help,不要靠隱藏 stderr 來掩蓋失敗。

確認結果: 能找到 machine-type、zone 的說明,且確認操作上下文仍是預期專案。

徽章解鎖!
Nimbus

學習教練 Nimbus

你的雲端學習夥伴

依已保存的資源進度與學習目標提供練習建議。完成度不代表掌握程度或應考能力。

0
連續天數
0
確認讀完
0
收藏
0%
資源完成度
練習建議
    推薦下一步
    開始