sql >> データベース >  >> RDS >> Mysql

AppEngineからCloudSQLMySQLデータベースに接続するにはどうすればよいですか?

    TCPおよびUNIXドメインソケット2020を使用したAPPエンジン(フレックスおよびスタンダード)からクラウド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インスタンスを作成します(1つはinternall ipを使用し、もう1つはpublic ipを使用します)- https://cloud.google.com/sql/docs/mysql/create-instance

    6.外部IPを使用したCloudSQLインスタンス:

    #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内部IPを使用したクラウドSQLインスタンス:

    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
    

    OK、2つのmysqlインスタンスがあるので、サーバーレスアクセスとTCPを使用してApp Engine Standardからdatabase-ipinternalに接続し、unixドメインソケットを使用してApp Engine Standardからdatabase-externalに接続し、TCPを使用してAppEngineFlexからdatabase-ipinternalに接続します。 AppEngineFlexからデータベースへ-unixドメインソケットを使用した外部。

    7. Cloud SQLAdminAPIを有効にします

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

    8.現時点では、AppEngineの標準環境はTCPを使用したCloudSQLインスタンスへの接続をサポートしていません。サーバーレス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は、サービスアカウントを使用して、CloudSQLへの接続を承認します。このサービスアカウントには、正常に接続するための正しいIAM権限が必要です。特に設定がない限り、デフォルトのサービスアカウントの形式は[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。 TcpとUNIXドマニンソケットを使用してAppEngineStandardからCloudSQLに接続します

    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.Tcpとunixdomaninソケットを使用してAppEngineFlexからCloudSqlに接続します

    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. リスト内のすべての項目に一致する行のグループを選択します

    2. mysqlテーブルで欠落している行(日付)を見つける方法は?

    3. SQLServerのメッセージ8116「引数データ型varcharがsession_context関数の引数1に対して無効です」を修正しました

    4. 悪い習慣:SQLServerでのNULLの回避