Облачная сборка не может подключиться к базе данных реплики
Я развертываю приложение django с помощью службы GCP Cloud build
. В cloudbuild.yaml
я определяю шаг для применения миграций с помощью gcr.io/google-appengine/exec-wrapper
инструмента:
- id: "apply migrations"
name: "gcr.io/google-appengine/exec-wrapper"
args:
[
"-i",
"gcr.io/$PROJECT_ID/${_SERVICE_NAME}",
"-s",
"${PROJECT_ID}:${_REGION}:${_DB_INSTANCE_NAME}",
"-e",
"GOOGLE_CLOUD_SECRETS_NAME=${_GOOGLE_CLOUD_SECRETS_NAME}",
"-e",
"DJANGO_SETTINGS_MODULE=${_DJANGO_SETTINGS_MODULE}",
"--",
"python",
"manage.py",
"migrate",
]
Все работает нормально с одной базой данных "default"
.
Затем:
DATABASES = {
"default": env.db("DATABASE_URL"),
"replica": env.db("REPLICA_DATABASE_URL"),
}
Когда я добавил новую базу данных mysql replica
с именем gcp-replica-2015-07-08-1508
, служба Cloud build
начала отказывать с ошибкой:
django.db.utils.OperationalError:
(2002, "Can't connect to local MySQL server through socket
'/cloudsql/myproject-228819:us-central1:gcp-replica-2015-07-08-'
Я проверил конфигурацию моей базы данных, напечатав DATABASES
переменную в Cloud build
и конфигурация имеет правильные данные, но если вы посмотрите на ошибку, вы заметите, что ошибка возвращается с обрезанной строкой в конце ! без -1508
Если я пропущу этот шаг и разверну свое приложение с тем же конфигом на Cloud Run
все работает нормально.
Учетная запись службы имеет следующие роли:
Реплика DB Version MySQL 5.7
Согласно руководству Running Django on the Cloud Run environment, предоставленному Google, для сохранения конфигурации базы данных следует использовать environ.
В защищенном env-файле сохраните настройки, необходимые для запуска Django. Значение секрета извлекается через API Secret Manager, а значения загружаются в среду Django с помощью пакета django-environ.
Настройка для вашей базы данных SQL хранится в файле settings.py. Настройка DATABASES обновляется, чтобы предполагать использование прокси Cloud SQL Auth, если применяется настройка USE CLOUD SQL AUTH PROXY.
Когда вы используете gcr.io/google-appengine/exec-wrapper, и он предназначен для запуска в качестве шага в задании Cloud Build, вы должны отправить в качестве аргументов путь к развернутому образу приложения, любые переменные окружения, которые необходимо установить, любые экземпляры Cloud SQL, которые необходимо сделать доступными, и команду для запуска. Вот пример конфигурации Cloud Build:
шагов:
name: "gcr.io/google-appengine/exec-wrapper"
args: ["-i", "gcr.io/my-project/appengine/some-long-name",
"-e", "ENV_VARIABLE_1=value1", "-e", "ENV_2=value2",
"-s", "my-project:us-central1:my_cloudsql_instance",
"--", "bundle", "exec", "rake", "db:migrate"]
Вы можете найти путь к изображению, используя описанные версии приложения gcloud.
Вот некоторые связанные вопросы с тем же сообщением об ошибке, которое вы получаете, которые, возможно, могут помочь: