將第 1 代函式升級為 Cloud Run 函式

本指南說明如何將第 1 代 HTTP 和 Pub/Sub 函式升級為 Cloud Run 函式,並在 Cloud Run 環境中執行。本指南僅適用於 Cloud Functions 第 1 版 API 所建立的第 1 代函式。本指南中的操作說明不適用於 Cloud Functions 第 2 代 API 或 Cloud Functions for Firebase 所建立的第 2 代函式,因為是不同的產品。您可以選擇從現有的第 2 版 API 環境卸載第 2 代函式,而這些函式之後只能使用 Cloud Run Admin API 管理。

升級完成後,只能透過 Cloud Run Admin API 和 Cloud Run 工具操作升級後的函式。

限制

升級工具目前僅支援升級 HTTP 和 Pub/Sub 所觸發的函式。

升級程序總覽

升級程序概述如下:

第 1 代函式升級至 Cloud Run 程序總覽。
圖 1 第 1 代函式升級至 Cloud Run 步驟總覽。

此程序詳述於以下各節。

升級啟動步驟總覽

  • 開始升級時 (使用 Google Cloud CLI 或 Google Cloud 控制台),升級工具會建立一個臨時第 2 代函式,作為原始第 1 代函式的副本。開始遷移程序後,請勿刪除 Cloud Storage 中的函式原始碼,也不要刪除 Artifact Registry 中的函式容器。此第 2 代函式有以下特性:
    • 用作原始第 1 代函式與最終完全升級函式之間的橋接設定。
    • 其名稱、程式碼和設定皆與原始第 1 代函式相同。
      • 如果升級的是 HTTP 函式,則與原始第 1 代函式具有相同的 cloudfunctions.net 網址,而且也會有 run.app Cloud Run 網址。
        • 升級開始後,第 1 代函式與第 2 代函式副本都會指派至相同的 cloudfunctions.net 網址。向 cloudfunctions.net 網址傳送要求時,流量仍會轉送至第 1 代函式。第 2 代函式副本也具有 Cloud Runrun.app 網址。直到下一步驟重新導向流量之前,第 2 代函式網址都不會接收流量。
      • 若是升級 Pub/Sub 函式,則會使用與第 1 代函式相同的 Pub/Sub 主題,但此時尚不會建立訂閱項目。
    • 請注意,如果未將依附元件固定於特定版本,新建立的第 2 代函式副本可能會使用較新的依附元件版本。
  • 第 1 代函式會繼續列於第 1 代Google Cloud 控制台,而臨時複製的第 2 代副本會首次出現在 Cloud Run 控制台

範例:下表顯示初始升級步驟期間的 HTTP 函式狀態。

函式 提供流量? 顯示於控制台?
原始第 1 代函式 是,來源為 cloudfunctions.net 網址 是,第一代控制台。
新的第 2 代副本 不會。此函式同時有 cloudfunctions.netrun.app 網址,但必須完成重新導向步驟,才會開始提供流量。 是,Cloud Run 控制台。

重新導向流量總覽

  • 重新導向流量時,結果取決於所升級的函式為 HTTP 函式或 Pub/Sub 函式:
    • 如要升級 HTTP 函式,導向 cloudfunctions.net 網址的流量會前往第 2 代函式。第 1 代函式仍會存在,但不會接收任何流量。
    • 若要升級 Pub/Sub 函式,第 2 代函式觸發條件會使用相同的 Pub/Sub 主題,但會建立新的訂閱項目,將訊息傳送至 Cloud Run 函式。而舊的訂閱項目會被刪除。
  • 第 1 代函式會從第 1 代控制台消失。
  • 執行 gcloud functions describe 指令後,即可看到函式處於第 2 代環境。
  • 請注意,這個轉換階段存在以下風險,尤其是 Pub/Sub 函式:
    • 重複的訊息:系統會先建立新訂閱項目,再刪除舊訂閱項目。在轉換期間,系統可能會將相同的 Pub/Sub 訊息同時傳送至舊函式和新函式。
    • 遺失訊息:如果升級的是 Pub/Sub 函式,而新函式在重新導向流量後無法處理訊息,則可能會遺失 Pub/Sub 訊息。如果函式已停用重試功能,則尤其容易發生此狀況。詳情請參閱「升級 Pub/Sub」。

