將 App Engine 自訂網域遷移至 Cloud Load Balancing

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的簡寫代碼。雖然某些區域 ID 可能看起來與常用的國家/地區代碼相似,但此代碼並非對應國家/地區或省份。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是在此日期之前建立的現有應用程式,網址中則可選擇加入地區 ID。

進一步瞭解區域 ID

本指南說明如何使用 Cloud Load Balancing 為 App Engine 應用程式設定新的公開端點。

使用 Cloud Load Balancing 時,您可以將自訂網域端點設為前端服務,並使用無伺服器網路端點群組 (NEG) 將 App Engine 應用程式設為後端服務。流量會以與先前相同的方式轉送至 Cloud Load Balancing 前端服務的端點,包括您在應用程式的 dispatch.yaml 檔案中定義的所有轉送規則。

下圖說明應用程式的變更:

使用 App Engine 自訂網域,並將傳入的要求轉移至 Cloud Load Balancing 前端服務,該服務會將要求分發至後端 App Engine 服務。

只要遷移至 Cloud Load Balancing,您就能在網域上處理流量時,享有更彈性的靈活度,例如從 Cloud Storage 提供靜態內容,或是在其他運算平台 (例如 Cloud Run 和 Google Kubernetes Engine) 上新增服務。

您還可以使用 App Engine 無法提供的關鍵 Google Cloud 功能,包括:

  • Google Cloud Armor:提供進階 DDoS 防護、IP 和地理位置存取權控管、網頁應用程式防火牆規則等功能,進一步提升安全性
  • Cloud CDN:用於快取內容傳遞
  • SSL 政策:用於管理應用程式接受的 SSL 功能和 TLS 版本

本指南將說明如何設定,將傳入的要求從使用自訂網域的 App Engine 服務轉移至 Cloud Load Balancing 前端服務:

  1. 確認您具備必要權限
  2. 建立 Google 代管的憑證
  3. 設定 Cloud Load Balancing
  4. 測試負載平衡器
  5. 將網域連結至負載平衡器
  6. 刪除 App Engine 自訂網域對應
  7. 設定輸入控管,只允許透過 Cloud Load Balancing 存取

事前準備

擁有 App Engine 應用程式,且已在 App Engine 設定中設定自訂網域

設定權限

如要按照本指南操作,您必須在專案中建立 Google 管理的憑證、無伺服器的 NEG 和外部 HTTP(S) 負載平衡器。您必須是專案擁有者或編輯者,或者具有下列 IAM 角色

工作 必要角色
使用憑證管理工具建立 Google 代管的 SSL 憑證 Certificate Manager 擁有者Certificate Manager 編輯者,以及Compute 負載平衡器管理員
更新自訂網域的 DNS 記錄 如果您使用 Cloud DNS 做為 DNS 解決方案,請選擇「Cloud DNS 管理員」

如果使用其他 DNS 供應商,您必須具備權限,才能新增及更新自訂網域的 DNS 記錄。
建立負載平衡器和網路元件 Compute 網路管理員
建立及修改 NEG Compute 執行個體管理員
建立及修改 SSL 憑證 Compute 安全管理員
刪除 App Engine 設定中的自訂網域 App Engine 管理員角色,或具備 appengine.applications.update 權限的角色。

建立 Google 代管的 SSL 憑證

Google 代管的 SSL 憑證 (在說明文件中也稱為 TLS 憑證) 可讓您自動取得、管理及更新憑證。 Google Cloud 如要遷移至 Cloud Load Balancing 前端,且不影響現有 App Engine 服務的服務中斷時間,您必須使用憑證管理工具建立 DNS 授權和 Google 管理的憑證。

請注意,Cloud Load Balancing 說明文件中提供類似的建立 Google 代管 SSL 憑證操作說明,但該處的操作說明使用負載平衡器授權,因此 App Engine 服務可能需要長達數小時的停機時間。詳情請參閱「Google 代管憑證的網域授權」。

如要避免應用程式停機,請按照本頁面的步驟操作。

建立 DNS 授權

  1. 請執行下列指令,在憑證管理工具中建立 DNS 授權:

    gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
        --domain="DOMAIN_NAME"
    gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
    

    更改下列內容:

    • AUTHORIZATION_NAME 是描述此 DNS 授權的專屬名稱。
    • DOMAIN_NAME 是您要建立此 DNS 授權的 App Engine 自訂網域名稱。
  2. 請注意 gcloud 指令傳回的 CNAME。您必須在下列步驟中使用該記錄更新 DNS 記錄。

