examlab .net 用最有效率的方法,考取最有價值的證照
本篇導覽 約 29 分鐘

部署與自動化腳本

5,800 字 · 約 29 分鐘閱讀 ·

關於如何使用 Python、Shell 及其他腳本工具自動化 Google Cloud 基礎設施與應用程式部署的進階指南。

立即做 20 題練習 → 免費 · 不用註冊 · PCA

部署自動化簡介 (Introduction to Deployment Automation)

當基礎設施即程式碼 (IaC,如 Terraform) 負責處理「什麼」(期望的狀態)時,自動化腳本通常負責處理「如何」(操作程序)。一位 Professional Cloud Architect 必須熟練使用 gcloud CLIPythonBash 編寫強大的腳本,以協調複雜的部署、執行資料遷移並自動化重複性的操作任務。

白話文解釋 Deployment Automation

類比 1 — 自動灑水系統 (The Automatic Sprinkler System)

手動部署就像是用軟管手動幫花園澆水。你可能會漏掉某個角落或忘記某天要澆水。自動化腳本就像是自動灑水系統。你設定好時間和區域,它每次都能完美執行任務,即使你正在睡覺也是如此。

類比 2 — IKEA 組裝說明書對比機器人組裝手臂

Terraform 就像是 IKEA 說明書——它告訴你組裝完成後的書架應該長什麼樣子。自動化腳本則像是機器人組裝手臂,它實際拿起零件、塗膠水並按正確順序鎖上螺栓。機器手臂遵循說明書,但它增加了「動作」。

類比 3 — 飛行員的檢查清單

腳本就像是自動化的駕駛艙檢查清單。與其讓飛行員手動檢查每個開關,電腦會運行腳本來驗證每個系統是否都處於可以起飛的「Go」狀態。如果有一個開關錯誤,腳本會立即停止程序。

冪等性:指腳本或操作可以被多次應用,而不會在初始應用之後改變結果的特性。這對於可靠的自動化至關重要。


GCP 上的腳本工具

  1. gcloud CLI: 最適合快速的管理任務和 Shell 腳本。使用 --format--filter 讓腳本更強大且具備機器可讀性。
  2. Python 客戶端函式庫 (Python Client Libraries): 複雜邏輯的金科玉律。使用 google-cloud-* 函式庫以獲得豐富的錯誤處理能力和非同步操作支持。
  3. Cloud Build: 不僅僅用於 CI/CD,它還是在安全、無伺服器環境中運行任意腳本的強大引擎。

自動化腳本的最佳實踐

  • 錯誤處理: 永遠不要假設命令一定會成功。務必檢查 Bash 中的退出碼 (set -e) 或在 Python 中使用 try-except 區塊。
  • 密鑰管理 (Secret Management): 絕不硬編碼金鑰或密碼。使用 Secret Manager 在運行時獲取憑據。
  • 日誌記錄: 輸出結構化日誌 (JSON),以便 Cloud Logging 輕鬆解析。
  • 服務帳戶冒充 (Service Account Impersonation): 與其下載 JSON 金鑰,不如使用 --impersonate-service-account 以獲得更好的安全性。

自動化資料庫遷移

資料庫遷移是風險最高的自動化任務之一。

  • 飛行前檢查 (Pre-flight Checks): 驗證連線、權限和可用磁碟空間。
  • 備份: 在遷移開始「之前」通過腳本觸發快照 (Snapshot)。
  • 回滾策略 (Rollback Strategy): 如果遷移腳本失敗,它必須能夠立即還原更改或通知相關人員。
::promoted

架構師洞察: 在 PCA 考試中,如果問題詢問如何將自動化任務擴展到數千個資源,答案通常是從簡單的 Shell 腳本遷移到 Cloud Build 或託管工作流引擎(如 Google Cloud Workflows)。 ::


Cloud Build Triggers 與 Private Worker Pools

Cloud Build 是 GCP 上的無伺服器自動化主力。cloudbuild.yaml 檔案描述了有序的 build steps,每個 step 執行一個容器映像(例如 gcr.io/cloud-builders/gcloudgcr.io/cloud-builders/docker)。Steps 透過共用的 /workspace volume 通訊,並可使用 waitFor 指令平行化執行。

