Не удалось подключить ядро ​​приложения к облаку sql для mysql экземпляра - PullRequest
0 голосов
/ 02 февраля 2020

sqlalchemy.ex c .OperationalError: (py mysql .err.OperationalError) (2003, «Не удается подключиться к MySQL серверу на« localhost »([Errno 2] Нет такого файла или каталога) ") (Справочная информация об этой ошибке: http://sqlalche.me/e/e3q8)

Давно я застрял в этой ошибке, я пытаюсь подключить код своего ядра приложения python к облако sql для mysql экземпляра. Это первый раз, когда я работаю с облаком Google. Ниже приведен код, который я написал 1. в app.yaml

runtime:
    python37
vpc_access_connector:
    name: "projects/projectnameandcode/locations/location name/connectors/connector name"

2.requirements.txt

sqlalchemy
pymysql

в main.py

import py mysql

db = sqlalchemy.create_engine (

sqlalchemy.engine.url.URL(
    drivername="mysql+pymysql",
    username="username",
    password=password,
    database="databasename",
    query={"unix_socket": "/cloudsql/{}".format("instance name")},
),

) a = db.connect ()

Почему я сталкиваюсь с этой проблемой? Мои роли в Iam - владелец или администратор.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Стандартные среды App Engine не поддерживают подключение к экземпляру Cloud SQL с использованием TCP. Ваш код не должен пытаться получить доступ к экземпляру с использованием IP-адреса (например, 127.0.0.1 или 172.17.0.1), если вы не настроили Бессерверный VP C Access.

Из вашего вопроса я понимаю, что вы используете vpc_access_connector. Поэтому я предполагаю, что вы настроили Serverless VP C Access.

Код, используемый в main.py, предназначен для подключения к Cloud SQL экземпляры, использующие unix доменный сокет, а не TCP.

EDIT:

ПОДКЛЮЧЕНИЕ ИЗ ДВИГАТЕЛЯ APP ОБЛАЧИТЬ SQL ИСПОЛЬЗОВАТЬ TCP И UNIX ДОМЕННЫЕ РОЗЕТКИ

1. Создать новый проект

gcloud projects create con-ae-to-sql
gcloud config set project con-ae-to-sql
gcloud projects describe con-ae-to-sql

2.Включить биллинг для вашего проекта: https://cloud.google.com/billing/docs/how-to/modify-project

3.Запустите следующую команду gcloud, чтобы включить App Engine и создать связанные ресурсы приложения

gcloud app create -region europe-west2
gcloud app describe
#Remember the location of you App Engine aplication, because we will create all our resources on the same region

4.Установите метаданные compute project-info:

 gcloud compute project-info describe --project con-ae-to-sql
 #Enable the Api, and you can check that default-region,google-compute-default-zone are not set. Set the metadata.
 gcloud compute project-info add-metadata --metadata google-compute-default-region=europe-west2,google-compute-default-zone=europe-west2-b

5.Enable Service Networking Api:

gcloud services list --available
gcloud services enable servicenetworking.googleapis.com

6.Создать 2 облачных sql экземпляра (один с внутренним ip и один с publi c ip) - https://cloud.google.com/sql/docs/mysql/create-instance:

6.a Cloud Sql Экземпляр с внешним ip:

#Create the sql instance in the same region as App Engine Application
gcloud --project=con-ae-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

6.b Cloud Sql Экземпляр с внутренним ip:

i.#Create a private connection to Google so that the VM instances in the default VPC network can use private services access to reach Google services that support it.

gcloud compute addresses create google-managed-services-my-network     --global  --purpose=VPC_PEERING --prefix-length=16  --description="peering range for Google"  --network=default --project=con-ae-to-sql
gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com --ranges=google-managed-services-my-network  --network=default  --project=con-ae-to-sql
#Check whether the operation was successful.
gcloud services vpc-peerings operations describe     --name=operations/pssn.dacc3510-ebc6-40bd-a07b-8c79c1f4fa9a
#Listing private connections
gcloud services vpc-peerings list --network=default --project=con-ae-to-sql

ii.Create the instance:

gcloud --project=con-ae-to-sql beta sql instances create database-ipinternal --network=default --no-assign-ip  --region=europe-west2
#Set the password for the "root@%" MySQL user:
gcloud sql users set-password root --host=% --instance database-ipinternal --password root
#Create a user
gcloud sql users create user_name --host=% --instance=database-ipinternal  --password=user_password
#Create a database
gcloud sql databases create user_database --instance=database-ipinternal
gcloud sql databases list --instance=database-ipinternal 


gcloud sql instances list
gcloud sql instances describe database-external
gcloud sql instances describe database-ipinternal
#Remember the instances connectionName

ОК, так что у нас есть два mysql экземпляра, мы будем подключаться от App Engine Standard к базе данных с использованием технологии Serverless Access и TCP, от App Engine Standard до базы данных se-external с использованием доменного сокета unix, от App Engine Flex до внутренней базы данных с использованием TCP и от App Engine Flex до внешней базы данных с использованием доменного сокета unix.

7.Включить облако SQL Admin API

gcloud services list --available
gcloud services enable sqladmin.googleapis.com

8. В настоящее время стандартные среды App Engine не поддерживают подключение к экземпляру Cloud SQL с использованием TCP. Ваш код не должен пытаться получить доступ к экземпляру с использованием IP-адреса (например, 127.0.0.1 или 172.17.0.1), если вы не настроили безсерверный VP C Access. Итак, давайте настроим безсерверный VP C Access.

8.a Убедитесь, что для вашего проекта включен API-интерфейс доступа без сервера VP C:

gcloud services enable vpcaccess.googleapis.com

8.b Создайте соединитель:

gcloud compute networks vpc-access connectors create serverless-connector --network default --region europe-west2 --range 10.10.0.0/28
#Verify that your connector is in the READY state before using it
gcloud compute networks vpc-access connectors describe serverless-connector --region europe-west2

9.App Engine использует сервисная учетная запись для авторизации ваших подключений к Cloud SQL. Эта учетная запись службы должна иметь правильные разрешения IAM для успешного подключения. Если не указано иное, учетная запись службы по умолчанию имеет формат service-PROJECT_NUMBER@gae-api-prod.google.com.iam.gserviceaccount.com.. Убедитесь, что учетная запись службы для вашей службы имеет следующие роли IAM: Cloud SQL Client и для подключения из App Engine Standard к Cloud Sql на внутреннем ip нам также нужна роль Compute Network User.

gcloud iam service-accounts list
gcloud projects add-iam-policy-binding con-ae-to-sql --member serviceAccount:con-ae-to-sql@appspot.gserviceaccount.com --role roles/cloudsql.client
gcloud projects add-iam-policy-binding con-ae-to-sql --member serviceAccount:con-ae-to-sql@appspot.gserviceaccount.com --role roles/compute.networkUser

Теперь, когда я настроил настройку

1. Подключение из App Engine Standard к облаку Sql с использованием Tcp и unix Domanin Socket

cd app-engine-standard/
ls
#app.yaml  main.py requirements.txt

cat requirements.txt
Flask==1.1.1
sqlalchemy
pymysql
uwsgi==2.0.18

cat app.yaml
runtime: python37
entrypoint: uwsgi --http-socket :8080 --wsgi-file main.py --callable app --master --processes 1 --threads 2
vpc_access_connector:
    name: "projects/con-ae-to-sql/locations/europe-west2/connectors/serverless-connector" 



cat main.py

from flask import Flask
import pymysql
from sqlalchemy import create_engine

# If `entrypoint` is not defined in app.yaml, App Engine will look for an app
# called `app` in `main.py`.
app = Flask(__name__)

@app.route('/')
def hello():
    engine_tcp = create_engine('mysql+pymysql://user_name:user_password@internal-ip-of-database-ipinternal:3306')
    existing_databases_tcp = engine_tcp.execute("SHOW DATABASES;")
    con_tcp = "Connecting from APP Engine Standard to Cloud SQL using TCP: databases => " + str([d[0] for d in existing_databases_tcp]).strip('[]') + "\n"
    engine_unix_socket = create_engine('mysql+pymysql://user_name:user_password@/user_database?unix_socket=/cloudsql/con-ae-to-sql:europe-west2:database-external')
    existing_databases_unix_socket = engine_unix_socket.execute("SHOW DATABASES;")
    con_unix_socket = "Connecting from APP Engine Standard to Cloud SQL using Unix Sockets: tables in sys database:  => " + str([d[0] for d in existing_databases_unix_socket]).strip('[]') + "\n"
    return con_tcp + con_unix_socket



gcloud app deploy -q
gcloud app browse
#Go to https://con-ae-to-sql.appspot.com
#Connecting from APP Engine Standard to Cloud SQL using TCP: databases => 'information_schema', 'user_database', 'mysql', 'performance_schema', 'sys' Connecting from APP Engine Standard to Cloud SQL using Unix Sockets: tables in sys database: => 'information_schema', 'user_database', 'mysql', 'performance_schema', 'sys'

УСПЕХ!

2. Подключение из App Engine Flex к облаку Sql с использованием Tcp и unix доманиновое гнездо

cd app-engine-flex/
ls
#app.yaml  main.py requirements.txt

cat requirements.txt
Flask==1.1.1
gunicorn==19.9.0
sqlalchemy
pymysql

cat app.yaml
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
  python_version: 3
#Using TCP and unix sockets domain
beta_settings:
 cloud_sql_instances: con-ae-to-sql:europe-west2:database-ipinternal=tcp:3306,con-ae-to-sql:europe-west2:database-external
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10


cat main.py

from flask import Flask
import pymysql
from sqlalchemy import create_engine

app = Flask(__name__)

@app.route('/')
def hello():
    engine_tcp = create_engine('mysql+pymysql://user_name:user_password@internal-ip-of-database-ipinternal:3306')
    existing_databases_tcp = engine_tcp.execute("SHOW DATABASES;")
    con_tcp = "Connecting from APP Engine Flex to Cloud SQL using TCP: databases => " + str([d[0] for d in existing_databases_tcp]).strip('[]') + "\n"

    engine_unix_socket = create_engine('mysql+pymysql://user_name:user_password@/user_database?unix_socket=/cloudsql/con-ae-to-sql:europe-west2:database-external')
    existing_databases_unix_socket = engine_unix_socket.execute("SHOW DATABASES;")
    con_unix_socket = "Connecting from APP Engine Flex to Cloud SQL using Unix Sockets: tables in sys database:  => " + str([d[0] for d in existing_databases_unix_socket]).strip('[]') + "\n"
    return con_tcp + con_unix_socket


gcloud app deploy -q
gcloud app browse
#Go to https://con-ae-to-sql.appspot.com
#Connecting from APP Engine Flex to Cloud SQL using TCP: databases => 'information_schema', 'marian', 'mysql', 'performance_schema', 'sys' Connecting from APP Engine Flex to Cloud SQL using Unix Sockets: tables in sys database: => 'information_schema', 'marian', 'mysql', 'performance_schema', 'sys'

УСПЕХ!

0 голосов
/ 03 февраля 2020

Кратко посмотрите документацию Подключение к облаку SQL из App Engine и убедитесь, что вы правильно выполнили все шаги. В частности, убедитесь в следующем:

  1. Экземпляр имеет общедоступный c IP
  2. Облачный SQL Admin API включен
  3. Учетная запись службы Облако SQL IAM разрешений
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...