Вопрос или проблема
Я развернул экземпляр SQL на общем подсети VPC для размещения базы данных PostgreSQL в GCP. Теперь я хочу подключиться к этому экземпляру с машины, чья сеть является частной и внешней к облаку Google. Я использую Cloud SQL Python connector для этого, но когда я запускаю Python-скрипт на машине, он зависает на “Запрос временного сертификата”. Это правильный подход для установления такого соединения?
Дополнительные детали о настройке:
-
Развертывание экземпляра SQL было выполнено с использованием Terraform
-
Я зарезервировал внутренний IP-адрес (общая подсеть VPC) для конечной точки частного подключения службы и создал правило пересылки, чтобы указать конечную точку PSC на область обслуживания Cloud SQL, следуя публичной документации (https://cloud.google.com/sql/docs/mysql/configure-private-service-connect#create-cloud-sql-instance-psc-enabled)
-
Я пытаюсь установить подключение с аутентификацией IAM после экспорта учетных данных экземпляра SQL (учетная запись сервиса)
-
В файле /etc/hosts машины я добавил строку с IP-адресом экземпляра SQL, за которой следует его DNS-имя
Я протестировал эту настройку и Python-скрипт на виртуальной машине в облаке Google, размещенной в той же подсети, что и экземпляр SQL, и успешно подключился к базе данных PostgreSQL. Тот же самый скрипт на внешней машине не может установить соединение. Между машиной и частным IP-адресом SQL экземпляра брандмауэры были открыты. Подключение к локальному серверу происходит через Interconnect/VLAN с BGP, и доступность в порядке, судя по логам брандмауэра, которые показывают, что подключения разрешены. Поэтому я не вижу, в чем проблема, если это правильный подход…
Я следовал этому списку проверки проблем с подключением, и все выглядит нормально в моей настройке… (https://cloud.google.com/sql/docs/debugging-connectivity#connection_issues_checklist)
Проблема здесь в том, что частный IP-адрес экземпляра Cloud SQL не находится в вашей VPC, а на стороне управляемых служб Google. Поскольку транзитивное пиринг не поддерживается Google (любые две сети, которые не напрямую соединены, не могут общаться друг с другом), вы не сможете получить доступ к Cloud SQL напрямую с вашего внешнего хоста.
Решения для этого:
-
Разрешите публичный IP для экземпляра Cloud SQL (но НЕ добавляйте в белый список никаких IP-адресов) и используйте клиент Cloud SQL Auth proxy (https://cloud.google.com/sql/docs/mysql/sql-proxy), чтобы безопасно подключиться к экземпляру Cloud SQL.
-
Настройте виртуальную машину в VPC и запустите Cloud SQL Auth proxy там (используйте
--private-ip
). Теперь ваши внешние клиенты могут подключаться к этой прокси-VM. В этом случае публичный IP не нужен.
Ответ или решение
Для подключения к экземпляру SQL на частном IP-адресе в облачном окружении Google Cloud Platform (GCP) с внешней машины, необходимо учитывать несколько ключевых моментов. Ваша текущая конфигурация, которая работает на виртуальной машине (VM) в том же подсети, не будет работать для подключения из внешней сети, так как при использовании частных IP-адресов существует ряд ограничений на уровне сетевой архитектуры GCP.
Проблема
Данная проблема связана с тем, что частный IP-адрес вашего экземпляра Cloud SQL находится на стороне управляемых сервисов Google. Поскольку GCP не поддерживает транзитивное пилингование, сети, которые не находятся в прямом пиринге друг с другом, не могут обмениваться данными. Таким образом, ваша внешняя машина не может напрямую обращаться к экземплру SQL через его частный IP-адрес.
Решения
С учетом вышеизложенного, предлагаю следующие варианты для успешного подключения:
-
Использование публичного IP-адреса и Cloud SQL Auth Proxy:
- Настройте ваш экземпляр SQL для использования публичного IP-адреса. Важно: не забудьте не добавлять IP-адреса в белый список, чтобы повысить безопасность.
- Установите и настройте Cloud SQL Auth Proxy на вашей внешней машине. Это инструмент, который позволяет безопасно подключаться к экземпляру Cloud SQL, так как он управляет процессом аутентификации, создавая защищенный туннель к вашему экземпляру Cloud SQL.
-
Создание виртуальной машины в VPC с прокси:
- Создайте виртуальную машину (VM) в вашем проекте GCP внутри той же VPC, где располагается ваш экземпляр SQL.
- Установите на этой VM Cloud SQL Auth Proxy, используя параметр
--private-ip
. Это создаст туннель к вашему экземпляру Cloud SQL. - Ваша внешняя машина сможет обращаться к этому прокси-серверу, что позволит установить соединение без необходимости иметь публичный IP-адрес у экземпляра SQL.
Исполнение
-
Настрока публичного IP и Cloud SQL Auth Proxy:
- В консоли GCP откройте настройки экземпляра SQL и включите публичный IP.
- Установите Cloud SQL Auth Proxy. Обычно это можно сделать с помощью команды (на Linux):
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy chmod +x cloud_sql_proxy
- Запустите прокси с использованием ваших учетных данных:
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME> -credential_file=<PATH_TO_CREDENTIALS_FILE>
- После этого подключайтесь к базе данных, используя локальный адрес и порт:
import psycopg2 conn = psycopg2.connect(database="your_database", user="your_user", password="your_password", host="127.0.0.1", port="5432")
-
Настройка виртуальной машины с прокси:
- Создайте VM в GCP и установите Cloud SQL Auth Proxy, как описано выше.
- Настройте брандмауэр вашей виртуальной машины для разрешения входящих соединений на порт, на котором работает прокси.
- Подключитесь к Cloud SQL через эту виртуальную машину с вашей внешней машины.
С помощью одного из предложенных решений вы сможете успешно подключиться к вашему экземпляру Cloud SQL из внешней сети.