1. 總覽
在本實驗室中,您將部署員工入口網站,讓員工查看、更新及刪除 Cymbal Eats 應用程式中的訂單。您將使用 Identity-Aware Proxy (IAP) 保護入口網站存取權,不必使用虛擬私人網路 (VPN)。IAP 可簡化零信任存取模型的導入作業,與 VPN 相比,可讓遠端工作者在內部部署和雲端環境中,以更短的時間存取應用程式,並透過單一控制點管理應用程式存取權。

什麼是 Identity-Aware Proxy?
Identity-Aware Proxy (IAP) 是一項 Google Cloud 服務,可攔截傳送至應用程式的要求,使用 Google Identity 服務對發出請求的使用者進行身分驗證,並只允許已獲授權存取應用程式的使用者所傳送的要求。此外,這項功能還能修改要求標頭,加入已驗證使用者相關資訊。
學習目標
- 如何設定無伺服器網路端點群組 (NEG)
- 如何設定負載平衡器
- 如何啟用 IAP 來限制存取權
- 如何使用 IAP 限制存取權
2. 設定和需求
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
- 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試自訂名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。 - 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
環境設定
- 建立專案和資源相關的環境變數
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
- 啟用 IAP 和 Cloud Resource Manager 服務 API
gcloud services enable \
iap.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudidentity.googleapis.com \
compute.googleapis.com
- 複製範例應用程式存放區並前往目錄
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
- 使用設定指令碼部署員工入口網站。等待指令碼完成,再進行下一個步驟
./setup.sh
輸出範例
... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- 按一下「服務網址」連結

3. 設定無伺服器網路端點群組 (NEG)
您將為員工 UI Cloud Run 服務建立無伺服器網路端點群組( 無伺服器 NEG)。透過無伺服器 NEG,可搭配外部 HTTP(S) 負載平衡使用 Google Cloud 無伺服器應用程式。

- 為員工 UI 服務建立網路端點群組。
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
--project $PROJECT_ID \
--region=$REGION \
--network-endpoint-type=serverless \
--cloud-run-service=employee-ui-service
輸出範例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg]. Created network endpoint group [employee-ui-iap-neg].
建立後端服務並新增無伺服器 NEG
後端服務可定義 Cloud Load Balancing 分配流量的方式。後端服務設定包含一組值,例如用於連線至後端的通訊協定、各種分配和工作階段設定、健康狀態檢查和逾時。這些設定可精細控管負載平衡器的行為。
- 建立後端服務
gcloud compute backend-services create employee-ui-iap-backend \
--global
輸出範例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend]. NAME: employee-ui-iap-backend BACKENDS: PROTOCOL: HTTP
- 將無伺服器 NEG 新增至後端服務並設為後端
gcloud compute backend-services add-backend employee-ui-iap-backend \
--global \
--network-endpoint-group=employee-ui-iap-neg \
--network-endpoint-group-region=$REGION
輸出範例
Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
- 建立網址對應,將傳入要求轉送至後端服務
gcloud compute url-maps create employee-ui-iap-url-map \
--default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map]. NAME: employee-ui-iap-url-map DEFAULT_SERVICE: backendServices/employee-ui-iap-backend
4. 設定負載平衡器元件
下圖顯示負載平衡器使用無伺服器 NEG 後端,將要求導向無伺服器 Cloud Run 服務。

保留靜態 IP 位址
- 預留靜態 IPv4 位址並儲存網域
gcloud compute addresses create employee-ui-iap-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
輸出範例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
- 儲存 nip.io 網域
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io
建立 Google 代管的 SSL 憑證資源
- 建立 Google 代管的 SSL 憑證資源
gcloud compute ssl-certificates create employee-ui-iap-cert \
--description=employee-ui-iap-cert \
--domains=$DOMAIN \
--global
輸出範例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert]. NAME: employee-ui-iap-cert TYPE: MANAGED CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00 EXPIRE_TIME: MANAGED_STATUS: PROVISIONING 34.102.234.98.nip.io: PROVISIONING
建立目標 HTTPS Proxy
- 建立目標 HTTPS Proxy,將要求轉送至網址對應
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
--ssl-certificates employee-ui-iap-cert \
--url-map employee-ui-iap-url-map
輸出範例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy]. NAME: employee-ui-iap-http-proxy SSL_CERTIFICATES: employee-ui-iap-cert URL_MAP: employee-ui-iap-url-map CERTIFICATE_MAP:
設定轉送規則
- 建立轉送規則,將傳入要求轉送至 Proxy
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=employee-ui-iap-ip \
--global \
--ports=443 \
--target-https-proxy employee-ui-iap-http-proxy
輸出範例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].
限制 Cloud Run 服務的輸入流量
限制 Ingress 流量,只接受內部要求和透過 HTTP(S) 負載平衡傳送的要求。

