Help us understand the problem. What is going on with this article?

GAEスタンダード環境からCloudSQLへの接続

これは何?

Google Cloud PlatformのAppengineからCloudSQLへの接続方法のメモ。
※この記事で作成したインスタンス等はすでに削除済みなのでアクセスできません。

環境

  • Appengineスタンダード環境
  • Python3.7
  • CloudSQL 第2世代MySQL

手順

CloudSQL

  • GCPのコンソールからインスタンスを作成する。
    スクリーンショット 2019-09-13 23.41.04.png

  • 作成するエンジンはMySQLを選択する。
    スクリーンショット 2019-09-13 23.42.08.png

  • 以下の内容で作成する。
    スクリーンショット 2019-09-13 23.46.02.png
    作成まで数分かかる。

  • 完了したらデータベースを作成する。
    スクリーンショット 2019-09-13 23.52.10.png

  • Cloud Shellを使用して接続する。
    スクリーンショット 2019-09-13 23.54.29.png

$ gcloud sql connect gcp-tutorial --user=root
Whitelisting your IP for incoming connection for 5 minutes...⠛
Connecting to database with SQL user [root].Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 59
Server version: 5.7.14-google-log (Google)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  • テーブルを作成する。
> USE gcp_tutorial_db;
Database changed
> CREATE TABLE entries (guestName VARCHAR(255), content VARCHAR(255),
entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID));
Query OK, 0 rows affected (0.06 sec)
  • レコードを追加する。
> INSERT INTO entries (guestName, content) values ("first guest", "I got here!");
Query OK, 1 row affected (0.04 sec)
> INSERT INTO entries (guestName, content) values ("second guest", "Me too!");
Query OK, 1 row affected (0.04 sec)
  • 追加されたか確認する。
> SELECT * FROM entries;
+--------------+-------------+---------+
| guestName    | content     | entryID |
+--------------+-------------+---------+
| first guest  | I got here! |       1 |
| second guest | Me too!     |       2 |
+--------------+-------------+---------+
2 rows in set (0.04 sec)

※実運用する場合はroot以外の接続用ユーザーを作成する。

Appengine

2つのフォルダと空ファイルを作成する。
static/index.html
templates/index.html

ファイルを作成する。

app.yaml
runtime: python37

entrypoint: gunicorn --bind 0.0.0.0:$PORT -c gunicorn_conf.py main:app

handlers:
- url: /.*
  script: auto
  secure: always

env_variables:
  CLOUD_SQL_CONNECTION_NAME: <プロジェクトID>:asia-northeast1:gcp-tutorial
  DB_USER: root
  DB_PASS: <パスワード>
  DB_NAME: gcp_tutorial_db
gunicorn_conf.py
worker_class = 'uvicorn.workers.UvicornWorker'
main.py
import responder
import datetime
import os
import sqlalchemy

db_user = os.environ.get("DB_USER")
db_pass = os.environ.get("DB_PASS")
db_name = os.environ.get("DB_NAME")
cloud_sql_connection_name = os.environ.get("CLOUD_SQL_CONNECTION_NAME")

app = responder.API()

db = sqlalchemy.create_engine(
    sqlalchemy.engine.url.URL(
        drivername='mysql+pymysql',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_socket': '/cloudsql/{}'.format(cloud_sql_connection_name)
        }
    )
)

@app.route("/")
async def index(req, resp):
    with db.connect() as conn:
        results = []

        entries = conn.execute(
            "SELECT guestName, content FROM entries"
        ).fetchall()

        for entry in entries:
            results.append({
                'guestName': entry[0],
                'content': entry[1]
            })

    resp.media = results
requirements.txt
responder
gunicorn
uvicorn
SQLAlchemy==1.2.17
PyMySQL==0.9.3

デプロイする。

$ gcloud app deploy

結果をブラウザで確認する。

$ gcloud app browse

スクリーンショット 2019-09-14 0.37.13.png

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away