為 API Gateway 建立多區域部署
本教學課程說明如何設定 HTTP(S) 負載平衡器,為 API Gateway 啟用多區域部署。
建立 HTTP(S) 負載平衡器來支援 API Gateway 的多區域部署作業,可從多個區域提供服務,進而提升服務可用性並縮短延遲時間。您可以使用跨區域路由進一步縮短延遲時間,並盡可能延長正常運作時間,因為系統會從最接近使用者的可用區域處理要求。
在本教學課程中,您將設定單一非區域網址配置,該配置適用於全球各地,但會從最接近的 API Gateway 部署服務使用者要求。透過這項設定,要求會盡可能轉送至可為使用者提供最短延遲時間的區域。如果距離最近的區域無法使用或容量不足,系統會將要求轉送至其他區域,確保服務可用性。
事前準備
設定多區域部署作業前,請按照 API Gateway 快速入門導覽課程的說明,部署 Cloud Run 服務並建立指向該服務的閘道。
在本教學課程中,請將服務部署至兩個不同的區域。舉例來說,您可以部署兩個 API Gateway 執行個體:
my-gateway-eu
至歐洲地區my-gateway-us
至美國境內的區域
設定權限
在本教學課程中,您將在 Cloud 專案中建立無伺服器網路端點群組 (NEG) 和外部 HTTP(S) 負載平衡器。您必須具備專案擁有者或編輯者角色,或是下列 Compute Engine IAM 角色:
工作 | 必要角色 |
---|---|
建立負載平衡器和網路元件 | 網路管理員 |
建立及修改 NEG | Compute 執行個體管理員 |
建立及修改 SSL 憑證 | 安全管理員 |
建立 SSL 憑證資源
如要建立 HTTPS 負載平衡器,必須將 SSL 憑證資源新增至負載平衡器的前端。使用 Google 代管的 SSL 憑證或自行管理的 SSL 憑證,建立 SSL 憑證資源。
Google 代管憑證。建議使用 Google 代管的憑證,因為 Google Cloud 會自動取得、管理及更新這些憑證。如要建立 Google 代管的憑證,您必須擁有網域和該網域的 DNS 記錄,才能佈建憑證。如果您還沒有網域,可以透過 Google Domains 取得。此外,您還需要更新網域的 DNS A 記錄,將其指向稍後步驟中建立的負載平衡器 IP 位址。如需詳細的操作說明,請參閱「使用 Google 管理的憑證」。
自行簽署的憑證。如果不想立即設定網域,可以使用自行簽署的 SSL 憑證進行測試。
本教學課程假設您已建立 SSL 憑證資源。
如要測試這個程序,但不想建立 SSL 憑證資源 (或 Google 代管憑證所需的網域),您仍可按照本頁的操作說明設定 HTTP 負載平衡器。
建立 HTTP(S) 負載平衡器
為每個 API Gateway 執行個體建立無伺服器 NEG。
網路端點群組 (NEG) 會為負載平衡器指定一組後端端點。無伺服器 NEG 是指向 API Gateway 等服務的後端,如下圖所示:
如要為每個閘道執行個體建立無伺服器 NEG,請執行下列指令:
- SERVERLESS_NEG_NAME 是要建立的無伺服器 NEG 名稱。
- GATEWAY_ID 會指定閘道的名稱。
- REGION_ID 是無伺服器 NEG 的部署區域 (應與閘道區域相符)。
gcloud beta compute network-endpoint-groups create SERVERLESS_NEG_NAME \ --region=REGION_ID \ --network-endpoint-type=serverless \ --serverless-deployment-platform=apigateway.googleapis.com \ --serverless-deployment-resource=GATEWAY_ID
例如:
gcloud beta compute network-endpoint-groups create api-gateway-serverless-neg-eu \ --region=europe-west1 \ --network-endpoint-type=serverless \ --serverless-deployment-platform=apigateway.googleapis.com \ --serverless-deployment-resource=my-gateway-eu
重複這個指令,為下一個閘道執行個體建立無伺服器 NEG,並為第二個閘道執行個體使用適當的值,例如
api-gateway-serverless-neg-us
(us-central1
區域中的my-gateway-us
)。建立後端服務,定義 Cloud Load Balancing 分配流量的方式。
後端服務設定包含一組值,例如用於連線至後端的通訊協定、各種分配和工作階段設定、健康狀態檢查和逾時,如下圖所示:
如要建立後端服務,並將無伺服器 NEG 新增至後端服務做為後端,請執行下列指令,其中:
- BACKEND_SERVICE_NAME 是後端服務的名稱。
- SERVERLESS_NEG_NAME 是在上一個步驟中建立的無伺服器 NEG 名稱。
- REGION_ID 是無伺服器 NEG 的部署區域 (應與閘道區域相符)。
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --global \
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --global \ --network-endpoint-group=SERVERLESS_NEG_NAME \ --network-endpoint-group-region=REGION_ID
例如:
gcloud compute backend-services add-backend api-gateway-backend-service \ --global \ --network-endpoint-group=api-gateway-serverless-neg-eu \ --network-endpoint-group-region=europe-west1
重複執行這項指令,將第二個無伺服器 NEG 新增至後端服務,並使用第二個無伺服器 NEG 的適當值,例如
us-central1
區域中的api-gateway-serverless-neg-us
(適用於my-gateway-us
)。建立網址對應,將連入要求轉送至後端服務,如下圖所示:
如要建立網址對應,請執行下列指令,其中:
- URL_MAP_NAME 是要建立的網址對應名稱。
- BACKEND_SERVICE_NAME 是後端服務的名稱。
gcloud compute url-maps create URL_MAP_NAME \ --default-service BACKEND_SERVICE_NAME
例如:
gcloud compute url-maps create api-gateway-url-map \ --default-service api-gateway-backend-service
這個網址對應只會指定代表單一閘道的後端服務,因此不需要主機規則或路徑比對器。如果您有多個後端服務,可以使用主機規則,根據主機名稱將要求導向至不同服務。使用路徑比對器,根據要求路徑將要求導向不同的服務。
例如:
gcloud compute url-maps add-path-matcher api-gateway-url-map \ --path-matcher-name=my-pm2 \ --default-service=my-host-default-backend \ --path-rules="/video=video-service,/video/*=video-service" \ --new-hosts my-hosts.com
gcloud compute url-maps add-host-rule api-gateway-url-map \ --hosts=my-app-domain \ --path-matcher-name=my-app-path-matcher
如要進一步瞭解主機規則和路徑比對器,請參閱網址對應說明文件。
為目標 Proxy 建立 SSL 憑證,如下圖所示:
如要建立 HTTPS 負載平衡器,HTTPS 目標 Proxy 必須具備 SSL 憑證資源。您可以透過 Google 代管的 SSL 憑證或自行管理的 SSL 憑證,建立 SSL 憑證資源。建議使用 Google 代管的憑證。
如要建立 Google 代管的憑證, 您必須擁有網域。如果沒有網域,可以使用自行簽署的 SSL 憑證進行測試。
建立 Google 代管的 SSL 憑證資源:
gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME --domains DOMAIN
建立自行管理的 SSL 憑證資源:
gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \ --certificate CRT_FILE_PATH \ --private-key KEY_FILE_PATH
建立目標 HTTP(S) Proxy,將要求轉送至網址對應,如下圖所示:
如要建立目標 Proxy,請使用下列指令,其中:
- TARGET_HTTP_PROXY_NAME 是要建立的目標 Proxy 名稱。
- URL_MAP_NAME 是您在前一個步驟建立的網址對應名稱。
- 選用:SSL_CERT_NAME 是建立的 SSL 憑證名稱。
gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \ --ssl-certificates=SSL_CERT_NAME --url-map=URL_MAP_NAME
例如:
gcloud compute target-http-proxies create api-gateway-https-proxy \ --ssl-certificates=hello-cert --url-map=api-gateway-url-map
建立轉送規則,將連入要求轉送至 Proxy,如下圖所示:
使用下列指令建立轉送規則,其中:
- HTTPS_FORWARDING_RULE_NAME 是要建立的規則名稱。
- TARGET_HTTP_PROXY_NAME 是要建立的目標 Proxy 名稱。
gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \ --target-https-proxy=TARGET_HTTPS_PROXY_NAME \ --global \ --ports=443
例如:
gcloud compute forwarding-rules create my-fw \ --target-https-proxy=api-gateway-https-proxy \ --global \ --ports=443
使用負載平衡器 IP 位址更新 DNS 記錄
如果您使用自訂網域,則必須完成這個步驟,才能設定網域的 DNS 設定,將網域指向服務的新 IP 位址。如果您使用 Google 管理的憑證(需要網域) 建立 HTTP (S) 負載平衡器,也必須執行這項操作。建議搭配 DNS 使用時,分配及使用靜態 IP 位址。這個步驟的具體操作說明會因 DNS 供應商而異。
如要將流量傳送至負載平衡器,網域的 DNS 記錄 (在本教學課程中為 my-app-domain) 必須指向負載平衡器的 IP 位址。
如要找出通用轉送規則的 IP 位址,請使用下列指令:
gcloud compute forwarding-rules list
更新網域的 DNS A 或 AAAA 記錄,指向負載平衡器的 IP 位址,這樣一來,傳送至現有自訂網域網址的流量就會改為透過負載平衡器轉送。DNS 可能需要幾秒鐘或幾小時,才能將這項變更傳播至 DNS 伺服器。
請使用
curl
或在瀏覽器中造訪下列網址,藉此測試閘道是否可接收到流量。例如:https://my-app-domain
測試時,您應該會看到 Cloud Run 服務產生的回應。舉例來說,這可能是「Hello World」HTML 網頁,或是後端服務直接產生的其他預期回應。這表示您的要求會通過負載平衡器,後端服務會指示負載平衡器將要求傳送至閘道。
注意事項
在實作 API Gateway 的多區域部署作業前,請先考量下列事項:
API Gateway 目前不支援健康狀態檢查。如上所述,如果閘道或後端服務在某個地區傳回錯誤,但該地區的整體 API Gateway 基礎架構可用且有容量,HTTP(S) 負載平衡器不會將流量轉送至其他地區。
如要在單一轉送規則中合併不同區域,必須採用進階級定價。如要進一步瞭解如何計算價格和用量,請參閱「網路服務等級定價」。
最佳做法
使用多區域服務時,建議使用全球複製的代管資料儲存解決方案 (例如 Cloud Spanner),確保所有資料都能在全球範圍內管理。