範例:下表顯示流量重新導向步驟期間的 HTTP 函式狀態。

函式 提供流量? 顯示於控制台?
原始第 1 代函式 不會。 不再顯示在第 1 代控制台,但仍然存在。
新的第 2 代副本 是,來源為 cloudfunctions.net 網址以及 run.app Cloud Run 網址。 是,Cloud Run 控制台。

復原流量總覽

  • 復原流量時,升級工具會將第 2 代函式副本所有流量復原至原始的第 1 代函式,屆時會由該函式提供所有流量,而第 2 代函式仍可用於測試。
  • 如果復原的是 Pub/Sub 函式,系統會重新建立第 1 代函式訂閱項目,並刪除第 2 代函式訂閱項目。
  • 如要在復原流量後繼續升級,請先將流量重新導向至新的第 2 代函式。

範例:下表顯示復原流量後 HTTP 函式的狀態。

函式 提供流量? 顯示於控制台?
原始第 1 代函式 是。 是,第一代控制台。
新的第 2 代副本 不會。 不再顯示於 Cloud Run 控制台,但仍然存在。

取消作業總覽

升級作業在提交之前,隨時都可以取消。一旦提交完成,升級就無法復原。

範例:下表顯示取消升級後的 HTTP 函式狀態。

函式 提供流量? 顯示於控制台?
原始第 1 代函式 是。 是,第一代控制台。
第 2 代副本 不會。 不再顯示於 Cloud Run 控制台,且不復存在。

提交作業總覽 (無法復原)

  • 完成升級後,第 1 代函式的升級程序隨即完成。這個動作無法復原。
  • 系統會基於 Cloud Run Admin API,將臨時第 2 代函式轉換為正式的 Cloud Run 函式。
    • 這等同於對第 2 代函式執行 detach 指令detach 指令會將 Cloud Functions 第 2 代函式從其原有的 API 環境中卸載。
    • 升級後,您只能使用 Cloud Run Admin API 和 Cloud Run 工具操作函式。
  • 系統會刪除第 1 代函式,並將所有流量提供給升級後的 Cloud Run 函式。

範例:下表顯示提交升級後 HTTP 函式的狀態:

函式 提供流量? 顯示於控制台?
基於 Cloud Run Admin API 的新 Cloud Run 函式。 是,來源為 cloudfunctions.net 網址以及 run.app Cloud Run 網址。 是,Cloud Run 控制台。
原始第 1 代函式 不會。 不會,已不復存在。
第 2 代副本 不會。 不會,已不復存在。

測試訣竅

測試是升級程序的必要步驟。

建議您先以非正式版函式測試升級工具,熟悉工具的使用方式。請在充分熟練程序且穩定測試成功後,再開始升級正式版函式。

在升級程序中,可使用以下幾項工具來測試函式:

  • 每當函式變更狀態時,請使用 Google Cloud CLI describe 指令確認函式存在,並驗證環境及版本皆為正常。請依據要升級函式的目前狀態,選用下列相應的指令:

    • Cloud Run:

      gcloud run services describe FUNCTION_NAME --format yaml
      
    • Cloud Functions:

      gcloud functions describe --region REGION_NAME FUNCTION_NAME
      
  • 請使用第 1 代控制台與 Cloud Run 控制台的「Logging」頁面,查看函式流量的詳細資料。

  • 在升級過程中,可透過 Cloud Run 控制台查看並測試第 2 代函式副本,瞭解其進展狀況。

    • 升級程序開始後,請使用「Triggers」(觸發條件)分頁測試第 2 代函式副本。
    • 使用「YAML」分頁標籤查看函式詳細資料,包括 Cloud Run run.app 網址。