Trigger 類型

  • Push to branch / tag: 最常見的模式 — main 觸發 production 部署,feature branches 觸發 preview 環境。
  • Pull request triggers: 在程式碼合併前執行 linting、unit tests、security scans。_PR_NUMBER substitution 讓你建立短暫的 preview URL。
  • Manual triggers: 適用於需要核准才能執行的「break-glass」操作,例如資料庫遷移。
  • Pub/Sub triggers: 從上游事件啟動 build,例如新的 artifact 出現在 Artifact Registry

Private Worker Pools

Cloud Build 預設在共享的、短暫的 Google 託管 VM 上執行,並具有公開的對外網路存取。對於企業工作負載,這通常是不可接受的。Private Pools 是專用的 worker fleet,具備:

  • 透過 Private Service Connect 進入你的 VPC,讓 builds 能存取 Cloud SQL Private IPGKE private clusters,或透過 Cloud VPN / Interconnect 連接的地端系統。
  • 遵守 VPC Service Controls 周邊,build steps 無法將資料外洩到公開 registries。
  • 允許自訂 machine types(例如 e2-highcpu-32)以建置大型 monolith 專案。
  • 按每個 pool 每分鐘計費,而非按 build 計費,因此需要謹慎預留容量。

典型的強化配置會使用沒有外部 IP 的 private pool、透過 --service-account 限縮範圍的 user-managed service account,以及儲存在 Secret Manager 中、透過 availableSecrets.secretManager 引用的 substitutions。

對於 PCA 場景中需要 builds 連接到 private GKE clusters 或沒有公開 IP 的 Cloud SQL,正確答案幾乎都是 Cloud Build private worker pools peered 到 VPC。預設的共享 pools 無法存取 RFC1918 位址。


Build Provenance 與 SLSA Compliance

軟體供應鏈攻擊(SolarWinds、Codecov)讓 provenance 成為董事會層級的議題。GCP 透過在 Cloud Build 整合 SLSA (Supply-chain Levels for Software Artifacts) 來解決此問題。

GCP 上的 SLSA Levels

  • SLSA Level 1: Build process 是腳本化的(任何 cloudbuild.yaml 都符合)。
  • SLSA Level 2: Cloud Build 為每個 build 產生簽署過的 provenance metadata。
  • SLSA Level 3: Builds 在強化、隔離的 Cloud Build infrastructure 上執行,具有無法偽造的 provenance — 這是託管 Cloud Build 的預設值。

Provenance Metadata

每個 build 會發出一份 JSON 文件,描述:

  • Trigger(commit SHA、branch、repository URL)。
  • 所使用的 builder image digests 確切值。
  • Input materials 與產出的 artifacts,附帶 SHA-256 digests。
  • 來自 Cloud Build 簽署金鑰的簽章,可透過 Sigstore / Cosign 驗證。

Provenance 儲存在 Artifact Analysis(前稱 Container Analysis)中,可透過 gcloud artifacts docker images describe --show-provenance 查詢。下游工具 — Binary Authorization、GKE admission controllers、Kritis — 可以在允許部署前要求有效的 SLSA-3 provenance。

對於 PCA,請記得:SLSA 關注的是「誰建置了這個以及如何建置」。如果場景提到「在部署前驗證 build 來自我們受信任的 CI pipeline」,答案就是 Cloud Build 所支援的 SLSA provenance 加上 Binary Authorization attestations。


Cloud Deploy:Targets、Custom Actions 與漸進式 Rollouts

當 Cloud Build 處理「建置」時,Cloud Deploy 處理「交付」 — 它是 GCP 對 GKE、Cloud Run、Anthos 有明確意見的託管 continuous delivery 服務。

Delivery Pipelines 與 Targets

clouddeploy.yaml 定義一個 Delivery Pipeline,包含有序的 Targets:通常是 devstagingprod。每個 target 指向一個特定的 GKE cluster、Cloud Run service 或 Anthos config。Targets 之間的 promotion 是明確的 gcloud deploy releases promote 呼叫,可選擇性地由 approvals(requireApproval: true)把關。

Render 與 Deploy Phases

Cloud Deploy 呼叫 Skaffold 以 target 特定的值(image tags、replica counts、namespaces)渲染 manifests,然後透過 target 的部署機制(kubectl applygcloud run services replace)套用。

Custom Target Types 與 Custom Actions

對於非原生 targets(Helm releases、Terraform stacks、Spinner pipelines),可以定義一個 Custom Target Type,由你自己的 container 實作 renderdeploy actions。這是團隊將 Cloud Deploy 接入客製化環境而不放棄稽核軌跡的方法。