在 DNS 設定中新增 CNAME 記錄

視您是否使用 Cloud DNS 或其他第三方 DNS 解決方案而定,請按照適合您用途的指示操作:

Cloud DNS

建立 DNS 授權時,gcloud 指令會傳回對應的 CNAME 記錄。您必須將這個 CNAME 記錄新增至目標網域的 DNS 區域中的 DNS 設定,如下所示:

  1. 啟動 DNS 記錄交易:

    gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
    

    DNS_ZONE_NAME 替換為公開 DNS 區域的名稱。如果您使用 Google Cloud 管理網域並接收該網域的流量,就會建立公開 DNS 區域。如要查看公開 DNS 區域,請參閱「列出並說明受管理的區域」。

  2. 將 CNAME 記錄新增至目標 DNS 區域:

    gcloud dns record-sets transaction add CNAME_RECORD \
      --name="_acme-challenge.DOMAIN_NAME." \
      --ttl="30" \
      --type="CNAME" \
      --zone="DNS_ZONE_NAME"
    

    更改下列內容:

    • CNAME_RECORD 是建立對應 DNS 授權gcloud 指令傳回的 CNAME 記錄完整值。
    • DOMAIN_NAME 是 App Engine 自訂網域名稱。您必須在目標網域名稱後方加上句號。
    • DNS_ZONE_NAME 是先前指定的 DNS 區域名稱。
  3. 執行 DNS 記錄交易,儲存所做的變更:

    gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
    

    DNS_ZONE_NAME 替換為先前指定的 DNS 區域名稱。

其他 DNS 解決方案

使用上一個部分的 (主機) 名稱 (_acme-challenge.DOMAIN_NAME) 和資料欄位,在網域的 DNS 設定中新增 CNAME 記錄。請參閱第三方 DNS 解決方案的說明文件。

建立參照 DNS 授權的 Google 代管憑證

如要建立參照您在先前步驟中建立的 DNS 授權的 Google 代管憑證,請執行下列指令:

  1. 建立 Google 代管的憑證

    gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains=DOMAIN_NAME --dns-authorizations=AUTHORIZATION_NAME
    

    更改下列內容:

    • CERTIFICATE_NAME 是描述憑證的專屬名稱。
    • DOMAIN_NAME 是 App Engine 自訂網域名稱。
    • AUTHORIZATION_NAME 是先前建立的 DNS 授權名稱。
  2. 確認憑證是否有效。

    請先使用下列指令驗證憑證本身是否處於啟用狀態,再將憑證部署至負載平衡器。請注意,憑證狀態最多可能需要經過幾小時才會變更為 ACTIVE

    gcloud certificate-manager certificates describe CERTIFICATE_NAME
    

    CERTIFICATE_NAME 替換為先前建立的 Google 管理憑證名稱。

    gcloud 工具會傳回類似下列內容的輸出結果:

    certificatePem: myPEM
    createTime: '2021-10-20T12:19:53.370778666Z'
    expireTime: '2022-05-07T05:03:49Z'
    managed:
      authorizationAttemptInfo:
      - domain: example.com
        state: AUTHORIZED
      dnsAuthorizations:
      - projects/my-project/locations/global/dnsAuthorizations/myAuth
      domains:
      - example.com
      state: ACTIVE
    name: projects/myProject/locations/global/certificates/myCert
    scope: myScope
    sanDnsnames:
    - example.com
    updateTime: '2021-10-20T12:19:55.083385630Z'
    

    如果 gcloud 工具傳回不同的輸出內容,請參閱疑難排解 Certificate Manager

