У меня есть сервер БД, работающий как виртуальная машина Compute Engine, и API, работающий в Cloud Run. Оба являются частью одного проекта. Я хочу, чтобы виртуальная машина БД была доступна только из кода Cloud Run.
Сначала я подумал, что это должно работать, потому что в брандмауэре есть правило «default-allow-internal», которое должно применяться к каждой машине в проекте. Однако у меня все еще возникали сбои подключения.
Затем я попытался добавить новое правило входа, которое нацелено на учетную запись службы и разрешает соединения из учетной записи службы. Это тоже не сработало.
Я изменил правило, чтобы разрешить соединения с моего личного IP-адреса, просто чтобы убедиться, что виртуальная машина БД работает, и мои правила брандмауэра работают, и все работает, как ожидалось.
Наконец, я изучил фильтрацию по «исходному тегу», но эту опцию нельзя было выбрать, и я не мог добавить исходные теги к экземпляру Cloud Run.
Могу ли я достичь своей цели - ограничить доступ к виртуальной машине БД, чтобы разрешить только входящие соединения с машины Cloud Run?
Сервисы Cloud Run (полностью управляемые) не получают статических IP-адресов которые могут быть внесены в белый список. Кроме того, посмотрите документацию Сервисы еще не поддерживаются:
В следующей таблице перечислены службы, которые еще не поддерживаются Cloud Run (полностью управляемый).. Обратите внимание, что Cloud Run для Anthos в Google Cloud может использовать любую службу, которую может использовать Google Kubernetes Engine.
Итак, как видите, нет простого способа подключить службу, работающую в Cloud Run (полностью управляемую), и вашу сеть VPC.
Некоторые обходные пути для получения внешнего IP-адреса для вашей службы в Cloud Run (полностью управляемый):
создайте прокси-сервер SOCKS, запустив ssh-клиент, который направляет трафик через экземпляр виртуальной машины GCE, имеющий статический внешний IP-адрес, как в этом пример
отправлять исходящие запросы из Cloud Run (полностью управляемый) через прокси-сервер со статическим IP-адресом, пример на 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
переменная environemnt, содержащая IP или URL вашего прокси (см. здесь, чтобы установить переменную среды )
Для этого прокси вы можете:
РЕДАКТИРОВАТЬ Взгляните на Google Public Issue Tracker Запрос функции и не стесняйтесь присоединяться, комментировать и отслеживать прогресс.