建構程序總覽

將函式原始碼部署至 Cloud Run 函式時,該原始碼會儲存在 Cloud Storage 值區中。接著,Cloud Build 會自動將您的程式碼建構為容器映像檔,並將該映像檔推送至映像檔登錄檔。Cloud Run 函式需要執行容器來執行函式時,就會存取這個映像檔。

建構映像檔的程序完全自動化,不需要您直接輸入任何內容。在建構程序中使用的所有資源,都會在您自己的使用者專案中執行。

在專案中執行建構程序,代表:

  • 您可以直接存取所有建構記錄。

  • 雖然 Cloud Build 有自己的預設並行處理配額,但並未預先設定建構時間配額。

  • 您可以查看目前的容器映像檔和先前部署的容器映像檔,這兩者都儲存在 Artifact Registry 中。

  • 在專案中使用 Cloud Storage 來儲存函式的原始碼目錄。注意事項:

    • 如果您建立函式,系統會建立上傳資料夾來儲存原始碼。這個上傳值區的名稱為 gcf-uploads-PROJECT_NUMBER-REGION.cloudfunctions.appspot.com
    • 上傳程式碼後,函式程式碼會儲存在個別來源集區中:
      • 如果您使用預設加密功能,這個值區的名稱會是 gcf-sources-PROJECT_NUMBER-REGION
      • 如果您使用 CMEK 保護資料,值區名稱會是 gcf-sources-PROJECT_NUMBER-REGION-CMEK_KEY_HASH
    • 來源和上傳值區都沒有保留期限。

建構程序的特性

建構程序具有下列特性:

  • 必須為專案啟用 Cloud Build API

    如要手動啟用 API,請按一下上述連結,從下拉式選單中選取專案,然後按照提示啟用 UI。

  • 由於整個建構程序會在專案內容中進行,因此專案會受到所含資源的價格影響:

    • 如要瞭解 Cloud Build 的定價,請參閱「定價」頁面。這個程序會使用 Cloud Build 的預設執行個體大小,因為這些執行個體會預先暖機,因此可更快提供。Cloud Build 提供免費方案:請參閱定價文件瞭解詳情。

    • 如要瞭解 Cloud Storage 的定價,請參閱「定價」頁面。Cloud Storage 提供免費方案:請參閱定價文件瞭解詳情。

    • 如要瞭解 Artifact Registry 的定價,請參閱「定價」頁面。

    • 如要瞭解 Container Registry (已淘汰) 的定價,請參閱「定價」頁面。

  • 由於建構程序須遵守帳單規定,因此專案必須附加 Cloud Billing 帳戶

查看建構映像檔記錄

在使用者專案中執行建構映像檔程序的主要好處,就是可以存取建構記錄。您可以使用 gcloud CLI 或 Google Cloud 控制台存取記錄檔,這些記錄檔可透過 Cloud Logging 取得。

gcloud

  1. 使用 gcloud functions deploy 指令部署函式。

  2. 記錄的網址會顯示在終端機視窗的回應中。例如:

    Deploying function (may take a while - up to 2 minutes)...⠹
    **For Cloud Build Stackdriver Logs**, visit:
    https://console.cloud.google.com/logs/viewer?project=&advancedFilter=resource.type%
    3Dbuild%0Aresource.labels.build_id%3D38d5b662-2315-45dd-8aa2-
    380d50d4f5e8%0AlogName%3Dprojects%2F%
    2Flogs%2Fcloudbuild
    Deploying function (may take a while - up to 2 minutes)...done.

Google Cloud 控制台

  1. 在「Cloud Run functions Overview」視窗中,按一下要調查的函式名稱。
  2. 按一下 [Details] (詳細資料) 分頁標籤。
  3. 在「一般資訊」窗格中,按一下「容器建構記錄」連結,開啟「記錄瀏覽器」窗格。
  4. 按一下任一資料列,即可查看該建構記錄項目的詳細資料。如果是與檔案相關的錯誤項目,這些詳細資料包括檔案的名稱、行和欄。

圖片註冊中心

Cloud Run 函式會使用 Artifact Registry 儲存從函式原始碼建構的映像檔。圖片會儲存在名為 REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts 的存放區中。

您的 Artifact Registry 必須與函式位於同一個專案中。您可以按照下列步驟建立或更新以 Artifact Registry 為基礎的函式:

gcloud

如為客戶管理的 Artifact Registry,請執行下列指令:

gcloud functions deploy --no-gen2 FUNCTION \
--docker-repository=REPOSITORY
[FLAGS...]

更改下列內容:

  • FUNCTION:函式名稱。
  • REPOSITORY:Artifact Registry 存放區的完整名稱,格式如下:projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY

如果是 Google 代管的 Artifact Registry,請使用:

gcloud functions deploy --no-gen2 FUNCTION \
--docker-registry=artifact-registry
[FLAGS...]

Google Cloud 控制台

  1. 前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
    前往「Cloud Run 函式」頁面

  2. 按一下要使用 Artifact Registry 的函式名稱。

  3. 按一下 [編輯]

  4. 按一下「Runtime, build...」展開進階設定選項。

  5. 按一下選單列中的「安全性和映像檔存放區」,開啟安全性分頁。

  6. 在「圖像存放區」下方,視您使用的 Artifact Registry 類型而定,選取下列其中一個選項:

    • 客戶代管的 Artifact Registry。如果您設定自己的 Docker 存放區,請使用這個選項。
    • Google 代管的 Artifact Registry。如果您想使用 Google 代管的 Docker 存放區,而非自行設定,請使用這個選項。
  7. 如果是客戶管理的 Artifact Registry,請使用「Artifact Registry」下拉式選單選取所需的 Artifact Registry 存放區,或是按照提示建立新的存放區。

  8. 點按「Next」

  9. 按一下 [Deploy] (部署)