Canary 與 Progressive Rollouts

對於 GKE 與 Cloud Run,Cloud Deploy 支援自動化的 canary 策略(例如 10% → 50% → 100%),並透過 Cloud Monitoring SLOs 進行 metric-driven verification。驗證失敗會觸發自動 rollback 至前一個 release。

常見的 PCA 干擾選項:用 Cloud Build + kubectl 自行撰寫 promotion 邏輯。雖然這可行,但當答案提到「環境間可稽核的 promotion」、「approval gates」或「SLO 違規時自動 rollback」時,考試偏好 Cloud Deploy。Cloud Build 是引擎;Cloud Deploy 是指揮。


GitHub Actions 透過 OIDC 連接 GCP

許多組織標準化 CI 於 GitHub Actions,但仍需要部署到 GCP。傳統做法 — 將長期的 service account JSON key 儲存為 GitHub secret — 現在被認為是 anti-pattern:金鑰會外洩、輪換不易,並授予過於廣泛的存取權限。

OIDC Flow

GitHub Actions 為每次 workflow run 發行一個短期 OIDC token,由 GitHub OIDC provider(token.actions.githubusercontent.com)簽署。GCP 的 Workload Identity Federation 會根據設定好的 Workload Identity PoolProvider 驗證此 token,然後為一個冒充的 service account 鑄造短期的 GCP access token。

設定範例

permissions:
  id-token: write
  contents: read

steps:
  - uses: google-github-actions/auth@v2
    with:
      workload_identity_provider: projects/123/locations/global/workloadIdentityPools/github/providers/my-repo
      service_account: [email protected]
  - uses: google-github-actions/setup-gcloud@v2
  - run: gcloud run deploy api --image=us-docker.pkg.dev/proj/repo/api:${{ github.sha }}

Attribute Conditions

Workload Identity Provider 應該透過 attribute.repository == 'my-org/my-repo' && attribute.ref == 'refs/heads/main' 將信任綁定到特定的 repositories 與 branches。這可防止 forked repo 或 feature branch 冒充 production deployer。

對於 PCA,標準答案模式是:「使用 Workload Identity Federation 搭配 OIDC;絕不要將 service account keys 儲存在第三方 CI 中。」


Workload Identity Federation for CI/CD 深度解析

Workload Identity Federation (WIF) 比 GitHub Actions 應用更廣泛 — 它是 GCP 對任何支援 OIDC 或 SAML 2.0 的外部 identity provider 的無金鑰驗證框架。

支援的 Providers

  • OIDC: GitHub Actions、GitLab CI、CircleCI、Bitbucket Pipelines、AWS(透過 STS)、Azure AD、通用的 Kubernetes service account tokens。
  • SAML 2.0: Okta、Ping、ADFS 用於 human workforce identity(由 Workforce Identity Federation 處理,這是姊妹產品)。
  • AWS: 聯合驗證,讓 AWS Lambda 函式或 EC2 instances 能使用其 AWS IAM role 呼叫 GCP APIs。

Pool、Provider、Principal 階層

  1. Workload Identity Pool: 外部身份的命名空間,以 project 為範圍。
  2. Provider: 一個外部 IdP 的設定(issuer URI、allowed audiences、attribute mappings)。
  3. Principal: Pool 內的特定 subject,可定址為 principal://iam.googleapis.com/projects/.../subject/...,或對群組使用 principalSet://...

Service Account Impersonation

外部身份不會直接成為 GCP principal;它透過 roles/iam.workloadIdentityUser 綁定來冒充一個 GCP service account。隨後使用一般 IAM 對該 service account 授予權限 — 這保留了所有現有的稽核、allow/deny policies 與 VPC-SC 控制。

稽核與輪換

每次 WIF token 交換都記錄在 Cloud Audit Logssts.googleapis.com 下。由於 tokens 是短期的(預設 1 小時,可設定降至 10 分鐘),無需輪換金鑰 — 比下載 JSON keys 在運維上是巨大的勝利。


Terraform Cloud / HCP Terraform 搭配 gcloud

對於使用 HashiCorp 託管 Terraform 服務(HCP Terraform,前稱 Terraform Cloud)的團隊,與 GCP 的整合模式結合了 IaC plans 與命令式 gcloud post-steps。

驗證模式