事前準備

開始升級前,請確認符合下列先決條件:

  • 已啟用 Cloud Run API:

    gcloud services enable run.googleapis.com
  • 具備現有的第 1 代 HTTP 或 Pub/Sub 函式。

  • 具備必要的 IAM 角色:

    • 您必須在函式的服務帳戶中設定 roles/iam.serviceAccountUser
    • 您必須具備專案的 roles/cloudfunctions.admin 角色或同等角色才能執行升級作業。
    • 如果是設定為 no-retry 的 Pub/Sub 函式,則您必須有 roles/serviceusage.consumer 角色或具備 serviceusage.services.user 權限的自訂角色。您也需要 pubub.topic.getIAMPermissionspubsub.topic.setIAMPermissions 角色。
    • 您必須具備 roles/pubsub.admin 角色才可提交 Pub/Sub 函式升級作業。roles/pubsub.admin 是專案層級角色,可針對專案中所有 Pub/Sub 資源授予管理員權限。

    您可依下列方式查看函式的身分與存取權管理 (簡稱 IAM) 政策:

    gcloud functions get-iam-policy FUNCTION_NAME
  • 您必須對函式服務帳戶授予 roles/cloudfunctions.admin 角色。如要授予 roles/cloudfunctions.admin 角色,請使用 gcloud functions add-iam-policy-binding 指令,例如:

    gcloud functions add-iam-policy-binding FUNCTION_NAME \
       --region=REGION \
       --member=serviceAccount:SERVICE_ACCOUNT \
       --role="roles/cloudfunctions.admin"
    

    嘗試執行這項指令時若發生錯誤,請確認函式是否符合貴組織的政策。例如,貴組織可能不允許未經驗證的 HTTP 函式。

如要進一步瞭解成員和角色,請參閱「新增主體和授予角色」。

升級 HTTP 函式

本節說明如何將第 1 代 HTTP 函式升級為 Cloud Run 函式。如要瞭解如何升級第 1 代 Pub/Sub 函式,請參閱後續章節

如後續章節所述,重新導向流量完成升級後,與原始第 1 代 HTTP 函式相關聯的 cloudfunctions.net 網址會繼續運作,並將流量導向新的 Cloud Run 函式。

開始升級 HTTP 函式

此步驟會建立第 1 代函式的第 2 代副本。

控制台

  1. 前往 Google Cloud 控制台的「Functions (1st gen)」(函式 (第 1 代)) 頁面:

    前往「Functions (1st gen)」(函式 (第 1 代))

  2. 找出要升級的第 1 代函式,並確認「Upgrade status」(升級狀態) 欄中的狀態為「Ready to upgrade」(可升級)

  3. 按一下函式名稱以顯示詳細資料頁面。

  4. 在函式詳細資料頁面中,按一下「Upgrade eligible」(符合升級資格) 下方的「Upgrade」(升級)

  5. 按照提示開始升級程序。

此步驟完成後,系統會顯示「Upgrade in progress」(升級中)面板,提示您點按「Go to Cloud Run」(前往 Cloud Run)連結,繼續進行升級程序。

gcloud

執行加上 --setup-config 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --setup-config

FUNCTION_NAME 替換為第 1 代函式的名稱。

升級程序開始後:

  • 第 1 代函式會繼續將流量導向原始網址。如要查看這個網址,請前往函式 (第 1 代) 控制台的函式詳細資料頁面,然後開啟「Trigger」(觸發條件)分頁。
  • 系統會建立第 2 代函式,以作為第 1 代函式的副本。其與第 1 代函式同樣具有 cloudfunctions.net 網址以及新的 Cloud Run run.app 網址。如要查看這兩個網址,請前往 Cloud Run 控制台的函式詳細資料頁面,然後開啟「YAML」分頁。或者,亦可使用下列指令:

    gcloud run services describe YOUR_SERVICE_NAME \
        --region YOUR_REGION \
        --format="value(status.url)"
  • 您可以確認第 1 代函式的第 2 代副本是否存在:

    gcloud run services describe FUNCTION_NAME --format yaml
    
  • 您可以驗證第 1 代函式的環境,指令輸出內容應顯示該函式環境為 1st gen

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

