Приложение Google App Engine .Net Core 2.0 не может получить доступ к базе данных Google Cloud SQL

У меня есть приложение dotnet core 2.0, работающее в гибкой среде Google App Engine. В рамках того же проекта Google у меня есть база данных Cloud SQL - MySQL. На странице сведений об экземпляре Cloud SQL на вкладке "Авторизация" указано

Приложения в этом проекте: Все авторизованы.

Однако я не могу получить доступ к базе данных из своего приложения, пока не добавлю маршрут 0.0.0.0/0 в раздел «Авторизованные сети».

Что я могу сделать, чтобы предоставить моему приложению доступ к базе данных, не открывая мою базу данных миру?


Обновление 2018-05-21 от Джеффри Ренни (принятый ответ)

App Engine теперь поддерживает подключение к экземпляру Cloud SQL с использованием номера порта вместо сокета домена unix. Итак, теперь вы можете добавить что-то вроде этого в свой app.yaml:

beta_settings:
    cloud_sql_instances: "your-project-id:us-central1:instance-name=tcp:5432"

И укажите Host=cloudsql в строке подключения в appsettings.json:

"ConnectionString": "Uid=aspnetuser;Pwd=;Host=cloudsql;Database=visitors"

В приведенном выше примере это порт 5432, который является портом по умолчанию для базы данных PostgreSQL. Для базы данных MySQL используйте порт 3306.

Полный пример с инструкциями по развертыванию в App Engine можно найти здесь:

https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/fflexible/CloudSql




Ответы (2)


Идеальное решение - использовать сокет домена unix для подключения экземпляра ядра вашего приложения к Cloud SQL. . Вот как это делают другие языки программирования, такие как Python и PHP. К сожалению, соединитель MySQL не работает с сокетами домена. Я не вижу причин, по которым это невозможно, но это не так. Надеюсь, они скоро исправят эту проблему.

Как описано в https://cloud.google.com/appengine/kb/#static-ip,

Обратите внимание, что использование фильтрации статических IP-адресов не считается безопасным и эффективным средством защиты. Например, злоумышленник может настроить вредоносное приложение App Engine, которое может использовать тот же диапазон IP-адресов, что и ваше приложение. Вместо этого мы предлагаем вам использовать подход глубокой защиты с использованием OAuth и сертификатов.

Если сертификатов недостаточно для защиты вашего приложения, то единственный оставшийся вариант, который я вижу сегодня, - это создать настраиваемая среда выполнения, которая запускает Cloud SQL Proxy. Прокси-сервер может перенаправить номер локального IP-порта в сокет домена unix. Если вы создали пару образов docker, то это не так уж плохо.

Я буду обновлять этот ответ по мере улучшения ситуации.


Обновление 21 мая 2018 г.

App Engine теперь поддерживает подключение к экземпляру Cloud SQL с использованием номера порта вместо сокета домена unix. Итак, теперь вы можете добавить что-то вроде этого в свой app.yaml:

beta_settings:
    cloud_sql_instances: "your-project-id:us-central1:instance-name=tcp:5432"

И укажите Host=cloudsql в строке подключения в appsettings.json:

"ConnectionString": "Uid=aspnetuser;Pwd=;Host=cloudsql;Database=visitors"

В приведенном выше примере это порт 5432, который является портом по умолчанию для базы данных PostgreSQL. Для базы данных MySQL используйте порт 3306.

Полный пример с инструкциями по развертыванию в App Engine можно найти здесь:

https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/fflexible/CloudSql

person Jeffrey Rennie    schedule 17.01.2018
comment
Благодарю за ваш ответ. Я ожидал, что у меня просто неправильная конфигурация или что-то подобное. Я попробую применить кое-что из этого и посмотрю, что у меня получится. Я отвечу, когда смогу. Еще раз спасибо за вашу помощь. - person Don Shrout; 18.01.2018
comment
Хорошо, после долгого чтения я чувствую себя вполне комфортно в том, что мы должны делать. Пока будем полагаться на сертификаты. Я не думаю, что нам придется делать настраиваемую среду выполнения и прокси. Спасибо за помощь. - person Don Shrout; 19.01.2018
comment
Наткнулся на именно эту проблему. Есть ли обновления в последнее время? @dshrout - person Lafexlos; 14.03.2018
comment
К сожалению нет. Решение, описанное в принятом ответе, - это способ справиться с этим. Теперь мы смотрим на Azure. Его гораздо проще использовать, и он очень сопоставим по стоимости. - person Don Shrout; 15.03.2018
comment
Лафекслос, инженеры Google работают над улучшением этого опыта. Я активно отслеживаю и подталкиваю к проблеме. - person Jeffrey Rennie; 15.03.2018

Хотя вы не ошибаетесь, что «приложения в этом проекте: все авторизованы», похоже, предполагает, что вы можете прямо из коробки просто использовать свое приложение App Engine с Cloud SQL, но есть ограничения.

Прежде всего, ваш Cloud SQL должен быть экземпляром 2-го поколения., а во-вторых, есть специальные инструкции., который зависит от используемого вами языка и типа App Engine (стандартный или гибкий).

Если ваша ситуация соответствует всем требованиям, она должна работать.

Для вашего конкретного случая использования вам потребуются инструкции он говорит, что вам нужно добавить сеть с доступом 0.0.0.0/0 и учетной записью пользователя. Аутентификация пользователя + SSL должны обеспечить необходимую вам безопасность.

person Ying Li    schedule 15.03.2018