Странное странное сообщение googleapi Err 400 при подключении к экземпляру Postgresql CloudSQL - PullRequest
2 голосов
/ 29 мая 2019

При попытке подключиться к экземпляру CloudSQL с использованием механизма cloud_sql_proxy

появляется странный пропущенный параметр проекта Err 400

У меня есть проект GCE с работающей базой данных CloudSQL postgres, мои приложения в compute api могут использовать его, и я могу выполнять обычный psql с любой виртуальной машины, которую я настроил в своем проекте GCE.

Однако, когда я пытаюсь подключиться к базе данных с моего ноутбука, используя cloud_sql_proxy, я получаю эту странную ошибку.

Я слежу за письмом этой документации: https://cloud.google.com/sql/docs/postgres/connect-admin-proxy#install

Итак, следуя той документации, которая у меня есть:

  1. CloudSQL включен и работает, как я прокомментировал
  2. Прокси установлен
  3. У меня есть служебная учетная запись, созданная, как сказано в документации, с ролью Cloud SQL Admin следующим образом:
{
  "type": "service_account",
  "project_id": "my-proyect-21432",
  "private_key_id": "<hidden intentionally>",
  "private_key": "<hidden intentionally>",
  "client_email": "cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com",
  "client_id": "<hidden intentionally>",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com"
}
  1. Я успешно запустил cloud_sql_proxy следующим образом:
user@hostname:~$ ./cloud_sql_proxy -instances=db1=tcp:15432 -credential_file=my-proyect-21432.json
2019/05/29 10:17:25 Rlimits for file descriptors set to {&{8500 65536}}
2019/05/29 10:17:25 using credential file for authentication; email=cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com
2019/05/29 10:17:25 Listening on 127.0.0.1:15432 for db1
2019/05/29 10:17:25 Ready for new connections
  1. И, наконец, я запускаю клиент psql следующим образом:
psql "host=127.0.0.1 port=15432 sslmode=disable dbname=db1 user=dbuser"

Я вижу в cloud_sql_proxy следующую ошибку:

2019/05/29 10:17:33 New connection for "db1"
2019/05/29 10:17:34 couldn't connect to "db1": googleapi: Error 400: Missing parameter: project., required

А на стороне клиента я получаю:

psql: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

На этом этапе я должен успешно подключить клиента psql , и я не могу найти что-либо об этой ошибке в Интернете или в документации Google

Понятия не имею, где мне нужно установить параметр project , я пробовал сумасшедшие места, такие как на стороне psql с -v или с помощью URL с ? в конце, без удачи, я также попытался на стороне cloud_sql_proxy, используя флаг -projects , также безуспешно.


РЕДАКТИРОВАТЬ: Новые выводы !!!

Я думаю, что я близок к тому, чтобы решить эту проблему, первая настройка, которую я сделал (как указано выше), была на моем компьютере с Windows, который я использую дома, сегодня я нахожусь в офисе, и я решил повторить все это, используя macos, я не думаю, что ОС вообще имеет значение, интересно то, что я скопировал все и основал небольшую вещь, которая заставляет меня двигаться вперед

Итак, я снова начал и выполняю пункты 1., 2., 3., 4. и жду? документация гласит, что строка instance выглядит следующим образом: myproject: us-central1: myinstance НЕ то, что я изначально написал, поэтому я изменил это и начал иметь более разумную ошибку:

Я запустил cloud_sql_proxy установить соединение с psql и получил это:

user@hostname:~$ ./cloud_sql_proxy -instances=my-proyect-21432:us-east1:db1=tcp:15432 -credential_file=my-proyect-21432.json
2019/05/30 14:13:25 Rlimits for file descriptors set to {&{8500 65536}}
2019/05/30 14:13:25 using credential file for authentication; email=cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com
2019/05/30 14:13:25 Listening on 127.0.0.1:15432 for db1
2019/05/30 14:13:25 Ready for new connections

<< when I run psql>>

2019/05/30 14:14:08 New connection for "my-proyect-21432:us-east1:db1"
2019/05/30 14:15:24 couldn't connect to "my-proyect-21432:us-east1:db1": dial tcp 10.26.112.3:3307: connect: operation timed out

Мой экземпляр db1 имеет только частный IP-адрес 10.26.112.3

Я начал искать эту ошибку в интернете и нашел предложение, разрешающее входящий трафик на порт 3307:

Невозможно подключиться через облачный SQL-прокси из облачной оболочки через прокси https://github.com/GoogleCloudPlatform/cloudsql-proxy/issues/164

Поэтому я добавил следующее правило:

allow-cloudsqlproxy | Ingress | Apply to all | IP Ranges 0.0.0.0/0 | tcp,udp 3307 | allow | default | 1000

Но это не имело никакого значения, потому что после этого я все еще получаю то же сообщение об ошибке: (


РЕДАКТИРОВАТЬ: с виртуальной машины в том же проекте

Я создал виртуальную машину для этого проекта и реплицировал все это, я смог подключиться, ни одно соединение не было отклонено в сообщении порта 3307.

Понятия не имею, кто блокирует этот трафик ...

Ответы [ 3 ]

2 голосов
/ 22 июня 2019

Спасибо, что сообщили нам о своих выводах. Я столкнулся с той же проблемой. Я только что решил - твое первое редактирование предупредило меня.

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

`./cloud_sql_proxy -instances=<instance_name>=tcp:5433`

Это не позволило мне подключиться. Я получаю эту ошибку

`couldn't connect to "xxxxxxx": googleapi: Error 400: Missing parameter: project., required`

После прочтения вашего изменения я изменил команду, чтобы использовать полное имя экземпляра, как указано на странице сведений об экземпляре, и это сработало. Это новая команда, которая заработала.

`./cloud_sql_proxy -instances=myproject:us-central1:instancename=tcp:5433`

Надеюсь, это сэкономит кому-то несколько часов.

0 голосов
/ 03 июня 2019

На самом деле cloudql-proxy работает, когда ваш экземпляр Cloud SQL имеет только внутренний IP-адрес. В этом сценарии вы используете доступ к частным сервисам, чтобы установить соединение между cloudql-proxy и экземпляром Cloud SQL. Также рекомендуется запускать прокси с помощью параметра --ip_address_types = PRIVATE, чтобы заставить его использовать внутренний IP вместо общедоступного при подключении к экземпляру Cloud SQL.

Смотрите здесь и здесь для более подробной информации.

Надеюсь, это поможет.

0 голосов
/ 31 мая 2019

Хорошо, очевидно, cloud_sql_proxy не работает, если у вашего экземпляра БД есть только частный IP-адрес , мне пришлось добавить публичный, чтобы прокси-сервер имел доступ к моему экземпляру .

Я понимаю некоторые ограничения, но если Google предоставляет cloud_sql_proxy , он должен поддерживать все случаи клиентов, я имею в виду, что я использую сеть по умолчанию, эта сеть управляется Google, сеть должна каким-то образом разрешать Прокси-сервер для доступа к моим экземплярам БД .. Я не знаю ...

Как только я добавил публичный IP , когда он начал работать ... но я, честно говоря, не хочу, чтобы публичный IP был в моих экземплярах БД.

...