升級啟動步驟疑難排解

下列狀況會導致升級失敗:

  • 相同區域和專案中已有同名函式。
  • 第 1 代函式使用已停用的執行階段,此狀況必須改用受支援的執行階段重新部署才可升級。
  • 呼叫端沒有 cloudfunctions.functions.generationUpgrade 權限。請注意,呼叫端必須具備專案的 roles/cloudfunctions.admin 角色或同等角色。

重新導向 HTTP 函式的流量

在此階段,應分別測試原始函式及其副本的網址。請先確認兩者皆運作正常,再繼續下一步驟。如果遇到問題,請取消升級並返回淨空狀態,以便處理第 1 代函式的潛在問題。

重新導向步驟會將流量從第 1 代 Cloud Functions 網址重新導向至第 2 代函式副本。

控制台

  1. 在 Cloud Run 函式詳細資料頁面的「Upgrade in progress」(升級中) 面板中,按一下「Go to Cloud Run」(前往 Cloud Run)
  2. 按一下「Test function」(測試函式) 對函式進行測試 (此為選擇性步驟,但強烈建議執行)。
  3. 準備好時,請按一下「Redirect traffic」(重新導向流量)

gcloud

執行加上 --redirect-traffic 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --redirect-traffic

重新導向流量後,第 2 代函式副本會將流量提供給函式網址 (cloudfunctions.net) 和 Cloud Run 網址 (run.app)。

在重新導向後測試 HTTP 函式

  • 驗證函式環境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

    輸出內容會顯示環境為 2nd gen

  • 請使用控制台記錄工具對照比較第 2 代函式副本與原始第 1 代函式。

重新導向步驟疑難排解

下列狀況會導致重新導向失敗:

  • 尚未執行先前步驟 (--setup-config)。

復原 HTTP 函式的流量

如果還沒準備好升級,可以將流量復原至第 1 代函式。

控制台

Cloud Run 控制台的 Cloud Run 函式詳細資料頁面中,點選「Upgrade in progress」(升級中) 面板中的「Rollback traffic」(復原流量)

gcloud

執行加上 --rollback-traffic 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --rollback-traffic

復原流量後:

  • 第 1 代函式會將流量提供給 cloudfunctions.net 網址。
  • 此時仍可使用第 2 代函式副本,並透 run.app 網址進行觸發。

您可以按照下列步驟驗證函式環境。輸出內容應顯示函式環境為 1st gen

gcloud functions describe --region REGION_NAME FUNCTION_NAME

若未將流量重新導向至第 2 代函式,復原就會失敗。

提交 HTTP 函式升級程序

此步驟會完成升級,之後就無法取消程序。執行此步驟前,請務必徹底測試函式。

控制台

Cloud Run 控制台的 Cloud Run 函式詳細資料頁面中,點選「Upgrade in progress」(升級中) 面板中的「Commit upgrade」(提交升級)

gcloud

執行加上 --commit 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --commit

提交升級後:

  • 系統會刪除第 1 代函式,並卸載第 2 代函式副本,使其成為完備的 Cloud Run 函式。
  • Cloud Run 函式會保留 cloudfunctions.net 網址和新的 run.app 網址。
  • 您可以驗證第 1 代函式是否已不存在:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    
  • 您可以驗證 Cloud Run 服務詳細資料:

    gcloud run services describe FUNCTION_NAME --format yaml
    

輸出內容會顯示已建立的新生成內容,且 Goog-managed-by 標籤的值為空白。

如果流量未重新導向至 Cloud Run 函式,提交作業就會失敗。

升級 Pub/Sub 函式

