ローカル環境からCloud SQL(MySQL)への接続


Cloud SQLの作成

インスタンスの作成

詳細オプションでは、「ストレージの自動増量を有効化」と「バックアップを自動化する」のチェックを外します。

ユーザーの作成

データベースの作成

テーブルの作成

画面下部にCloud Shellの画面が表示されます。
以下のコマンドを入力します。

gcloud sql connect [インスタンス名] --user=[ユーザー名]

接続が完了すると、以下のパスワード入力画面が表示されます。

パスワードを入力し、接続が完了すると、以下の画面が表示されます。

利用するデータベースを切り替えます。

use mydb

テスト用のテーブルとデータを作成します。

CREATE TABLE users (ID INT NOT NULL AUTO_INCREMENT, Name VARCHAR(255) NOT NULL, date DATETIME, PRIMARY KEY(ID));
INSERT INTO users (Name, date) values ('鈴木', '2020-02-03 12:00:00');
INSERT INTO users (Name, date) values ('田中', '2017-02-03 13:00:00');

サービスアカウント作成

[IAMと管理]-[サービスアカウント]を選択し、サービスアカウントを作成します。

権限は、以下の通りです。
・Cloud SQL クライアント
・Cloud SQL 編集者

キーを作成します。
キーのタイプが[JSON]になっていることを確認してください。

ローカル環境の作成

環境変数の設定

GOOGLE_APPLICATION_CREDENTIALS環境変数には、作成したサービスアカウントの秘密鍵へのパスを設定します。

export GOOGLE_APPLICATION_CREDENTIALS=xxxxx.json

ソース

main.go
package main

import (
    "log"
    "fmt"
    "time"
    cloudsqlproxy "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/mysql"
    "github.com/go-sql-driver/mysql"
)

func main() {
    if err := showRecords("インスタンス名", "データベース", "ユーザ名", "パスワード"); err != nil {
        log.Fatal(err)
    }
}

func showRecords(dbAddress, dbName, dbUser, dbPassword string) error {
    // 接続するだけなら以下のコードになります。
    // db, err := cloudsqlproxy.DialPassword(dbAddress, dbUser, dbPassword)

    // 詳細に設定したい場合は以下のコードになります。
    db, err := cloudsqlproxy.DialCfg(&mysql.Config{
        Addr:      dbAddress,  // インスタンス接続名
        DBName:    dbName,     // データベース名
        User:      dbUser,     // ユーザ名
        Passwd:    dbPassword, // ユーザパスワード
        Net:       "cloudsql", // Cloud SQL Proxy で接続する場合は cloudsql 固定です
        ParseTime: true,       // DATE/DATETIME 型を time.Time へパースする
        TLSConfig: "",         // TLSConfig は空文字を設定しなければなりません
        AllowNativePasswords: true, // <- これがないと、「this user requires mysql native password authentication」エラー
    })
    if err != nil {
        return err
    }
    defer db.Close()

    rows, err := db.Query("SELECT * FROM users")
    if err != nil {
        return err
    }
    defer rows.Close()

    for rows.Next() {
        var Name string
        var date time.Time
        var ID int64
        if err := rows.Scan(&ID, &Name, &date); err != nil {
            return err
        }
        fmt.Printf("%d\t%s\t%s\n", ID, Name, date.Format(time.RFC3339))
    }

    return nil
}

 インスタンス名

インスタンス名は、以下の[インスタンス接続名]を設定します。

参考

Cloud SQL Proxy を Golang のパッケージとして使用する
golang mysql driverで `this user requires mysql native password authentication.
GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法