建立憑證對應關係

  1. 建立憑證對應關係

    gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
    

    CERTIFICATE_MAP_NAME 替換為描述憑證對應的專屬名稱。

  2. 建立憑證對應關係項目,並將其與先前建立的憑證和憑證對應關係建立關聯:

    gcloud certificate-manager maps entries create CERTIFICATE_MAP_ENTRY_NAME \
        --map=CERTIFICATE_MAP_NAME \
        --certificates=CERTIFICATE_NAME \
        --set-primary
    

    更改下列內容:

    • CERTIFICATE_MAP_ENTRY_NAME 是描述此憑證對應項目的專屬名稱。
    • CERTIFICATE_MAP_NAME 是此憑證對應項目所附加的憑證對應關係名稱。
    • CERTIFICATE_NAME 是您要與此憑證對應項目相關聯的憑證名稱。

    您可以附加 --set-primary 標記,確保在未指定網域名稱時,系統會使用憑證做為預設憑證。

  3. 確認憑證對應關係是否有效。

    請使用下列指令,確認憑證對應項目是否處於有效狀態,然後再將對應的憑證對應項目附加至目標 Proxy:

    gcloud certificate-manager maps entries describe CERTIFICATE_MAP_ENTRY_NAME \
        --map=CERTIFICATE_MAP_NAME
    

    更改下列內容:

    • CERTIFICATE_MAP_ENTRY_NAME 是先前所述的憑證對應項目名稱。
    • CERTIFICATE_MAP_NAME 是這個憑證對應項目附加的憑證對應關係名稱。

    gcloud 工具會傳回類似下列內容的輸出結果:

    createTime: '2021-09-06T10:01:56.229472109Z'
    name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry
    state: ACTIVE
    updateTime: '2021-09-06T10:01:58.277031787Z'
    

如要進一步瞭解如何使用 Certificate Manager,請參閱「Certificate Manager 的運作方式」。

設定 Cloud Load Balancing

取得 Google 代管的憑證後,您可以使用 Cloud 負載平衡前端服務取代 App Engine 自訂網域。

下圖顯示 HTTPS 負載平衡器,其中包含單一後端服務和無伺服器網路端點群組。

將流量分配給 App Engine 應用程式

轉送規則會將來自外部 IP 位址的傳入要求,以及直接要求轉送至目標 HTTPS Proxy。HTTPS 負載平衡器會使用網址對應,將要求導向後端服務,後者包含 App Engine 服務的無伺服器 NEG。

保留外部 IP 位址

設定 Cloud Load Balancing 前,您必須設定全域靜態外部 IP 位址,讓使用者連上負載平衡器。

控制台

  1. 前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。

    前往「外部 IP 位址」

  2. 按一下 [Reserve static address] (預約靜態位址) 以預留 IPv4 位址。

  3. 為靜態位址指派「名稱」,例如 appengine-external-ip

  4. 將「Network tier」(網路級別) 設為「Premium」(進階)。

  5. 將「IP version」(IP 版本) 設為「IPv4」

  6. 將「Type」(類型) 設為「Global」(通用)

  7. 按一下「保留」

gcloud

  1. 建立外部 IP 位址保留作業:

    gcloud compute addresses create EXTERNAL_IP \
        --network-tier=PREMIUM \
        --ip-version=IPV4 \
        --global
    

    EXTERNAL_IP 是要建立的位址名稱。

  2. 請注意預留的 IPv4 位址:

    gcloud compute addresses describe EXTERNAL_IP \
        --format="get(address)" \
        --global
    

設定 App Engine 的後端服務

