Как подключиться с внешней машины к экземпляру SQL, размещенному в общей подсети VPC

Вопрос или проблема

Я развернул экземпляр 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-адрес.

Решения

С учетом вышеизложенного, предлагаю следующие варианты для успешного подключения:

  1. Использование публичного IP-адреса и Cloud SQL Auth Proxy:

    • Настройте ваш экземпляр SQL для использования публичного IP-адреса. Важно: не забудьте не добавлять IP-адреса в белый список, чтобы повысить безопасность.
    • Установите и настройте Cloud SQL Auth Proxy на вашей внешней машине. Это инструмент, который позволяет безопасно подключаться к экземпляру Cloud SQL, так как он управляет процессом аутентификации, создавая защищенный туннель к вашему экземпляру Cloud SQL.
  2. Создание виртуальной машины в VPC с прокси:

    • Создайте виртуальную машину (VM) в вашем проекте GCP внутри той же VPC, где располагается ваш экземпляр SQL.
    • Установите на этой VM Cloud SQL Auth Proxy, используя параметр --private-ip. Это создаст туннель к вашему экземпляру Cloud SQL.
    • Ваша внешняя машина сможет обращаться к этому прокси-серверу, что позволит установить соединение без необходимости иметь публичный IP-адрес у экземпляра SQL.

Исполнение

  1. Настрока публичного 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")
  2. Настройка виртуальной машины с прокси:

    • Создайте VM в GCP и установите Cloud SQL Auth Proxy, как описано выше.
    • Настройте брандмауэр вашей виртуальной машины для разрешения входящих соединений на порт, на котором работает прокси.
    • Подключитесь к Cloud SQL через эту виртуальную машину с вашей внешней машины.

С помощью одного из предложенных решений вы сможете успешно подключиться к вашему экземпляру Cloud SQL из внешней сети.

Оцените материал
Добавить комментарий

Капча загружается...