本節說明如何將第 1 代 Pub/Sub 函式升級為 Cloud Run 函式。

第 1 代 Pub/Sub 函式升級的基本模式與 HTTP 函式相同,但另須注意下列事項:

  • Cloud Run 不支援停用「失敗重試」功能,但這是第一代函式的預設設定,因此兩種類型的函式可能同時並存升級工具的行為取決於這項設定:

    • 如果第 1 代函式已停用重試功能 (第 1 代的預設設定),升級工具會建立 Eventarc Pub/Sub 觸發條件,以及無效信件佇列 (DLQ)。升級工具會為訂閱項目及其主題設定身分與存取權管理 (IAM) 政策。升級完成後,無效信件佇列主題會儲存未送達的訊息;如有需要,為該無效信件佇列建立新的訂閱項目即可擷取。如要為 DLQ 主題使用客戶自行管理的加密金鑰 (CMEK),請在遷移後更新主題的 CMEK
    • 如果第 1 代函式已啟用重試功能,升級工具會以預設的設定值建立 Eventarc Pub/Sub 觸發條件。

開始升級 Pub/Sub 函式

此步驟會建立第 1 代函式的第 2 代副本。

控制台

  1. 前往 Google Cloud 控制台的「Cloud Functions (1st gen)」(Cloud Functions (第 1 代)) 頁面:

    前往「Functions (1st gen)」(函式 (第 1 代))

  2. 找出要升級的第 1 代函式,並確認「Upgrade status」(升級狀態) 欄中的狀態為「Ready to upgrade」(可升級)

  3. 按一下函式名稱以顯示詳細資料頁面。

  4. 在函式詳細資料頁面中,按一下「Upgrade eligible」(符合升級資格) 下方的「Upgrade」(升級)

此階段完成後,系統會顯示「Upgrade in progress」(升級中)面板,提示您點按「Go to Cloud Run」(前往 Cloud Run)連結,繼續進行升級程序。

gcloud

執行加上 --setup-config 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --setup-config

FUNCTION_NAME 替換為第 1 代函式的名稱。

如有需要,可選擇為觸發條件指定服務帳戶:

gcloud beta functions upgrade FUNCTION_NAME --setup-config --trigger-service-account=CUSTOM_SA_EMAIL

CUSTOM_SA_EMAIL 替換成自訂服務帳戶的電子郵件地址。

如果觸發服務帳戶 (預設 Compute Engine 服務帳戶或指定的自訂服務帳戶) 缺少 run.route.invoke 權限,系統會提示您繫結 roles/run.invoker 角色。

升級程序開始後:

  • 第 1 代函式會繼續將流量導向原始網址。
  • 系統會建立第 1 代函式的第 2 代副本。您可以使用 Cloud Run 網址觸發這項函式。
  • 第 1 代函式會繼續將流量導向至其 cloudfunctions.net 網址。

在升級啟動步驟後測試 Pub/Sub 函式

  • 您可以確認第 1 代函式的第 2 代副本是否存在:

    gcloud run services describe FUNCTION_NAME --format yaml
    
  • 您可以驗證第 1 代函式的環境,指令輸出內容應顯示該函式環境為 1st gen

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    
  • 將訊息發布至目標主題,以觸發第 1 代函式。

  • 如要測試新函式,請為函式新增 Pub/Sub 觸發條件,並確認函式是否正常回應觸發條件:

    1. 在 Cloud Run 控制台選取函式,然後開啟「Triggers」(觸發條件) 分頁。
    2. 按一下「Add Trigger」(新增觸發條件) ,然後在「Eventarc trigger」(Eventarc 觸發條件) 面板中,選取要用來觸發函式的主題。根據預設,系統會在訊息發布至主題時觸發函式。
    3. 在「Upgrade in Progress」(升級中) 面板按一下「Test function」(「測試函式」)
    4. 在開啟的 Cloud Code for Cloud Shell 視窗中,將訊息發布至「Triggers」(觸發條件) 分頁中新增的主題。
    5. 在 Cloud Run 控制台中,前往「Observability」(觀測功能) >「Logs」(記錄),確認函式已發布訊息。或者,也可以使用 Cloud Code for Cloud Shell 中的指令列查看記錄輸出內容。

    例如,假設有一個發布問候語的基本 Hello World 函式。指定新的觸發條件後,即可在 Cloud Code for Cloud Shell 進行測試,方法如下:

    gcloud pubsub topics publish YOUR_TOPIC_NAME --message YOUR_NAME
    gcloud functions logs read --region YOUR_REGION --limit 50
    

