Связь между Cloud Run и Cloud SQL (внутренний IP)

Я создал инфраструктуру своей организации в GCP в соответствии с Cloud Foundation Toolkit с использованием модулей Terraform, предоставленных Google. .

В следующей таблице перечислены диапазоны IP-адресов для всех сред:

Диапазоны IP-адресов VPC

Сейчас я развертываю свое приложение, которое состоит в основном из сервисов Cloud Run и экземпляра Cloud SQL (Postgres). Экземпляр Cloud SQL был создан с частным IP-адресом из нераспределенного диапазона IP-адресов, зарезервированного для одноранговых служб (например, Cloud SQL).

Чтобы установить соединение между Cloud Run и Cloud SQL, я также создал бессерверный соединитель VPC (диапазон IP 10.1.0.16/28) и настроил прокси Cloud SQL.

Cloud Run Service

Когда я пытаюсь подключиться к базе данных из службы Cloud Run, я получаю эту ошибку через ~ 10 секунд:

Ошибка подключения к CloudSQL. См. https://cloud.google.com/sql/docs/mysql/connect-run для получения дополнительных сведений: разместите https://www.googleapis.com/sql/v1beta4/projects/[my-project ]/instances/platform-db/createEphemeral?alt=json&prettyPrint=false: крайний срок контекста. превышен

Я предоставил roles/vpcaccess.user как для Cloud Run SA по умолчанию, так и для приложения, используемого в основном проекте.

Я предоставил roles/compute.networkUser для обоих SA в сервисном проекте. Я также предоставил roles/cloudsql.client для обоих SA.

Я включил servicenetworking.googleapis.com и vpcaccess.googleapis.com в сервисном проекте.

У меня закончились идеи, и я не могу понять, в чем проблема.

Это похоже на ошибку тайм-аута, когда Cloud Run пытается создать запрос POST к Cloud SQL API. Таким образом, похоже, что соединитель VPC (10.1.0.16/28) не может подключиться к экземпляру Cloud SQL (10.0.80.0/20).

Кто-нибудь сталкивался с этой проблемой раньше?


person Raoni    schedule 22.01.2021    source источник


Ответы (2)


Когда вы используете встроенное соединение Cloud SQL в Cloud Run (а также App Engine и Cloud Function), создается соединение, подобное прокси-серверу Cloud SQL. Это соединение может быть достигнуто только на общедоступном IP-адресе Cloud SQL, даже если у вас есть бессерверный соединитель VPC и ваша база данных доступна через VPC.

Если у вас есть только частный IP-адрес в Cloud SQL, вам необходимо использовать частный IP-адрес для доступа к базе данных, а не встроенный коннектор Cloud SQL. Подробнее читайте в документации.

Я также написал статью об этом

person guillaume blaquiere    schedule 22.01.2021
comment
Я также пробовал использовать частный IP-адрес, однако время ожидания запроса истекло с ошибкой: HTTP 503 - запрос завершился неудачно, потому что либо HTTP-ответ был искажен, либо возникла ошибка подключения к экземпляру. Глядя на брандмауэр, нет никаких правил входа. Кроме того, маршруты выглядят нормально: есть один из диапазона коннекторов VPC в общий VPC и из диапазона Cloud SQL в одноранговый VPC. Я считаю, что у меня также есть хорошо настроенные разрешения. Что мне не хватает? - person Raoni; 27.01.2021
comment
Я нашел проблему. Отсутствовали правила брандмауэра. Cloud Foundation Toolkit создает правила запрета на исходящий трафик для всех. Разъем VPC не входит в диапазон подсетей и поэтому не получает доступа по умолчанию. Я создал правило брандмауэра, чтобы разрешить выход как к диапазону IP-адресов частных служб в общем VPC, так и к API Google (199.36.153.8/30). Однако я не уверен, как настроить таргетинг на разъем VPC. На данный момент вновь созданные правила имеют целью «все». Можно ли добавить в коннектор сетевые теги? - person Raoni; 27.01.2021
comment
Когда вы определяете свой соединитель, вы определяете диапазон. Вы можете использовать этот диапазон в своем правиле брандмауэра, если хотите. Но нет, вы не можете добавить сетевой тег к коннектору. - person guillaume blaquiere; 27.01.2021

Если вы используете частный IP-адрес, вам необходимо проверить диапазон IP-адресов сети докер-моста. Вот что говорится в документации:

Если клиент не может подключиться к экземпляру Cloud SQL с помощью частного IP-адреса, проверьте, использует ли клиент какой-либо IP-адрес в диапазоне 172.17.0.0/16. Не удается подключиться к экземплярам Cloud SQL с любого IP-адреса в диапазоне 172.17.0.0/16, используя частный IP-адрес. Точно так же экземпляры Cloud SQL, созданные с IP-адресом в этом диапазоне, недоступны. Этот диапазон зарезервирован для сети докер-моста.

Чтобы решить некоторые проблемы, с которыми вы столкнулись, следуйте документации, здесь и опубликуйте любые полученные сообщения об ошибках, например, вы можете попробовать:

Попробуйте выполнить команду gcloud sql connect, чтобы подключиться к своему экземпляру. Эта команда авторизует ваш IP-адрес на короткое время. Вы можете запустить эту команду в среде с установленным Cloud SDK и клиентом mysql. Вы также можете запустить эту команду в Cloud Shell, который доступен в Google Cloud Console и имеет предустановленный Cloud SDK и клиент mysql.

Временно разрешите всем IP-адресам подключаться к экземпляру. Для IPv4 авторизуйте 0.0.0.0/0 (для IPv6 авторизуйте :: / 0. После тестирования убедитесь, что вы удалили его снова, поскольку он откроется для всего мира! < / em>

Вы используете пулы соединений?

Если нет, я бы создал кеш подключений, чтобы, когда вашему приложению необходимо подключиться к базе данных, оно могло получить временное подключение из пула. После завершения работы приложения соединение снова возвращается в пул для дальнейшего использования. Чтобы это работало правильно, соединение должно быть эффективно и не тратить зря ресурсы.

person Andrew    schedule 22.01.2021