1

我目前正在 App Engine Flexible Environment 上设置一个名为 Mautic 的开源营销软件。但是,我无法使用 MySQLi 将 App Engine 连接到 Cloud SQL MySQL 数据库。Mautic 是一个建立在 Symfony 之上的 PHP 应用程序。我尝试使用 /cloudsql/< instance_connection_name > 作为主机,但它不起作用。有没有人有在 App Engine 上部署 Mautic 的经验或知道如何解决这个问题?

4

2 回答 2

6

使用 TCP 和 UNIX 域套接字 2020 从应用程序引擎(灵活和标准)连接到云 SQL

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.启用服务网络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.具有外部ip的Cloud Sql Instance:

#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 带内部ip的Cloud Sql Instance:

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 实例,我们将使用 Serverless Access 和 TCP 从 App Engine Standard 连接到 database-ipinternal,使用 unix 域套接字从 App Engine Standard 连接到 database-external,使用 TCP 从 App Engine Flex 连接到 database-ipinternal,并使用 unix 域套接字从 App Engine Flex 到数据库外部。

7.启用 Cloud SQL Admin API

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

8.目前 App Engine 标准环境不支持使用 TCP 连接 Cloud SQL 实例。除非您已配置无服务器 VPC 访问,否则您的代码不应尝试使用 IP 地址(例如 127.0.0.1 或 172.17.0.1)访问实例。所以让我们配置无服务器 VPC 访问。

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
#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 客户端,并且为了在内部 IP 上从 App Engine Standard 连接到 Cloud Sql,我们还需要角色 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. 使用 Tcp 和 unix 域套接字从 App Engine Standard 连接到 Cloud Sql

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.使用 Tcp 和 unix 域套接字从 App Engine Flex 连接到 Cloud Sql

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'

成功!

于 2020-02-10T16:54:37.957 回答
0

AppEngine Flex offers two different ways to connect: via unix socket or TCP port. I don't see anything special about connecting to MySQL from Mautic, so make sure you are consistent between your connection settings and your app.yaml.

Connecting via Unix Socket

Your app.yaml should contain the following:

beta_settings:
    cloud_sql_instances: "<CONNECTION_NAME>"

And your connection string will look like this: mysql:dbname=DATABASE;unix_socket=/cloudsql/CONNECTION_NAME

Connecting via TCP port

Your app.yaml should look like this:

beta_settings:
    cloud_sql_instances: "<CONNECTION_NAME>=tcp:3306"

And your connection string will look like this: "mysql:host=127.0.0.1;port=3306;dbname=DATABASE;"

You can find more information and examples in the GAE-Flexible/CloudSQL documentation.

于 2018-07-14T22:37:23.263 回答