簡體   English   中英

使用 GCP Compute Engine 作為 Authenticated Cloud Run Service 的代理

[英]Use GCP Compute Engine as proxy for Authenticated Cloud Run Service

我目前有一個托管在 Google Cloud Compute Instance 上的 dockerized Web 應用程序,該應用程序只能從我們公司的專用網絡訪問。 這種設置在過去一年中運行良好,但隨着額外的開發要求和使用量的增加,我發現自己不斷修改實例大小,並且不得不用新的更新重新啟動服務器。 此外,團隊中的其他開發人員在部署此代碼方面的經驗較少,這使我對這個應用程序負責。

我想將此應用程序移至 Cloud Run 以實現可擴展性、易於維護和部署,但仍然只能在我們公司的網絡上訪問它。 我的想法是將應用程序移動到經過身份驗證的雲運行服務,並將原始服務器用作 nginx 代理,該代理將添加身份驗證標頭並將請求轉發到雲運行服務。

我的問題是我將如何使用 nginx 獲取令牌(服務器將具有必要的權限),並在將其傳遞給應用程序之前將其添加到請求中。 這是我目前的想法,但不知道從哪里開始。

location / {
    proxy_set_header Authentication "Bearer $ID_TOKEN";
    proxy_pass https://the-library-clwysxi3sq-ue.a.run.app;
}

你在正確的軌道上。

此時,我建議您考慮使用 Envoy Proxy 而不是 NGINX。 Envoy 有一個有據可查的協議來從外部來源獲取動態數據,例如 $ID_TOKEN。

無論您選擇哪種解決方案,請確保您最終將“主機”標頭重寫為[...].run.app主機名,因為如果您按原樣保留主機名 ( somedomain.com ),Cloud Run 的負載均衡器將不會不知道要路由哪個應用程序。

剩下的任務是弄清楚如何動態獲取 $ID_TOKEN。

Google Compute VM 實例需要通過查詢實例元數據服務來檢索身份令牌 (JWT):

curl -H "Metadata-Flavor: Google" \
  http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://hello-2wvlk7vg3a-uc.a.run.app

確保將?audience=的值替換為目標服務的 URL。

此調用的響應正文返回一個在一小時內過期的 JWT 令牌。 您應該緩存此響應(基於受眾,並且 TTL <60 分鍾),或者每次都獲得一個新響應。

請注意,在 Cloud Run 上,您目前每秒只能生成50 個身份令牌 但是,您在 GCE 上運行( 我在這里重復一遍)我認為 GCE 上的元數據服務沒有記錄的速率限制。 可能會更高

然后,您需要將其作為 HTTP 標頭添加到傳出請求(到 Cloud Run)中:

Authorization: Bearer <TOKEN>

此過程在服務到服務身份驗證文檔中進行了說明。

您可以在 Stack Overflow 或 Google 上搜索如何在 NGINX 中為每個請求執行 Lua 或 Bash 腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM