Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да се свържа с Cloud SQL MySQL база данни от App Engine?

СВЪРЗВАНЕ ОТ APP ENGINE (FLEX И СТАНДАРТНО) КЪМ ОБЛАЧЕН SQL ИЗПОЛЗВАНЕ НА TCP И UNIX ДОМЕЙНИ СОКЕТИ 2020

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. Задайте метаданните за изчислителна информация за проекта:

 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. Активирайте Service Networking Api:

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

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

6. Облачен 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 "[email protected]%" 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 Облачен 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 "[email protected]%" 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 към база данни-ipinternal, използвайки достъп без сървър и TCP, от App Engine Standard към външна база данни, използвайки unix домейн сокет, от App Engine Flex към база данни-ipinternal, използвайки TCP, и от App Engine Flex към външна база данни, използвайки unix домейн сокет.

7. Активирайте Cloud SQL Admin API

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

8. Понастоящем стандартните среди на App Engine не поддържат свързване към облачния SQL екземпляр чрез TCP. Вашият код не трябва да се опитва да осъществи достъп до екземпляра с помощта на IP адрес (като 127.0.0.1 или 172.17.0.1), освен ако не сте конфигурирали безсървърен VPC достъп. Така че нека конфигурираме безсървърен VPC достъп.

8.a Уверете се, че API за достъп до VPC без сървър е активиран за вашия проект:

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 разрешения, за да се свърже успешно. Unless otherwise configured, the default service account is in the format [email protected] nt.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:[email protected] --role roles/cloudsql.client
gcloud projects add-iam-policy-binding con-ae-to-sql --member serviceAccount:[email protected] --role roles/compute.networkUser

Сега, когато конфигурирах настройката

1. Свържете се от App Engine Standard към Cloud Sql, като използвате Tcp и unix domanin сокет

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:[email protected]: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:[email protected]/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 към Cloud Sql, като използвате Tcp и unix domanin сокет

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:[email protected]: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:[email protected]/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'

УСПЕХ!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите последно въведен идентификатор от таблицата MySQL

  2. Неуспешно свързване с mysql на 127.0.0.1:3306 с отказан достъп на потребителя root за потребител 'root'@'localhost' (използвайки парола:ДА)

  3. mysql- Как да приложим грантове към колона?

  4. Присъединяване на таблица с MAX стойност от друга

  5. MySQL и NHibernate. Как да коригирате грешката:Колона „ReservedWord“ не принадлежи на таблица ReservedWords?