[英]GCP API Gateway to secure internal/external communication for API deployed on App Engine
[英]Spring cloud gateway deployed in GCP App engine flexible causes infinite redirect loop
我在 GCP 應用引擎中運行了兩個服務; 假設服務A和B,然后我部署了一個spring cloud gateway服務,根據路徑謂詞將外部流量路由到這兩個服務。 服務 A 和 B 部署在靈活的應用引擎中。 最初,我將網關靈活地部署在應用引擎中,並且運行良好。 因為我們有一些批處理服務的響應時間超過 10 分鍾(應用引擎標准的最大響應超時為 10 分鍾),我們不得不決定將網關遷移到靈活的應用引擎。
網關服務是 dockerized 並在 8080 端口運行。我的 app.yaml 如下所示:
runtime: custom
env: flex
service: beta-gateway
env_variables:
SPRING_PROFILES_ACTIVE: "beta"
resources:
cpu: 1
memory_gb: 2
liveness_check:
path: "/actuator/health"
check_interval_sec: 30
timeout_sec: 4
failure_threshold: 2
success_threshold: 2
initial_delay_sec: 300
readiness_check:
path: "/actuator/health"
check_interval_sec: 5
timeout_sec: 4
failure_threshold: 2
success_threshold: 2
app_start_timeout_sec: 300
服務部署正確,執行器端點完美運行,我調用/actuator/gateway/routes
端點並且路由配置看起來不錯(並且我使用 appshot dns uri 將其路由到服務 A 和 B;不是最好的方法應該將來使用服務注冊表)。
問題:問題是對於執行器端點以外的任何端點,請求都會進入重定向(302)循環並最終失敗。
我嘗試了什么:
如上所述,我調用了 /actuator/gateway/routes 端點,並且路由配置看起來不錯。 我為網關啟用了 TRACE 日志記錄,我看到路由與服務 A 或 B 的應用程序 dns url 正確匹配。
我不太確定它是否相關,但我最初使用指定端口綁定的網絡設置進行了部署
network:
name: default
forwarded_ports:
- 80:8080
然后我了解到與 8080 的綁定是默認完成的,並將其刪除。
任何建議將不勝感激。 謝謝!
出現此問題的原因是,即使從瀏覽器到 GCP 應用引擎的負載均衡器的流量是安全的 (HTTP),從負載均衡器到實例的流量也是 http,因為它們是內部流量。
從這一點開始,網關使用 X-Forwarded-Proto 作為 HTTP(而不是 HTTPS)將請求轉發到下游 api,然后是 dowsteam API,因為它應該發送重定向請求(302),要求客戶端訪問端點使用安全連接 (HTTPS)。 收到 302 狀態后,客戶端/瀏覽器再次發送請求,並且 SSL 終止發生在負載均衡器上,循環繼續。
解決方法是:
將server.forward-headers-strategy
屬性設置為NATIVE
,以使 tomcat 服務器能夠處理轉發標頭。
將server.tomcat.redirect-context-root
設置為false
,以使 tomcat 服務器在重定向之前遵守 X-Forwarded-* 標頭。
遇到下面提到的解釋這一點的讀物。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.