將 App Engine 彈性環境應用程式遷移至 Cloud Run

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的縮寫代碼。此代碼不對應至國家/地區或省份,即使部分區域 ID 可能與常用的國家/地區和省份代碼相似。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是這段時間前建立的現有應用程式,網址可選擇是否包含地區 ID。

進一步瞭解區域 ID

本指南說明如何遷移現有的 App Engine 應用程式,該應用程式透過公開 IP 連線至 Cloud SQL 執行個體。

一般而言,本指南中的步驟會說明如何在 Cloud Run 中部署相同的應用程式原始碼,然後設定該原始碼,使用相同的 Cloud SQL 資料庫使用者連線至現有的執行個體和資料庫。

本指南的步驟未包含如何使用內部私人 IP 連線,因為這需要您先修改應用程式程式碼。不過,將應用程式部署至 Cloud Run 後,您可以使用「從 Cloud Run 連線至 Cloud SQL」一文中的步驟,瞭解使用私人 IP 的規定和方式。

如要進一步瞭解 App Engine 和 Cloud Run 的相似與不同之處,包括遷移至 Cloud Run 的優點,請參閱比較摘要

事前準備

  1. 確認 Cloud Run 符合應用程式需求。請參閱 App Engine 和 Cloud Run 的比較,判斷 CPU 和記憶體等 Cloud Run 資源是否符合您的需求。
  2. 本指南假設您的應用程式執行時不會發生錯誤。

  3. 您需要存取 Cloud SQL 執行個體,包括連線應用程式的資料庫使用者名稱和密碼。Cloud Run 會使用加密技術,並透過 Cloud SQL 驗證 Proxy,使用 Unix 通訊端或 Cloud SQL 連接器連線。

  4. 請注意下列 Cloud Run 差異:

    • Cloud Run 使用 Revision 一詞,而非 Version,代表每次將變更部署至特定服務。首次將應用程式部署到 Cloud Run 服務時,系統會建立第一個修訂版本。後續每次部署服務時,系統都會建立另一個修訂版本。 進一步瞭解如何部署至 Cloud Run

    • 您可以使用 Google Cloud CLI 將原始碼部署至 Cloud Run,也可以透過 Google Cloud 控制台設定及管理應用程式設定。Cloud Run 不需要以檔案為基礎的設定,但支援 YAML 設定,您可以使用 app2run 工具,將現有的 App Engine 檔案轉換為 Cloud Run 檔案。

    • 您部署到 Cloud Run 的每項服務,都會在網址中使用 run.app 網域,以便公開存取服務。

    • 與預設為公開的 App Engine 服務不同,Cloud Run 服務預設為私有,您必須設定服務,才能公開 (未經驗證) 存取。

將應用程式遷移至 Cloud Run

整體來說,將 App Engine 應用程式遷移至 Cloud Run 的程序包含下列步驟:

  1. 啟用必要的 API
  2. 設定 Cloud Run 服務帳戶
  3. 在 Cloud Run 中部署應用程式

啟用必要的 API

如要將應用程式部署至 Cloud Run,請先啟用 Cloud Run 和 Artifact Registry API。

使用 Google Cloud 控制台啟用 API:

前往「APIs and Services」(API 和服務) 頁面

設定 Cloud Run 服務帳戶

您可以選擇建立新的服務帳戶,或繼續在 Cloud Run 中使用與 App Engine 相同的使用者管理服務帳戶。在服務帳戶中,您必須確保已設定下列 Identity and Access Management (IAM) 角色或同等權限:

如要部署到 Cloud Run,您必須具備下列其中一項條件:

  • 版主
  • 編輯
  • Cloud Run 管理員服務帳戶使用者角色
  • 對等 Cloud Run 權限

如要透過公開 IP 連線至 Cloud SQL,您必須具備下列其中一項:

在 Cloud Run 中部署應用程式

將 App Engine 應用程式部署至 Cloud Run 時,不必變更任何程式碼。

在下列步驟中,您會將應用程式部署至 Cloud Run 中的新服務,並同時設定該服務連線至 Cloud SQL。

與 App Engine 彈性環境一樣,Cloud Run 支援以容器和來源為基礎的部署作業。視您採用的部署方法而定,您需要存取容器映像檔或原始碼存放區。

部署容器映像檔

