使用TCP和UNIX域套接字从Google云功能连接到Cloud SQL 2020
1. 创建一个新项目
gcloud projects create gcf-to-sql
gcloud config set project gcf-to-sql
gcloud projects describe gcf-to-sql
2. 在您的项目上启用计费:https://cloud.google.com/billing/docs/how-to/modify-project
3. 设置计算项目信息元数据:
gcloud compute project-info describe --project gcf-to-sql
gcloud compute project-info add-metadata --metadata google-compute-default-region=europe-west2,google-compute-default-zone=europe-west2-b
4.启用服务网络 API:
gcloud services list --available
gcloud services enable servicenetworking.googleapis.com
5.创建2个云 SQL 实例(一个内部 IP,一个公共 IP)- https://cloud.google.com/sql/docs/mysql/create-instance
6.拥有外部 IP 的云 SQL 实例:
#Create the sql instance in the
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 内部IP的Cloud Sql实例:
i.
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
gcloud services vpc-peerings operations describe --name=operations/pssn.dacc3510-ebc6-40bd-a07b-8c79c1f4fa9a
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
gcloud sql users set-password root --host=% --instance database-ipinternal --password root
gcloud sql users create user_name --host=% --instance=database-ipinternal --password=user_password
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
好的,我们有两个 MySQL 实例,我们将使用 Serverless Access 和 TCP 从 Google Cloud Functions 连接到 database-ipinternal,以及使用 Unix 域套接字从 Google Cloud Functions 连接到 database-external。
7. 启用 Cloud SQL 管理 API。
gcloud services list --available
gcloud services enable sqladmin.googleapis.com
注意:默认情况下,Cloud Functions 不支持使用 TCP 连接到 Cloud SQL 实例。除非您已经配置了无服务器 VPC 访问,否则您的代码不应尝试使用 IP 地址(例如 127.0.0.1 或 172.17.0.1)访问该实例。
8.a 确保在您的项目中启用了无服务器 VPC 访问 API。
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
gcloud compute networks vpc-access connectors describe serverless-connector --region europe-west2
9. 为您的云函数创建一个服务账户。确保该服务的账户拥有以下IAM角色:Cloud SQL客户端,如果需要从标准App Engine连接到内部IP上的Cloud SQL,我们还需要Compute Network用户角色。
gcloud iam service-accounts create cloud-function-to-sql
gcloud projects add-iam-policy-binding gcf-to-sql --member serviceAccount:cloud-function-to-sql@gcf-to-sql.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud projects add-iam-policy-binding gcf-to-sql --member serviceAccount:cloud-function-to-sql@gcf-to-sql.iam.gserviceaccount.com --role roles/compute.networkUser
现在我已经配置好了设置
1. 通过Tcp和unix domain socket从Google Cloud Functions连接到Cloud Sql
cd app-engine-standard/
ls
cat requirements.txt
sqlalchemy
pymysql
cat main.py
import pymysql
from sqlalchemy import create_engine
def gcf_to_sql(request):
engine_tcp = create_engine('mysql+pymysql://user_name:user_password@10.36.0.3:3306')
existing_databases_tcp = engine_tcp.execute("SHOW DATABASES;")
con_tcp = "Connecting from Google Cloud Functions 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/gcf-to-sql:europe-west2:database-external')
existing_databases_unix_socket = engine_unix_socket.execute("SHOW DATABASES;")
con_unix_socket = "Connecting from Google Cloud Function 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
2.部署云函数:
gcloud beta functions deploy gcf_to_sql --runtime python37 --region europe-west2 --vpc-connector projects/gcf-to-sql/locations/europe-west2/connectors/serverless-connector --trigger-http
3.前往云函数,选择gcf-to-sql,进行测试,测试该函数:
#Connecting from Google Cloud Functions to Cloud SQL using TCP: databases => 'information_schema', 'mysql', 'performance_schema', 'sys', 'user_database'
#Connecting from Google Cloud Function to Cloud SQL using Unix Sockets: tables in sys database: => 'information_schema', 'mysql', 'performance_schema', 'sys', 'user_database'
成功!
<YOUR_PROJECT_ID>@appspot.gserviceaccount.com
添加到您的IAM中,并提供Cloud SQL客户端角色。 - Wes Cossick