Не удается подключиться к экземпляру Google Cloud SQL на частном IP-адресе с виртуальной машины как с частным, так и с общедоступным IP-адресом.

Что я пытаюсь настроить:

  • Экземпляр Cloud SQL с частным IP, база данных Postgresql
  • Виртуальная машина с одним общедоступным IP-адресом и одним частным IP-адресом в той же сети VPC, что и экземпляр SQL (виртуальная машина, экземпляр SQL и VPC находятся в одном регионе)
  • Виртуальная машина имеет учетную запись службы с достаточными разрешениями клиента / средства просмотра Cloud SQL.
  • Прокси-сервер SQL на виртуальной машине, подключающейся к экземпляру SQL. Я запускаю его с аргументом -ip_address_types=PRIVATE, который нашел в некоторой документации.

Код конфигурации

Слегка упрощенный код Terraform для воспроизведения состояния, которое меня смущает, находится здесь: https://github.com/hallvors/gcp-network-issue-demo Чтобы проверить это, сделайте следующее:

  1. создать новый одноразовый проект Google Cloud.
  2. Для вашего удобства вы можете запустить bootstrap.sh, чтобы включить нужные службы (он запросит идентификатор проекта Google и предположит, что у вас есть клиент gcloud, который вошел в систему и имеет доступ).
  3. Создайте сервисный аккаунт в проекте, просто сделайте его владельцем для удобства и сохраните файл ключа в ./local-secrets/google-project-credentials.json
  4. Обновите terraform.tfvars, указав идентификатор проекта и адрес электронной почты учетной записи службы.
  5. terraform workspace new staging
  6. terraform init
  7. terraform apply

Когда Terraform будет готов, у вас должна быть настроена база данных и виртуальная машина в проекте.

  1. Подключитесь к виртуальной машине по SSH и запустите sudo apt install postgresql-client-common postgresql-client
  2. Найдите IP-адрес экземпляра БД
  3. Запустите это (при необходимости измените детали) psql --host 10.167.0.3 -U gcp-network-issue-demo-staging-db-user gcp-network-issue-demo-staging-database

Что происходит?

  • Любая попытка фактически использовать соединение, например, от клиента psql или db-migrate, истекает
  • Если я удалю общедоступный IP-адрес виртуальной машины из настройки, она подключится нормально. Однако мне нужна общедоступная виртуальная машина, чтобы другие службы могли к ней подключаться.

Что мне не хватает?