Pub/Sub 升級啟動步驟疑難排解

下列狀況會導致升級失敗:

  • 相同區域和專案中已有同名 Cloud Run 函式。
  • 您嘗試升級第 2 代函式。
  • 第 1 代函式已在進行升級程序。
  • 第 1 代函式不存在。
  • 第 1 代函式處於錯誤狀態。
  • 第 1 代函式既非 HTTP 函式也不是 Pub/Sub 函式。
  • 呼叫端沒有 cloudfunctions.functions.generationUpgrade 權限。請注意,呼叫端必須具備專案的 roles/cloudfunctions.admin 角色或同等角色。

重新導向 Pub/Sub 函式的流量

此步驟會將流量從第 1 代 Cloud Functions 網址重新導向至第 2 代函式副本。

控制台

  1. 在 Cloud Run 函式詳細資料頁面的「Upgrade in progress」(升級中) 面板中,按一下「Go to Cloud Run」(前往 Cloud Run)
  2. 按一下「Test function」(測試函式) 對函式進行測試 (此為選擇性步驟,但強烈建議執行)。
  3. 準備好時,請按一下「Redirect traffic」(重新導向流量)

gcloud

執行加上 --redirect-traffic 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --redirect-traffic

重新導向流量後,第 2 代函式會同時透過 Cloud Functions 網址和 Cloud Run 網址提供流量。

在重新導向流量後測試 Pub/Sub

  • 您可以驗證函式環境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

    輸出內容會顯示環境為 2nd gen

    • eventTrigger.retryPolicy 符合函式建立期間指定的重試政策。
    • eventTrigger.serviceAccountEmail 是預設的 Compute Engine 服務帳戶或指定的自訂服務帳戶。
    • 現在將訊息發布至目標主題,就會觸發第 2 代函式副本。

Pub/Sub 重新導向步驟疑難排解

下列狀況會導致重新導向失敗:

  • 尚未執行先前步驟 (--setup-config)。
  • Cloud Run 函式已被手動刪除。

復原 Pub/Sub 函式的流量

此步驟會將流量復原至第 1 代函式。

控制台

在 Cloud Run 函式詳細資料頁面的「Upgrade in progress」(升級中) 面板按一下「Rollback traffic」(復原流量)

gcloud

執行加上 --rollback-traffic 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --rollback-traffic

復原流量後:

  • 函式會還原至初始升級步驟剛完成後的狀態。
  • 第 1 代函式會將流量提供給 cloudfunctions.net 網址。
  • 此時仍可使用第 2 代函式副本,並透過 Cloud Run 網址進行觸發。

  • 您可以驗證函式環境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

    輸出內容應顯示函式環境為 1st gen

  • 將訊息發布至目標主題,即可觸發第 1 代函式。

如果未將流量重新導向至 Cloud Run 函式,復原就會失敗。

提交 Pub/Sub 函式升級

此步驟會完成升級,之後就無法取消程序,且不可復原。執行此步驟前,請務必徹底測試函式。

控制台

在 Cloud Run 函式詳細資料頁面的「Upgrade in progress」(升級中) 面板按一下「Commit upgrade」(提交升級)

gcloud

執行加上 --commit 旗標的 gcloud beta functions upgrade 指令:

gcloud beta functions upgrade FUNCTION_NAME --commit