如果您的 App Engine 服務是使用手動建構的容器部署,則可以使用相同的容器映像檔將服務部署到 Cloud Run。如要將 App Engine 容器映像檔部署至 Cloud Run,請按照下列步驟操作:

  1. 請記下容器映像檔所在的登錄網址。這與您在 App Engine 上部署時,於 --image-url 旗標中提供的網址相同。

  2. 部署容器映像檔:

    主控台

    1. 前往 Google Cloud 控制台的「Cloud Run」頁面。

      前往 Cloud Run

    2. 按一下「建立服務」

    3. 按一下「Container image URL」(容器映像檔網址) 欄位中的「選取」按鈕,然後選擇您為 App Engine 部署的容器映像檔。

    4. 輸入服務名稱,選擇代表您要部署應用程式的專屬名稱。

    5. 在「Authentication」(驗證) 部分中,選取「Allow unauthenticated invocations」(允許未經驗證的叫用)

    6. 您必須為 Cloud Run 建立與 App Engine 應用程式 app.yaml 檔案中定義的環境變數。展開「Container, Networking, Security」(容器、網路、安全性) 區段,然後按一下「Environment variables」(環境變數) 下方的「Add Variable」(新增變數),建立下列環境變數:

      • 如要新增 Unix 通訊端,請加入:

          INSTANCE_UNIX_SOCKET: /cloudsql/INSTANCE_CONNECTION_NAME
        
      • 如果是 Cloud SQL 連接器,請新增:

          INSTANCE_CONNECTION_NAME:INSTANCE_CONNECTION_NAME
        

        請按照 project:region:instance-id 的格式,將 INSTANCE_CONNECTION_NAME 替換為您的專案 ID、區域和執行個體。您可以在 Google Cloud 控制台中,前往執行個體的「Overview」(總覽) 頁面查看。

        系統會自動加密這些連線,不需額外設定。

      • DB_NAME:資料庫名稱。

      • DB_USER:資料庫使用者的使用者名稱。

      • DB_PASS:建立資料庫時指定的密碼。

    7. 在「Cloud SQL connections」(Cloud SQL 連線) 部分,按一下「Add Connection」(新增連線) 按鈕,然後選取您先前為 App Engine 建立的執行個體。

    8. 按一下「Deploy」(部署)。 Cloud Run 服務部署完成後,「Service details」(服務詳細資料) 頁面頂端會顯示「URL」(網址)。 按一下「URL」連結,即可在 Cloud Run 上查看已部署的應用程式,該應用程式已連線至 Cloud SQL。

    gcloud

    執行下列指令,在 Cloud Run 中建立新服務。您必須設定設定旗標,納入 App Engine 應用程式 app.yaml 檔案中定義的相同 SQL 連線環境變數:

    gcloud run deploy run-sql --image IMAGE \
      --allow-unauthenticated \
      --add-cloudsql-instances INSTANCE_CONNECTION_NAME\
      --set-env-vars INSTANCE_UNIX_SOCKET="/cloudsql/INSTANCE_CONNECTION_NAME" \
      --set-env-vars INSTANCE_CONNECTION_NAME="INSTANCE_CONNECTION_NAME" \
      --set-env-vars DB_NAME="DB_NAME" \
      --set-env-vars DB_USER="DB_USER" \
      --set-env-vars DB_PASS="DB_PASS"
    

    取代:

    • IMAGE,您要部署的映像檔
    • INSTANCE_CONNECTION_NAME 改成 Cloud SQL 執行個體的執行個體連線名稱或連線名稱清單 (以逗號分隔)。您可以執行下列指令來尋找 INSTANCE_CONNECTION_NAME

        gcloud instances describe INSTANCE_NAME
      
    • DB_NAME 替換為資料庫名稱。

    • DB_USER 改為資料庫的使用者名稱。

    • DB_PASS,並輸入資料庫使用者的密碼。

部署原始碼

Cloud Run 會在內部使用建構包Cloud Build,從您的原始碼自動建構容器映像檔,因此您不需要手動建構容器或指定 Dockerfile。不過,如果存在 Dockerfile,系統就會使用該檔案。

從來源部署 Cloud Run 服務時會使用 Artifact Registry,因此這項功能僅適用於 Artifact Registry 支援的區域。

如要部署先前部署至 App Engine 的相同原始碼:

  1. 變更為應用程式原始碼所在的來源目錄。

      cd YOUR_APPENGINE_CODE_DIR
    
  2. 部署至 Cloud Run。

    如要建構原始碼並部署應用程式,請執行 deploy 指令並加上 --source 旗標。您必須設定設定旗標,納入 App Engine 應用程式 app.yaml 檔案中定義的相同 SQL 連線環境變數:

      gcloud run deploy run-sql --source SOURCE \
        --allow-unauthenticated \
        --add-cloudsql-instances INSTANCE_CONNECTION_NAME\
        --set-env-vars INSTANCE_UNIX_SOCKET="/cloudsql/INSTANCE_CONNECTION_NAME" \
        --set-env-vars INSTANCE_CONNECTION_NAME="INSTANCE_CONNECTION_NAME" \
        --set-env-vars DB_NAME="DB_NAME" \
        --set-env-vars DB_USER="DB_USER" \
        --set-env-vars DB_PASS="DB_PASS"
    

    取代:

    • SOURCE,並提供 App Engine 來源目錄的路徑
    • INSTANCE_CONNECTION_NAME 改成 Cloud SQL 執行個體的執行個體連線名稱或連線名稱清單 (以逗號分隔)。您可以執行下列指令,找出 INSTANCE_CONNECTION_NAME
        gcloud instances describe INSTANCE_NAME
    
    • DB_NAME 替換為資料庫名稱。
    • DB_USER 改為資料庫的使用者名稱。
    • DB_PASS,並輸入資料庫使用者的密碼。
  3. 系統提示時,輸入 SERVICE 的名稱。

  4. 如果系統提示安裝必要 API,請在提示時輸入 y。這項操作只需要為專案執行一次。 等待建構及部署作業完成。完成後,系統會顯示類似以下的訊息:

    Service [my-app] revision [my-app-00000-xxx] has been deployed and is serving 100 percent of traffic. Service URL: https://sample.run.app
    

    如要進一步瞭解如何將原始碼部署至 Cloud Run,請參閱從原始碼進行部署

後續步驟