- 更新服務,只允許來自內部要求和透過 HTTP(S) 負載平衡器的 Ingress 流量
gcloud run services update employee-ui-service \
--ingress internal-and-cloud-load-balancing \
--region $REGION
輸出範例
OK Deploying... Done. OK Creating Revision... OK Routing traffic... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- 按一下「服務網址」連結

現在存取 Cloud Run 服務網址時,系統會顯示存取遭拒。
5. 在負載平衡器上啟用 Cloud Identity-Aware Proxy (IAP)
透過 HTTPS 存取的應用程式可經由 IAP 建立中央授權層。因此,您可以使用應用程式層級的存取權控管模型,而非網路層級的防火牆。

設定 OAuth 同意畫面
品牌是 OAuth 同意畫面,內含使用者的品牌宣傳資訊。品牌可能僅限內部或公開使用者。內部品牌可讓與專案屬於相同 Google Workspace 機構的成員存取 OAuth 流程。公開品牌可讓任何能存取網際網路的使用者進行 OAuth 流程。
- 建立品牌
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
gcloud alpha iap oauth-brands create \
--application_title="Cymbal Eats" \
--support_email=$USER_EMAIL
輸出範例
Created [462858740426]. applicationTitle: Cymbal Eats name: projects/462858740426/brands/462858740426 orgInternalOnly: true
建立 IAP OAuth 用戶端
- 使用上一步的品牌名稱建立用戶端
gcloud alpha iap oauth-clients create \
projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
--display_name=cymbal-eats-employee-ui
輸出範例
Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com]. displayName: cymbal-eats-employee-ui name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com secret: [secret-removed]
- 儲存用戶端名稱、ID 和密鑰
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
--filter="displayName:cymbal-eats-employee-ui")
export CLIENT_ID=${CLIENT_NAME##*/}
export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')

- 按一下「使用者類型」下方的「設為外部」
- 將「發布狀態」選為「測試」

- 按一下「確認」
6. 使用 IAP 限制存取權
使用 IAP 限制後端服務的存取權,然後確認應用程式無法存取。
- 在後端服務上啟用 IAP
gcloud iap web enable --resource-type=backend-services \
--oauth2-client-id=$CLIENT_ID \
--oauth2-client-secret=$CLIENT_SECRET \
--service=employee-ui-iap-backend
驗證 IAP 設定
- 確認 SSL 憑證為「ACTIVE」狀態
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
- 取得服務網址
echo https://$DOMAIN
輸出範例
https://34.102.234.98.nip.io
- 按一下服務網址,開啟員工入口網站。

- 使用實驗室憑證登入。

- 關閉瀏覽器
授予使用者員工入口網站存取權
- 為上一個步驟中建立的使用者新增
'roles/iap.httpsResourceAccessor'角色的 IAM 政策繫結
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=employee-ui-iap-backend \
--member=user:$USER_EMAIL \
--role='roles/iap.httpsResourceAccessor'
輸出範例
Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].
測試服務存取權
確認已授予員工入口網站存取權
- 取得服務網址
echo https://$DOMAIN
輸出範例
https://34.102.234.98.nip.io
- 按一下服務網址,開啟員工入口網站。

你現在應該可以存取員工入口網站。
(選用) 部署所有依附元件,部署這些微服務可能需要約 20 分鐘。
unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL
cd ~/cymbal-eats
./setup.sh
./get-site-urls.sh
7. 恭喜!
恭喜,您已完成本程式碼研究室!
後續步驟:
探索其他 Cymbal Eats 程式碼研究室:
- 使用 Eventarc 觸發 Cloud Workflows
- 從 Cloud Storage 觸發事件處理程序
- 從 Cloud Run 連線至 Private CloudSQL
- 從 Cloud Run 連線至全代管資料庫
- 使用 Cloud Scheduler 觸發 Cloud Run 工作
- 安全地部署至 Cloud Run
- 保護 Cloud Run 傳入流量
- 從 GKE Autopilot 連線至私有 AlloyDB
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。