Todo funcionaba bien hace un momento, pero de repente Google Cloud Run no puede conectarse con Cloud SQL. Tanto Cloud Run como Cloud SQL están en el mismo proyecto. Cloud SQL tiene IP pública.
Cloud Run está ejecutando una aplicación Django/uwsgi/nginx en contenedores. Obteniendo el siguiente error:
MySQLdb._exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'xx.xxx.xx.xxx:3306' (110)")Configuración de Django:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': my_db_name, 'USER': my_db_user, 'PASSWORD': my_db_password, 'HOST': cloud_sql_ip_address, 'PORT': '3306', } }A continuación se muestra la pieza yaml de Cloud Run:
annotations: run.googleapis.com/client-name: gcloud client.knative.dev/user-image: my_custom_manage run.googleapis.com/client-version: 347.0.0 run.googleapis.com/cloudsql-instances: my_project_id:us-central1:my_sql_server autoscaling.knative.dev/maxScale: '10' run.googleapis.com/sandbox: gvisorTambién verifiqué esto: https://cloud.google.com/sql/docs/mysql/connect-run
La cuenta de servicio que está adjunta al servicio Cloud Run tiene una Compute Engine default service account lo que básicamente significa que tiene todo el acceso.
Solución : para cualquier persona que tenga esta pregunta, use la referencia del socket, no la IP y el puerto. Dado que Cloud Run crea un socket para conectarse a Cloud SQL y la IP:3306 de Django no funciona.
Mi actualización de la configuración de django DB:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': my_db_name, 'USER': my_db_user, 'PASSWORD': my_db_password, 'HOST': f'/cloudsql/cloud_sql_connection_name' } } Sin embargo, no estoy seguro de por qué funcionaba bien antes con IP:3306 , Cloud Run debería haber dado un error en el inicio.
Cloud Run usa un socket de Unix para conectarse a SQL.
Según su mensaje de error, parece que intenta conectarse directamente a la IP.
Verificaría el código de la aplicación y vería si hubo una actualización no detectada, la cadena de conexión debe basarse en un socket y no en una IP,
el formato de socket es: /cloudsql/connection_id
Ver más aquí