#google-cloud-sql #google-cloud-run
# #google-cloud-sql #google-cloud-run
Вопрос:
Как мне подключиться к базе данных в Cloud SQL без необходимости добавлять файл учетных данных в контейнер?
Комментарии:
1. Обратите внимание, что Cloud SQL скоро будет официально поддерживаться Cloud Run. Для этого не потребуется устанавливать прокси Cloud SQL внутри контейнера.
Ответ №1:
ОБНОВЛЕНИЕ: для подключения к облачному SQL из облачного запуска см. Официальную документацию
Облачный SQL теперь поддерживается полностью управляемой версией Cloud Run (пользователи Cloud Run на GKE уже могли использовать Cloud SQL с использованием частного IP-адреса)
Для начала:
- если у вас его еще нет, создайте экземпляр Cloud SQL.
- убедитесь, что включен API администрирования Cloud SQL
- разверните новую версию своей облачной службы запуска с помощью gcloud alpha и следующего флага:
$ gcloud run services update --add-cloudsql-instances [INSTANCE_CONNECTION_NAME]
Where isINSTANCE_CONNECTION_NAME
имеет типproject:region:instancename
.
Когда вы это сделаете, Cloud Run активирует и настроит для вас прокси Cloud SQL. Затем вы должны подключиться к нему через /cloudsql/[INSTANCE_CONNECTION_NAME]
сокет Unix.
Комментарии:
1. На самом деле это не работает. Синтаксис не соответствует CLI. Однако после первого успешного обновления все последующие обновления приводят к сбою gcloud
gcloud alpha run services update wordpress2 --add-cloudsql-instances cloudrun-sql
с ошибкой:{"version": "0.0.1", "verbosity": "ERROR", "timestamp": "2019-04-30T06:09:07.382Z", "message": "gcloud crashed (TypeError): can only join an iterable"}
2. Примечание. Для тех, кому интересно, у меня есть WordPress, который теперь работает в облачном режиме. Я планирую задокументировать это, как только Cloud SQL будет корректно работать с Cloud Run.
3. Сбой устраняется путем изменения команды gcloud на:
gcloud alpha run services update wordpress2 --set-cloudsql-instances cloudrun-sql
4. Однако использование
--add-cloudsql-instances
не должно приводить к сбою gcloud.5. Автоматическая настройка у меня не работает. Я вижу
/cloudsql
mount (none on /cloudsql type 9p (rw)
), но там ничего нет. Если я устанавливаюcloud_sql_proxy
и запускаю вручнуюcloud_sql_proxy -instances="[CONNECTION-NAME]" -dir=/tmp
, то сокет находится внутри/tmp
.
Ответ №2:
ПОДКЛЮЧЕНИЕ ИЗ ОБЛАЧНОГО ЗАПУСКА (полностью управляемое) ДЛЯ ОБЛАЧНОГО SQL С ИСПОЛЬЗОВАНИЕМ ДОМЕННЫХ СОКЕТОВ UNIX (Java)
В настоящее время Cloud Run (полностью управляемый) не поддерживает подключение к экземпляру Cloud SQL с использованием TCP. Ваш код не должен пытаться получить доступ к экземпляру, используя IP-адрес, такой как 127.0.0.1 или 172.17.0.1. ссылка
1. Установите и инициализируйте Cloud SDK
2. Обновите компоненты:
gcloud components update
3. Создайте новый проект
gcloud projects create run-to-sql
gcloud config set project run-to-sql
gcloud projects describe run-to-sql
4. Включить выставление счетов
gcloud alpha billing projects link run-to-sql --billing-account XXXXXX-XXXXXX-XXXX
5.Установите метаданные compute project-info:
gcloud compute project-info describe --project run-to-sql
gcloud compute project-info add-metadata --metadata google-compute-default-region=europe-west2,google-compute-default-zone=europe-west2-b
6. Включите API администратора Cloud SQL:
gcloud services enable sqladmin.googleapis.com
7. Создайте экземпляр Cloud SQL с общедоступным Ip
#Create the sql instance in the same region as App Engine Application
gcloud --project=run-to-sql beta sql instances create database-external --region=europe-west2
#Set the password for the "root@%" MySQL user:
gcloud sql users set-password root --host=% --instance database-external --password root
#Create a user
gcloud sql users create user_name --host=% --instance=database-external --password=user_password
#Create a database
gcloud sql databases create user_database --instance=database-external
gcloud sql databases list --instance=database-external
gcloud sql instances list
Cloud Run (полностью управляемый) использует учетную запись службы для авторизации ваших
подключений к Cloud SQL. Эта учетная запись службы должна иметь правильный
Разрешения IAM для успешного подключения. Если не настроено иное,
учетная запись службы по умолчанию имеет формат
PROJECT_NUMBER-compute@developer.gserviceaccount.com .
8. Убедитесь, что учетная запись службы для вашей службы имеет одну из следующих ролей IAM: Cloud SQL Client (предпочтительно)
gcloud iam service-accounts list
gcloud projects add-iam-policy-binding run-to-sql --member serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com. --role roles/cloudsql.client
9. Клонируйте java-docs-repository
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
cd java-docs-samples/cloud-sql/mysql/servlet/
ls
#Dockerfile pom.xml README.md src
10. Проверьте файл, который обрабатывает подключение к Cloud SQL
cat src/main/java/com/example/cloudsql/ConnectionPoolContextListener.java
11. Контейнеризация приложения и загрузка его в реестр контейнеров
gcloud builds submit --tag gcr.io/run-to-sql/run-mysql
12. Развертывание службы в облачном запуске
gcloud run deploy run-mysql --image gcr.io/run-to-sql/run-mysql
13. Настройте службу для использования с Cloud Run
gcloud run services update run-mysql --add-cloudsql-instances run-to-sql:europe-west2:database-external --set-env-vars CLOUD_SQL_CONNECTION_NAME=run-to-sql:europe-west2:database-external DB_USER=user_name,DB_PASS=user_password,DB_NAME=user_database
14. Протестируйте его
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://run-mysql-xxxxxxxx-xx.x.run.app
УСПЕХ!
Ответ №3:
Я столкнулся с проблемой при подключении из докеризованного приложения FastApi к CloudSQL через частный ip. Я предпринял следующие 3 шага, чтобы решить мою проблему:
- Убедитесь, что ваше приложение использует правильный
database-connection-string
.- Проверка работоспособности, всегда делайте это в первую очередь. Вы же не хотите тратить часы на поиск решения, не исключив сначала неправильную строку подключения.
- При тестировании (и только при тестировании): рассмотрите возможность регистрации строки подключения к БД при инициализации приложения, чтобы вы могли явно подтвердить правильность вашей строки подключения.
- Предоставьте
Cloud SQL Client
роль моей учетной записи службы cloudrun по умолчанию.- Содержит следующие разрешения:
cloudsql.instances.connect
cloudsql.instances.get
- Содержит следующие разрешения:
- Создайте
VPC connector
в сети базу данных (документация). И назначьте соединитель VPC службе облачного запуска.
Комментарии:
1. Я настроил это несколько недель назад и заметил, что VPC Connector взимает с меня плату. Есть ли способ сделать это без подключения к VPC connector? Заметили ли вы некоторые затраты на VPC connector?