Networking

僅允許連接到源自 Cloud Run 服務的 GCP Compute Engine 虛擬機

  • September 15, 2020

我有一個作為 Compute Engine 虛擬機執行的數據庫伺服器,以及一個在 Cloud Run 上執行的 API。兩者都是同一個項目的一部分。我希望只能從 Cloud Run 程式碼訪問 DB VM。

起初我認為這應該只是工作,因為防火牆有一個“預設允許內部”規則,應該適用於項目中的每台機器。但是我仍然遇到連接失敗。

然後我嘗試添加一個針對服務帳戶並允許來自服務帳戶的連接的新入口規則。這也沒有奏效。

我修改了規則以允許來自我的個人 IP 的連接,只是為了確認 DB VM 正常工作,我的防火牆規則正常工作,並且一切都按預期工作。

最後,我查看了按“源標籤”進行過濾,但該選項不可選擇,而且我似乎無法將源標籤添加到 Cloud Run 實例。

我是否可以實現限制對 DB VM 的訪問以僅允許來自 Cloud Run 機器的傳入連接的目標?

您可以配置無伺服器 VPC 訪問以將 Cloud Run 與 Compute Engine VM 連接起來,更新於 2020 年 9 月 。https://cloud.google.com/vpc/docs/configure-serverless-vpc-access

Cloud Run(全託管)服務不會獲得可列入白名單的靜態 IP。此外,請查看尚未支持的服務文件:

下表列出了 Cloud Run(全託管)尚不支持的服務。請注意,Google Cloud 上的 Cloud Run for Anthos 可以使用 Google Kubernetes Engine 可以使用的任何服務。

cloud_run_managed

因此,正如您所見,將 Cloud Run(完全託管)上執行的服務與您的 VPC 網路連接起來並不容易。

在 Cloud Run(完全託管)中為您的服務獲取外部 IP 的一些解決方法

  1. 通過執行 ssh 客戶端創建 SOCKS 代理,該客戶端通過 GCE VM 實例路由流量,該 GCE VM 實例具有靜態外部 IP 地址,如本例所示
  2. 通過具有靜態 IP 的代理從 Cloud Run(完全託管)發送出站請求,以下 Python 範例:
import requests
import sys
from flask import Flask
import os

app = Flask(__name__)

@app.route("/")
def hello():

   proxy = os.environ.get('PROXY')
   proxyDict = { 
               "http": proxy,
               "https": proxy
               }
   r = requests.get('http://ifconfig.me/ip', proxies=proxyDict)
   return 'You connected from IP address: ' + r.text

使用PROXY包含代理的 IP 或 URL 的環境變數(請參閱此處設置環境變數

對於此代理,您可以:

  • 使用執行Squid的靜態公共 IP 地址創建 Compute Engine 虛擬機,這可能適合 Compute Engine免費層
  • 使用提供靜態 IP 代理的第三方服務

編輯查看 Google Public Issue Tracker Feature Request並隨時加入、評論和跟踪進度。

引用自:https://serverfault.com/questions/1005510