如需詳細的定價資訊,請參閱 Cloud Run 函式的定價

使用私人集區保護建構作業

為讓函式能夠使用依附元件 (例如 npm 套件),Cloud Build 在建構程序中預設會無限制地存取網際網路。如果您已設定 VPC Service Controls (VPC SC) 範圍,並希望限制建構作業只能存取範圍內儲存的依附元件,可以使用 Cloud Build 私人工作站集區功能。

一般來說,請按照下列步驟設定私人集區:

  1. 建立私人工作站集區。請參閱「建立及管理私人集區」。
  2. 設定 VPC Service Controls 範圍。請參閱「使用 VPC Service Controls」。

  3. 如果私人工作人員集區位於與函式不同的專案中,您必須將 cloudbuild.workerPoolUser 角色授予 Cloud Run 函式的 Service Agent 服務帳戶 (service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com),讓 Cloud Build 服務可以存取工作人員集區。

    gcloud projects add-iam-policy-binding PRIVATE_POOL_PROJECT_ID \
        --member serviceAccount:service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
        --role roles/cloudbuild.workerPoolUser

    其中 FUNCTION_PROJECT_NUMBER 是函式執行所在專案的編號PRIVATE_POOL_PROJECT_ID 則是工作站集區所在專案的 ID。詳情請參閱「在私人集區中執行建構作業」。

  4. 部署函式,以便使用私人集區進行建構:

gcloud

gcloud functions deploy FUNCTION_NAME --no-gen2\
  --runtime RUNTIME \
  --build-worker-pool PRIVATE_POOL_NAME
  [FLAGS...]

其中 FUNCTION_NAME 是函式名稱、RUNTIME 是您使用的執行階段,而 PRIVATE_POOL_NAME 則是集區名稱。

如要停止使用特定私人集區,改為使用預設的 Cloud Build 集區,請在重新部署時使用 --clear-build-worker-pool 標記。

gcloud functions deploy FUNCTION_NAME --no-gen2 \
  --runtime RUNTIME \
  --clear-build-worker-pool
  [FLAGS...]

其中 FUNCTION_NAME 是函式名稱,RUNTIME 則是您使用的執行階段。

Google Cloud 控制台

  1. 在「Cloud Run 函式總覽」頁面中,選取「建立函式」

  2. 在「Runtime, build...」專區中,按一下「Build」分頁,然後在「Build worker pools」文字方塊中輸入私人集區的完整資源名稱。

詳情請參閱「在私人集區中執行建構作業」。

使用自訂服務帳戶保護建構作業

Cloud Run 函式會擷取您的原始碼,並將其傳送至 Cloud Build 進行容器化。這個容器化函式會儲存在 Artifact Registry 中,並以服務形式部署至 Cloud Run。根據預設,Cloud Build 會在執行建構作業時,指派服務帳戶做為主要使用者。自 2024 年 7 月起,機構中的新專案將使用 Compute Engine 預設服務帳戶,做為執行建構作業的實體。詳情請參閱「Cloud Build 預設服務帳戶異動」。基於安全性考量,Compute Engine 預設服務帳戶的權限不足,無法執行建構作業。

對於 Google Cloud 2024 年 7 月前建立的專案,Cloud Build 會使用舊版 Cloud Build 服務帳戶。這個服務帳戶的設計目的是協助使用者執行廣泛的用途,但可能會對專案需求過於寬鬆。如果您想將現有專案從這個服務帳戶移除,可以採取下列步驟,進一步確保函式建構環境的安全性:

  1. 避免使用舊版 Cloud Build 服務帳戶進行建構作業。
  2. 避免使用預設的 Compute 服務帳戶建構。
  3. 設定新的服務帳戶,並授予適當的權限範圍,以便用於建構作業。
  4. 使用已設定的服務帳戶進行建構。

避免使用舊版 Cloud Build 服務帳戶進行建構作業

您可以檢查函式建構作業的詳細資料,確認專案是否使用舊版 Cloud Build 服務帳戶。預設 Build 服務帳戶的格式如下:

PROJECT_NUMBER@cloudbuild.gserviceaccount.com

您可以將機構政策限制 cloudbuild.useBuildServiceAccount 設為 Not Enforced,藉此強制停用此服務帳戶。或者,您也可以移除所有角色授予權限,限制其存取 Google Cloud資源的權限。

避免使用預設運算服務帳戶進行建構作業

預設的運算服務帳戶格式為 PROJECT_NUMBER-compute@developer.gserviceaccount.com。您可以將 org 政策 cloudbuild.useComputeServiceAccount 設為 Not Enforced,藉此停用該政策,使其不再用於建構作業。或者,您也可以停用這個服務帳戶,避免有人使用該帳戶存取 Google Cloud 資源。

提供用於建構函式的服務帳戶

在部署函式時,您可以指定函式設定中的建構服務帳戶。如果系統禁止使用舊版 Cloud Build 服務帳戶和預設運算服務帳戶進行建構作業,您必須指定建構服務帳戶才能部署函式。

如要為您的函式設定及使用建構服務帳戶,請參閱「Cloud Build 的自訂服務帳戶」。