Как подключиться к базе данных MySQL Cloud SQL из App Engine?

В настоящее время я устанавливаю маркетинговое программное обеспечение с открытым исходным кодом под названием Mautic в гибкой среде App Engine. Однако у меня возникают проблемы с подключением App Engine к базе данных MySQL Cloud SQL с помощью MySQLi. Mautic - это PHP-приложение, построенное на базе Symfony. Я попытался использовать / cloudsql / <instance_connection_name> в качестве хоста, но это не сработало. Кто-нибудь имеет опыт развертывания Mautic на App Engine или знает, как решить эту проблему?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
5 358
2

Ответы 2

AppEngine Flex предлагает два разных способа подключения: через сокет unix или через TCP-порт. Я не вижу ничего особенного в подключении к MySQL из Mautic, поэтому убедитесь, что вы согласованы между настройками подключения и вашим app.yaml.

Подключение через Unix Socket

Ваш app.yaml должен содержать следующее:

beta_settings:
    cloud_sql_instances: "<CONNECTION_NAME>"

И ваша строка подключения будет выглядеть так: mysql:dbname=DATABASE;unix_socket=/cloudsql/CONNECTION_NAME

Подключение через порт TCP

Ваш app.yaml должен выглядеть так:

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

И ваша строка подключения будет выглядеть так: "mysql:host=127.0.0.1;port=3306;dbname=DATABASE;"

Вы можете найти дополнительную информацию и примеры в Документация по GAE-Flexible / CloudSQL.

ПОДКЛЮЧЕНИЕ ИЗ ПРИЛОЖЕНИЯ (ГИБКИЙ И СТАНДАРТНЫЙ) К ОБЛАЧНОМУ 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. экземпляр 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 к базе данных ipinternal с использованием бессерверного доступа и TCP, от стандарта App Engine к внешней базе данных с использованием сокета домена 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 не поддерживают подключение к экземпляру Cloud 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 для успешного подключения. Если не указано иное, учетная запись службы по умолчанию имеет формат 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:[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: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 к Cloud Sql с помощью Tcp и unix domanin socket

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'

УСПЕХ!

Другие вопросы по теме