將 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 服務停機,您必須使用 Certificate Manager 建立 DNS 授權和 Google 管理的憑證。

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

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

建立 DNS 授權

  1. 在 Certificate Manager 中執行下列指令,建立 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_RECORDgcloud 指令傳回的 CNAME 記錄完整值,該指令會建立對應的 DNS 授權
    • 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 工具傳回的輸出內容不同,請參閱「排解憑證管理工具問題」。

建立憑證對應關係

  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 Load Balancing 前端服務,取代 App Engine 自訂網域。

下圖顯示具有單一後端服務和無伺服器 NEG 的 HTTPS 負載平衡器。

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

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

保留外部 IP 位址

設定 Cloud Load Balancing 前,您需要設定全域靜態外部 IP 位址,供使用者連線至負載平衡器。

控制台

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

    前往「External IP addresses」(外部 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 代理伺服器的名稱。
    • EXTERNAL_IP先前建立的 IPv4 位址名稱。

測試負載平衡器

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

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
    前往「Load balancing」(負載平衡) 頁面
  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 輸入控制項,請參閱「輸入設定」。