comment
Вам не хватает деталей. 1) Покажите, как именно вы запускаете Cloud SQL Proxy. 2) Покажите, как именно вы подключаетесь через psql и т. Д. 3) Что такое 10.240.0.3? 4) Какие роли фактически назначены учетной записи службы ?. 5) Если Cloud SQL адресуется в том же VPC, прокси-сервер Cloud SQL не требуется, просто подключитесь напрямую к частному IP-адресу с правильными учетными данными PostgreSQL.   -  person John Hanley    schedule 11.09.2020
comment
Спасибо за комментарий! Я добавлю подробности :) Я знаю, что мне строго не нужен SQL-прокси (но время прямого подключения истекает таким же образом), однако есть некоторые преимущества в его использовании, например, использование только ссылки на экземпляр вместо настройки вещей с IP-адресом .   -  person hallvors    schedule 12.09.2020
comment
1) Убедитесь, что вы можете подключиться напрямую, используя частный IP-адрес. 2) Вы разрешили сети, которые могут подключаться? Возможно, вы перезаписали авторизованные сети, блокируя RFC1918 (частные) адреса. Посмотрите на команду: gcloud sql instances patch INSTANCE_NAME --authorized-networks   -  person John Hanley    schedule 12.09.2020
comment
Прямое соединение также не работает psql --host 10.240.0.3 -U postgres slipway-refactored-staging-database psql: could not connect to server: Connection timed out Is the server running on host "10.240.0.3" and accepting TCP/IP connections on port 5432? Вы имеете в виду добавление общедоступного IP-адреса моей виртуальной машины в качестве авторизованного? Я попытался запустить `экземпляры gcloud sql --project slipway-refactored patch slipway-refactored-staging-database-instance --authorized-networks 35.228.181.106`, но это, похоже, не имело значения.   -  person hallvors    schedule 12.09.2020
comment
У меня есть это в коде Terraform: ip_configuration { ipv4_enabled = false private_network = var.private_network } , и я в какой-то момент пытался добавить сюда данные авторизованной сети, но не смог найти конфигурацию, которая заставила бы все работать. Я прав, вы предлагаете добавить общедоступный IP-адрес виртуальной машины в качестве авторизованной сети?   -  person hallvors    schedule 12.09.2020
comment
Возможно, вам потребуется авторизовать свой адрес RFC1918. Это частные IP-адреса. Ответ кроется в деталях.   -  person John Hanley    schedule 12.09.2020
comment
Теперь вы упомянули Terraform. Начните сначала и создайте вопрос со всеми мелкими деталями.   -  person John Hanley    schedule 12.09.2020
comment
Позвольте нам продолжить это обсуждение в чате.   -  person hallvors    schedule 12.09.2020
comment
Чтобы помочь вам в дальнейшем, я могу помочь вам с базовыми API Google, которые вызывает Terraform Google Provider. У вас есть примеры?   -  person MrTech    schedule 14.09.2020
comment
Спасибо за комментарий @JohnHanley и MrTech - я создал демонстрационный репозиторий с достаточным количеством кода Terraform для воспроизведения состояния, которое меня смущает. Я также упростил вопрос и удалил материал о прокси-сервере SQL, поскольку проблему с подключением можно легко воспроизвести.   -  person hallvors    schedule 18.09.2020
comment
У вас есть новый вопрос? Насколько я понимаю, у вас возникают проблемы с подключением виртуальной машины к экземпляру Cloud SQL.   -  person MrTech    schedule 23.09.2020
comment
да. Должен ли я создать новый вопрос вместо того, чтобы настраивать этот? Это все та же проблема, с которой я борюсь. Первоначально я думал, что описания установки и конфигурации будет достаточно, но Джон сказал мне опубликовать код Terraform вместо этого, поэтому я создал демонстрационный репозиторий ..   -  person hallvors    schedule 23.09.2020
comment
Много чего происходит. Для меня есть вопрос о Terraform и вопрос о подключении. Новый вопрос о подключении упростит ситуацию.   -  person MrTech    schedule 23.09.2020
comment
Пожалуйста, подтвердите, что если вы откроете экземпляр sql в графическом интерфейсе, перейдите к подключению и вручную добавьте IP-адрес хоста, который вы подключаетесь из psql. Я не вижу в вашем коде terraform, что соединение настроено внутри экземпляра sql.   -  person Iñigo    schedule 24.09.2020
comment
Привет @ Iñigo, спасибо, но как мне добавить этот IP? Когда у экземпляра есть только частный IP-адрес, экран подключений выглядит следующим образом: drive.google.com/file/d/1_xG4gBJM_WAvSgmTotPiMppbTBtFsReA/   -  person hallvors    schedule 25.09.2020
comment
Вы уже настроили доступ к частным службам в своем экземпляре Cloud SQL? cloud.google.com/sql/docs/postgres/   -  person Christopher    schedule 25.09.2020


Ответы (1)


Причина этой проблемы заключалась в том, что я не мог понять, что сетевой интерфейс может иметь как общедоступные, так и общедоступные и частные IP-адреса / сети. Итак, мой код настроил один интерфейс для общедоступной и один для частной сети для google_compute_instance:

  # Update VM needs a public IP
  network_interface {
    network = "default"
    access_config {
    }
  }

  network_interface {
    network    = var.network
    subnetwork = var.subnetwork
  }

Я все еще не совсем понимаю сеть, но похоже, что вы не можете (легко?) Указать, какой интерфейс должны использовать попытки подключения к базе данных, и он автоматически не выбирает правильный. Исправление находится в этой фиксации, настраивая как доступ к частной сети, так и к общедоступной в одном сетевом интерфейсе:

https://github.com/hallvors/gcp-network-issue-demo/commit/ea14174c1087c89b92310b5b4913e12a4e17130d

person hallvors    schedule 08.10.2020