これは何?
Google Cloud PlatformのAppengineからCloudSQLへの接続方法のメモ。
※この記事で作成したインスタンス等はすでに削除済みなのでアクセスできません。
環境
- Appengineスタンダード環境
- Python3.7
- CloudSQL 第2世代MySQL
手順
CloudSQL
$ 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