提交升級後:

  • 系統會刪除第 1 代函式。
  • Cloud Run 函式會保留 cloudfunctions.net 網址。
  • 您可以驗證清單不再顯示該函式:
    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    
  • 您可以驗證 Cloud Run 服務詳細資料:
    gcloud run services describe FUNCTION_NAME --format yaml
    
    • 輸出內容會顯示已建立新世代函式。「Goog-managed-by」標籤的值應為空白。
  • 若在建立第 1 代函式時未勾選「Retry on Failures」(失敗重試),觸發條件的 Pub/Sub 訂閱項目就會有無效信件佇列 (DLQ)。
  • 現在將訊息發布至目標主題,即可觸發第 Cloud Run 函式。

下列狀況會導致提交失敗:

  • 流量未重新導向至 Cloud Run 函式。
  • Cloud Run 函式已被手動刪除。

取消升級

此動作會取消升級程序。系統會刪除新的第 2 代函式副本,而第 1 代函式則會繼續將流量導向至原本的 cloudfunctions.net 網址。升級過程中可隨時執行此動作,但必須在提交升級前完成。

如果使用 Google Cloud 控制台執行升級,則只能在初始升級作業完成後立即透過使用者介面取消程序。「Abort」(取消) 按鈕位於 Functions (第 1 代) 控制台的左上角。如果使用 Google Cloud CLI,則可在提交前隨時取消升級,提交後就無法復原。

即使透過 Google Cloud 控制台執行升級程序,仍可使用 Google Cloud CLI 取消函式升級:

gcloud beta functions upgrade FUNCTION_NAME --abort

取消升級後:

  • 第 2 代函式副本隨之刪除。
  • 第 1 代函式會將流量提供給 cloudfunctions.net 網址。
  • Google Cloud 控制台,函式的升級狀態會從「Configuration copied」(已複製設定) 變回「Ready to Upgrade」(可升級)
  • 您可以驗證 Cloud Run 服務已不再顯示於清單中:

    gcloud run services list
  • 您可以驗證函式環境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

輸出內容會顯示函式環境為 1st gen

如果已提交升級作業,取消作業就會失敗。

檢查轉換後的 IAM 政策

在升級程序中,升級工具會盡可能轉換第 1 代 Cloud Functions 與新版 Cloud Run 函式之間的角色和權限。

升級程序會將第 1 代 Cloud Functions IAM 角色轉換為對應的 Cloud Run 角色。

轉換規則:

  • roles/cloudfunctions.invoker 轉換為 roles/run.invoker
  • roles/cloudfunctions.developer 轉換為 roles/run.sourceDeveloper
  • roles/cloudfunctions.viewer 轉換為 roles/run.sourceViewer
  • roles/cloudfunctions.admin 會轉換為 roles/run.adminroles/run.sourceDeveloper

如果呼叫端缺少 projects.getIamPolicyrun.setIamPolicy 權限,IAM 政策升級就會失敗。呼叫端必須具備專案的 roles/cloudfunctions.admin 角色或同等角色。

驗證 IAM 政策升級

為驗證 IAM 政策正確升級,請在升級程序的各階段檢查政策設定值均為正常:

  1. 開始函式升級程序:

    gcloud beta functions upgrade FUNCTION_NAME --setup-config
    

    如果偵測到自訂角色繫結,輸出內容會顯示警告訊息。

  2. 驗證在第 1 代函式上設定的 IAM 政策是否已轉換並升級至 Cloud Run 函式:

    gcloud functions get-iam-policy FUNCTION_NAME
    gcloud run services get-iam-policy FUNCTION_NAME
    
  3. 驗證專案層級的 Cloud Run functions 叫用者角色繫結是否已轉換並升級至 Cloud Run 函式:

    gcloud projects get-iam-policy PROJECT_ID | grep "roles/cloudfunctions.invoker"
    gcloud run services get-iam-policy FUNCTION_NAME
    

後續步驟