區域 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
檔案中定義的所有轉送規則。
下圖說明應用程式的變更:
只要遷移至 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 前端服務:
- 確認您具備必要權限
- 建立 Google 代管的憑證
- 設定 Cloud Load Balancing
- 測試負載平衡器
- 將網域連結至負載平衡器
- 刪除 App Engine 自訂網域對應
- 設定輸入控管,只允許透過 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 授權
請執行下列指令,在憑證管理工具中建立 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 自訂網域名稱。
請注意
gcloud
指令傳回的 CNAME。您必須在下列步驟中使用該記錄更新 DNS 記錄。
在 DNS 設定中新增 CNAME 記錄
視您是否使用 Cloud DNS 或其他第三方 DNS 解決方案而定,請按照適合您用途的指示操作:
Cloud DNS
建立 DNS 授權時,gcloud
指令會傳回對應的 CNAME 記錄。您必須將這個 CNAME 記錄新增至目標網域的 DNS 區域中的 DNS 設定,如下所示:
啟動 DNS 記錄交易:
gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
將
DNS_ZONE_NAME
替換為公開 DNS 區域的名稱。如果您使用 Google Cloud 管理網域並接收該網域的流量,就會建立公開 DNS 區域。如要查看公開 DNS 區域,請參閱「列出並說明受管理的區域」。將 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 區域名稱。
執行 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 代管憑證,請執行下列指令:
建立 Google 代管的憑證:
gcloud certificate-manager certificates create CERTIFICATE_NAME \ --domains=DOMAIN_NAME --dns-authorizations=AUTHORIZATION_NAME
更改下列內容:
CERTIFICATE_NAME
是描述憑證的專屬名稱。DOMAIN_NAME
是 App Engine 自訂網域名稱。AUTHORIZATION_NAME
是先前建立的 DNS 授權名稱。
確認憑證是否有效。
請先使用下列指令驗證憑證本身是否處於啟用狀態,再將憑證部署至負載平衡器。請注意,憑證狀態最多可能需要經過幾小時才會變更為
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。
建立憑證對應關係
建立憑證對應關係:
gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
將
CERTIFICATE_MAP_NAME
替換為描述憑證對應的專屬名稱。建立憑證對應關係項目,並將其與先前建立的憑證和憑證對應關係建立關聯:
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
標記,確保在未指定網域名稱時,系統會使用憑證做為預設憑證。確認憑證對應關係是否有效。
請使用下列指令,確認憑證對應項目是否處於有效狀態,然後再將對應的憑證對應項目附加至目標 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 負載平衡器,其中包含單一後端服務和無伺服器網路端點群組。
轉送規則會將來自外部 IP 位址的傳入要求,以及直接要求轉送至目標 HTTPS Proxy。HTTPS 負載平衡器會使用網址對應,將要求導向後端服務,後者包含 App Engine 服務的無伺服器 NEG。
保留外部 IP 位址
設定 Cloud Load Balancing 前,您必須設定全域靜態外部 IP 位址,讓使用者連上負載平衡器。
控制台
前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
按一下 [Reserve static address] (預約靜態位址) 以預留 IPv4 位址。
為靜態位址指派「名稱」,例如
appengine-external-ip
。將「Network tier」(網路級別) 設為「Premium」(進階)。
將「IP version」(IP 版本) 設為「IPv4」。
將「Type」(類型) 設為「Global」(通用)。
按一下「保留」。
gcloud
建立外部 IP 位址保留作業:
gcloud compute addresses create EXTERNAL_IP \ --network-tier=PREMIUM \ --ip-version=IPV4 \ --global
EXTERNAL_IP
是要建立的位址名稱。請注意預留的 IPv4 位址:
gcloud compute addresses describe EXTERNAL_IP \ --format="get(address)" \ --global
設定 App Engine 的後端服務
網路端點群組 (NEG) 可用來指定負載平衡器的一組後端端點。如要指定指向 App Engine 服務的後端,請先設定無伺服器 NEG,然後在 Cloud Load Balancing 中設定後端服務、轉送規則和前端服務。
為 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 設定的自訂網域相同。建立後端服務:
gcloud compute backend-services create APP_ENGINE_BACKEND \ --global \ --load-balancing-scheme=EXTERNAL_MANAGED
將
APP_ENGINE_BACKEND
替換為要建立的後端服務名稱。將無伺服器 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 中設定的區域。
建立網址對應,將連入的要求轉送至後端服務:
gcloud compute url-maps create URL_MAP_NAME \ --default-service APP_ENGINE_BACKEND
更改下列內容:
URL_MAP_NAME
是網址對應資源的專屬名稱,用於定義網址與後端服務的對應關係。APP_ENGINE_BACKEND
是先前提到的後端服務名稱。
建立一個目標 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
是先前所述網址對應項目的名稱。
建立轉送規則,將連入要求轉送至 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 位址,以便在遷移網域前進行測試。
- 前往 Google Cloud 控制台的「負載平衡」頁面。
前往「負載平衡」 - 按一下剛剛建立的負載平衡器。
- 記下負載平衡器的 IP 位址。
如果是 HTTPS 負載平衡器,您可以前往
https://IP_ADDRESS
,使用網路瀏覽器測試負載平衡器。請將IP_ADDRESS
替換為負載平衡器的 IP 位址,例如30.90.80.100
。- 如果這麼做無法解決問題,且您使用的是 Google 管理的憑證,請確認您的憑證是
ACTIVE
,且憑證對應項目是ACTIVE
。 - 如果您使用自行簽署的憑證進行測試,瀏覽器會顯示警告。您必須明確指示瀏覽器接受自行簽署的憑證。只要按一下警告訊息即可查看實際頁面。
如需其他設定選項,請參閱「使用無伺服器平台設定全域外部 HTTP(S) 負載平衡器」。
- 如果這麼做無法解決問題,且您使用的是 Google 管理的憑證,請確認您的憑證是
將網域連結至負載平衡器
建立負載平衡器後,請記下與負載平衡器相關聯的 IP 位址,例如 30.90.80.100
。如要將網域指向負載平衡器,請使用網域註冊服務建立 A
記錄。如果您在 SSL 憑證中新增了多個網域,則必須為每個網域新增 A
記錄,並全部指向負載平衡器的 IP 位址。舉例來說,如要為 www.example.com
和 example.com
建立 A
記錄,請使用以下方法:
NAME TYPE DATA www A 30.90.80.100 @ A 30.90.80.100
如果您使用 Cloud DNS 做為 DNS 供應商,請參閱「新增、修改及刪除記錄」。
刪除 App Engine 自訂網域對應
在 Google Cloud 控制台中:
前往 App Engine「設定」頁面的「自訂網域」分頁。
選取自訂網域名稱,然後按一下「刪除」。
或者,您也可以使用 gcloud 指令或 Admin API 刪除自訂網域。
設定輸入控管,只允許透過 Cloud Load Balancing 存取
測試負載平衡器後,建議您更新 App Engine 應用程式,只接受來自 Cloud Load Balancing 的流量。如要瞭解如何設定 internal-and-cloud-load-balancing
輸入控管,請參閱「輸入設定」。