網路端點群組 (NEG) 可用來指定負載平衡器的一組後端端點。如要指定指向 App Engine 服務的後端,請先設定無伺服器 NEG,然後在 Cloud Load Balancing 中設定後端服務、轉送規則和前端服務。

  1. 為 App Engine 應用程式建立無伺服器 NEG:

    gcloud compute network-endpoint-groups create APP_ENGINE_NEG \
    --network-endpoint-type=serverless \
    --app-engine-app \
    --region=APP_ENGINE_REGION
    

    更改下列內容:

    • APP_ENGINE_NEG 是網路端點群組的名稱。
    • APP_ENGINE_REGION 是 App Engine 中設定的區域

    您可以附加上述 --app-engine-app 旗標,使用預設轉送,而非將要求導向特定 App Engine 服務。使用預設轉送代表要求會傳送至預設服務 (https://PROJECT_ID.REGION_ID.r.appspot.com),否則會遵循您在 dispatch.yaml 檔案中定義的所有轉送規則。這與使用 App Engine 設定的自訂網域相同。

  2. 建立後端服務:

    gcloud compute backend-services create APP_ENGINE_BACKEND \
      --global \
      --load-balancing-scheme=EXTERNAL_MANAGED
    

    APP_ENGINE_BACKEND 替換為要建立的後端服務名稱。

  3. 將無伺服器 NEG 新增至 App Engine 後端服務:

    gcloud compute backend-services add-backend APP_ENGINE_BACKEND \
    --global --network-endpoint-group=APP_ENGINE_NEG \
    --network-endpoint-group-region=APP_ENGINE_REGION
    

    更改下列內容:

    • APP_ENGINE_BACKEND 是先前提到的後端服務名稱。
    • APP_ENGINE_NEG 是網路端點群組的名稱。
    • APP_ENGINE_REGION 是 App Engine 中設定的區域
  4. 建立網址對應,將連入的要求轉送至後端服務:

    gcloud compute url-maps create URL_MAP_NAME \
          --default-service APP_ENGINE_BACKEND
    

    更改下列內容:

    • URL_MAP_NAME 是網址對應資源的專屬名稱,用於定義網址與後端服務的對應關係。
    • APP_ENGINE_BACKEND 是先前提到的後端服務名稱。
  5. 建立一個目標 HTTPS Proxy,將要求轉送至您的網址對應:

    gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
          --certificate-map=CERTIFICATE_MAP_NAME \
          --url-map=URL_MAP_NAME
    

    更改下列內容:

    • TARGET_HTTPS_PROXY_NAME 是您選擇用來描述 HTTPS Proxy 的專屬名稱。
    • CERTIFICATE_MAP_NAME 是參照憑證對應項目及其相關憑證的憑證對應關係名稱。
    • URL_MAP_NAME 是先前所述網址對應項目的名稱。
  6. 建立轉送規則,將連入要求轉送至 Proxy:

    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
          --load-balancing-scheme=EXTERNAL_MANAGED \
          --network-tier=PREMIUM \
          --address=EXTERNAL_IP \
          --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
          --global \
          --ports=443
    

    更改下列內容:

    • HTTPS_FORWARDING_RULE_NAME 是專屬名稱,用來說明轉送規則,以便將網路流量導向 HTTPS Proxy。
    • TARGET_HTTPS_PROXY_NAME 是先前建立的 HTTPS Proxy 名稱。
    • EXTERNAL_IP先前建立的 IPv4 位址名稱。

測試負載平衡器

負載平衡器已設定完成,您可以開始將流量傳送至負載平衡器的 IP 位址,以便在遷移網域前進行測試。

  1. 前往 Google Cloud 控制台的「負載平衡」頁面。
    前往「負載平衡」
  2. 按一下剛剛建立的負載平衡器。
  3. 記下負載平衡器的 IP 位址
  4. 如果是 HTTPS 負載平衡器,您可以前往 https://IP_ADDRESS,使用網路瀏覽器測試負載平衡器。請將 IP_ADDRESS 替換為負載平衡器的 IP 位址,例如 30.90.80.100

    • 如果這麼做無法解決問題,且您使用的是 Google 管理的憑證,請確認您的憑證是 ACTIVE,且憑證對應項目是 ACTIVE
    • 如果您使用自行簽署的憑證進行測試,瀏覽器會顯示警告。您必須明確指示瀏覽器接受自行簽署的憑證。只要按一下警告訊息即可查看實際頁面。

    如需其他設定選項,請參閱「使用無伺服器平台設定全域外部 HTTP(S) 負載平衡器」。

將網域連結至負載平衡器

建立負載平衡器後,請記下與負載平衡器相關聯的 IP 位址,例如 30.90.80.100。如要將網域指向負載平衡器,請使用網域註冊服務建立 A 記錄。如果您在 SSL 憑證中新增了多個網域,則必須為每個網域新增 A 記錄,並全部指向負載平衡器的 IP 位址。舉例來說,如要為 www.example.comexample.com 建立 A 記錄,請使用以下方法:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用 Cloud DNS 做為 DNS 供應商,請參閱「新增、修改及刪除記錄」。

刪除 App Engine 自訂網域對應

在 Google Cloud 控制台中:

  1. 前往 App Engine「設定」頁面的「自訂網域」分頁。

    前往「Custom Domains」(自訂網域)

  2. 選取自訂網域名稱,然後按一下「刪除」

或者,您也可以使用 gcloud 指令Admin API 刪除自訂網域。

設定輸入控管,只允許透過 Cloud Load Balancing 存取

測試負載平衡器後,建議您更新 App Engine 應用程式,只接受來自 Cloud Load Balancing 的流量。如要瞭解如何設定 internal-and-cloud-load-balancing 輸入控管,請參閱「輸入設定」。