HCP Terraform 現在透過 Workload Identity Federation 支援動態憑證 — 與 GitHub Actions 相同的 OIDC flow。Workspace 請求一個 OIDC token,將其交換為短期的 GCP token,然後執行 terraform plan / apply,不需任何靜態憑證。

混合式 IaC + 命令式 Steps

Terraform 是宣告式的,擅長 provisioning,但某些操作本質上是命令式的:

  • 在 BigQuery dataset 建立後觸發一次性的 Dataflow job。
  • 透過 gcloud sql import 將初始 seed data 載入 Cloud SQL
  • 在新部署後使 Cloud CDN 快取失效。

建議的模式是先執行 terraform apply 進行 infrastructure 建置,接著由 local-exec provisioner 或下游的 Cloud Build step 執行 gcloud 命令。保持命令式 steps 為冪等的(check-then-act),並發出結構化日誌以便觀察。

Sentinel 與 OPA Policies

HCP Terraform 的 Sentinel policy engine 在 apply 執行之前強制執行 guardrails,例如「不允許公開的 Cloud Storage buckets」或「所有 VMs 必須啟用 shielded VM」。這補足了 GCP 端的 Organization Policies,在任何 API 呼叫發出之前的 plan 階段就攔截違規。

對於 PCA 場景提到「多雲團隊已經使用 Terraform Cloud」時,正確答案很少是「遷移到 Config Connector」或「用 Deployment Manager 重寫」。而是:保留 Terraform 進行 provisioning、使用 WIF 進行無金鑰驗證、並透過 Cloud Build 觸發 gcloud 處理命令式 post-steps。


Skaffold 用於 GKE 內層開發循環

Skaffold 是支撐 Cloud Deploy 渲染流程的開源工具,但作為 GKE 工作負載開發者的內層循環工具同樣有價值。

內層循環 (Inner Loop)

skaffold dev 會監看本地原始碼檔案、在儲存時重新建置容器映像(使用 Buildpacks、Docker 或 Jib)、推送到 Artifact Registry、並將更新後的 manifests 套用到目標 cluster — 全程僅需數秒。檔案同步模式對直譯式語言會完全跳過重建,直接將變更的檔案複製到執行中的 pods。

Multi-Environment Builds 的 Profiles

單一 skaffold.yaml 宣告 profiles,依環境覆寫行為:

