Как безопасно подключиться к облачному SQL из Cloud Run?

#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 is INSTANCE_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 шага, чтобы решить мою проблему:

  1. Убедитесь, что ваше приложение использует правильный database-connection-string .
    • Проверка работоспособности, всегда делайте это в первую очередь. Вы же не хотите тратить часы на поиск решения, не исключив сначала неправильную строку подключения.
    • При тестировании (и только при тестировании): рассмотрите возможность регистрации строки подключения к БД при инициализации приложения, чтобы вы могли явно подтвердить правильность вашей строки подключения.
  2. Предоставьте Cloud SQL Client роль моей учетной записи службы cloudrun по умолчанию.
    • Содержит следующие разрешения:
      cloudsql.instances.connect
      cloudsql.instances.get
  3. Создайте VPC connector в сети базу данных (документация). И назначьте соединитель VPC службе облачного запуска.

Комментарии:

1. Я настроил это несколько недель назад и заметил, что VPC Connector взимает с меня плату. Есть ли способ сделать это без подключения к VPC connector? Заметили ли вы некоторые затраты на VPC connector?