profiles:
  - name: dev
    build:
      local: { push: false }
    deploy:
      kubectl: { manifests: [k8s/dev/*.yaml] }
  - name: prod
    build:
      googleCloudBuild:
        projectId: my-prod-project
    deploy:
      kubectl: { manifests: [k8s/prod/*.yaml] }

Render-Only 模式用於 GitOps

skaffold render 輸出完全 hydrated 的 manifests 而不套用 — 非常適合 GitOps 工作流,其中 Config SyncArgo CD 從 Git repo 取得 manifests。這正是 Cloud Deploy 內部在交給 target 之前渲染 manifests 的方式。

Cloud Code IDE 整合

Cloud Code 的 VS Code 與 IntelliJ plugins 將 Skaffold 包裝為 GUI-driven debugging、log streaming 與 pod shell access — 對於不熟悉 Kubernetes CLI 工具的開發者上手非常有幫助。


Artifact Registry 與 Artifact Analysis

Artifact Registry 是統一接替 Container Registry、Maven repositories 與特定語言 package stores 的服務。對 PCA 而言,關鍵能力是 repository 設計與整合式漏洞掃描。

Repository Modes

  • Standard: 你團隊的私有 artifacts(Docker images、Maven、npm、Python、Apt、Yum、Go modules、Helm charts、generic)。
  • Remote: 公開上游(如 Docker Hub、Maven Central 或 PyPI)的 pull-through cache。解決 Docker Hub rate limits 並改善 build latency。
  • Virtual: 一個統一的 endpoint,依設定好的優先順序 fan out 到多個上游 Standard 或 Remote repos。在 repos 之間遷移而不破壞 client 設定時很有用。

Regional vs Multi-Regional

Regional repos(us-central1-docker.pkg.dev)與工作負載共置以最小化 pull latency 與 egress 成本。Multi-regional(us-docker.pkg.dev)適合提供給多個 regions 的 golden images。

Artifact Analysis(前稱 Container Analysis)

每次 image push 都會觸發針對 National Vulnerability Database 與 Google curated feeds 的非同步漏洞掃描。結果以 Occurrences 儲存,連結到 Artifact Analysis 中的 Notes。可使用 gcloud artifacts docker images list-vulnerabilities IMAGE_URL 查詢,或透過 Pub/Sub 串流以實現即時安全工作流。

掃描器也會產生 SBOM (Software Bill of Materials) 文件,採用 SPDXCycloneDX 格式,符合 executive order 14028 對聯邦承包商的要求。

在 PCA 中,「在部署前掃描 images 找 CVEs」幾乎都對應到 Artifact Registry + Artifact Analysis + Binary Authorization 三者協同運作。在 Cloud Build 裡釘上像 Trivy 這類的免費掃描器是合理的干擾選項,但會失去與 Cloud Audit Logs 的稽核日誌整合以及原生的 attestation flow。


Binary Authorization 與簽署過的 Attestations

Binary Authorization 是 GCP 的部署時閘門,確保只有受信任、已驗證的 images 在 GKE、Cloud Run 與 Anthos clusters 上執行。

Policy Model

Binary Authorization policy 在每個 cluster 或 project 層級指定:

  • Default rule: 對沒有 attestations 的 images 該怎麼做(在 production 通常是 ALWAYS_DENY)。
  • Cluster-specific rules: 允許非關鍵 clusters 的例外。
  • Allowlists: 依 URL 模式豁免 images(例如 gcr.io/google-containers/* 用於系統 pods)。
  • Required attestors: 必須全部存在的 attestors 簽章列表。

Attestors 與 Attestations

Attestor 是一個具名實體,綁定到 PGPCloud KMS-managed asymmetric keyAttestation 是由受信任的程序所建立的簽署過聲明(「此 image SHA-256 digest 通過了漏洞掃描」) — 通常是 Cloud Build step 呼叫 gcloud beta container binauthz attestations sign-and-create

端到端 Flow

  1. Cloud Build 建置 image,推送到 Artifact Registry。
  2. Artifact Analysis 掃描 CVEs;若無高於閾值者,Cloud Build step 使用為「qa-scanner」attestor 保留的 KMS key 簽署一個 attestation。
  3. 選擇性的手動核准 step(透過 Cloud Deploy approval gate)從「release-manager」attestor 建立第二個 attestation。
  4. 部署時,GKE admission controller 查詢 Binary Authorization,後者檢查兩個 attestations 是否都存在且由受信任的 keys 簽署。缺少簽章 → pod 建立被拒絕,並在稽核日誌留下清楚的記錄。

Continuous Validation

Binary Authorization 也會在背景執行 Continuous Validation,每 24 小時重新檢查執行中的 pods。若先前受信任的 image 後續被撤銷(例如新揭露了重大 CVE),CV 會發出 log-based metric — 搭配 Pub/Sub 警示可清空受影響的工作負載。

PCA 的 Binary Authorization 三 A 口訣: Attestor(具名身份 + 金鑰)、Attestation(關於 image 的簽署聲明)、Admission(GKE/Cloud Run 在部署時的檢查)。三者必須對齊,pod 才能啟動,而簽署金鑰由 Cloud KMS 持有。


常見問題 — 部署自動化 (FAQ — Deployment Automation)

Q1. 應該用 Python 還是 Bash?

對於簡單的單行命令或順序性的 GCP 資源建立,Bash + gcloud 即可。對於涉及迴圈、複雜邏輯或外部 API 呼叫的任何任務,請使用 Python

Q2. 我該如何在腳本中處理驗證 (Authentication)?

在本地環境中,使用 gcloud auth application-default login。在生產環境(VM、Cloud Build)中,腳本會自動使用附加到資源的服務帳戶 (Service Account)

Q3. 我可以在 GCP 上使用 Ansible 嗎?

可以。Google 提供了官方的 Ansible 模組來管理 GCP 資源。這在混合雲場景中很常見,特別是當你已經在使用 Ansible 進行地端配置時。

Q4. 如何讓我的腳本具備冪等性 (Idempotent)?

在建立資源(例如 Bucket)之前,腳本應該檢查它是否已存在。在 gcloud 中,你可以使用 gsutil lsgcloud ... describe 並處理「未找到」的錯誤。

Q5. 將腳本儲存在 Git 儲存庫中安全嗎?

是的,而且強烈建議這樣做。但是,請確保沒有將密鑰 (Secrets) 提交到程式碼中。使用 .gitignore 和 Secret Manager 來處理敏感數據。

官方資料來源

更多 PCA 主題