Cloud SQL for MySQL の使用

Cloud SQL は、App Engine アプリケーションで使用できる Google のクラウドに存在するリレーショナル データベースを提供します。Cloud SQL の詳細については、Cloud SQL のドキュメントをご覧ください。

Cloud SQL と App Engine の両方で適用される価格設定と制限の詳細については、料金とアクセス制限をご覧ください。

始める前に

  1. GCP Console で GCP プロジェクトを作成または選択します。プロジェクトに App Engine アプリケーションが含まれていることを確認します。
    App Engine に移動

    プロジェクトに App Engine アプリケーションが存在する場合には、ダッシュボードが開きます。存在しない場合には、App Engine アプリケーションを配置するリージョンを選択するように指示されます。

  2. Google Cloud SDK のダウンロード、インストール、初期化を行います。
    SDK をダウンロード

    gcloud ツールがすでにインストールされ、初期化時に指定した ID とは異なる GCP プロジェクト ID を使用する場合には、Cloud SDK 構成の管理をご覧ください。

Cloud SQL インスタンスのセットアップ

  1. Cloud SQL の第 2 世代インスタンスを作成します
  2. 接続にデフォルト管理ユーザーを使用しない場合は、ユーザーを作成します
  3. Cloud SDK を使用して、アプリケーション コード内で接続文字列として使用する Cloud SQL インスタンスの接続名を取得します。
    gcloud sql instances describe [INSTANCE_NAME]
    connectionName に返された値を記録します。この値は Google Cloud Platform Console のインスタンスの詳細ページでも確認できます。たとえば、Cloud SDK の出力は次のようになります。
    gcloud sql instances describe instance1
      connectionName: project1:us-central1:instance1

App Engine へのアクセス付与

App Engine アプリケーションと Cloud SQL インスタンスが異なる Google Cloud Platform プロジェクトにある場合、サービス アカウントを使用して App Engine アプリケーションが Cloud SQL にアクセスできるようにする必要があります。

このサービス アカウントは App Engine アプリケーションを表し、Google Cloud Platform プロジェクトを作成するとデフォルトで作成されます。

  1. App Engine アプリケーションが Cloud SQL インスタンスと同じプロジェクトにある場合、設定に進みます。それ以外の場合は、次のステップに進みます。
  2. App Engine アプリケーションに関連付けられたサービス アカウントを特定します。デフォルトの App Engine サービス アカウント名は [PROJECT-ID]@appspot.gserviceaccount.com です。

    App Engine サービス アカウントは [IAM 権限] ページで確認できます。プロジェクトは Cloud SQL インスタンスではなく、必ず App Engine アプリケーションに対して選択してください。

    [IAM 権限] ページに移動

  3. Google Cloud Platform Console の [IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  4. Cloud SQL インスタンスを含むプロジェクトを選択します。
  5. サービス アカウント名を検索します。
  6. Cloud SQL Client または Editor の役割を持つサービス アカウントがすでにある場合は、設定に進みます。
  7. それ以外の場合、[追加] をクリックしてサービス アカウントを追加します。
  8. [メンバーを追加] ダイアログでサービス アカウントの名前を指定し、その役割の [Cloud SQL] > [Cloud SQL クライアント] を選択します。

    あるいは、[プロジェクト] > [編集者] の順に選択して、編集者の基本的な役割を使用できますが、編集者の役割には Google Cloud Platform 全体の権限が含まれます。

    これらの役割が表示されない場合、Google Cloud Platform ユーザーに resourcemanager.projects.setIamPolicy 権限がない可能性があります。権限を確認するには、Google Cloud Platform Console の [IAM] ページにアクセスし、自分のユーザー ID を検索します。

  9. [追加] をクリックします。

    これで、指定した役割を持つサービス アカウントがリストされます。

設定

app.yaml の環境変数に Cloud SQL インスタンス接続名、データベース名、ユーザー、パスワードを追加します。

env_variables:
  # Replace INSTANCE_CONNECTION_NAME with the value obtained when configuring your
  # Cloud SQL instance, available from the Google Cloud Console or from the Cloud SDK.
  # For Cloud SQL 2nd generation instances, this should be in the form of "project:region:instance".
  CLOUDSQL_CONNECTION_NAME: INSTANCE_CONNECTION_NAME
  # Replace username and password if you aren't using the root user.
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: ''

コードサンプルの概要

次のサンプルは、Cloud SQL インスタンスのデータベースの一覧を表示します。

// Copyright 2016 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.

// Sample cloudsql demonstrates connection to a Cloud SQL instance from App Engine standard.
package main

import (
	"bytes"
	"database/sql"
	"fmt"
	"log"
	"net/http"
	"os"

	"google.golang.org/appengine"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func main() {
	var (
		connectionName = mustGetenv("CLOUDSQL_CONNECTION_NAME")
		user           = mustGetenv("CLOUDSQL_USER")
		password       = os.Getenv("CLOUDSQL_PASSWORD") // NOTE: password may be empty
	)

	var err error
	db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@cloudsql(%s)/", user, password, connectionName))
	if err != nil {
		log.Fatalf("Could not open db: %v", err)
	}

	http.HandleFunc("/", handler)
	appengine.Main()
}

func handler(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}

	w.Header().Set("Content-Type", "text/plain")

	rows, err := db.Query("SHOW DATABASES")
	if err != nil {
		http.Error(w, fmt.Sprintf("Could not query db: %v", err), 500)
		return
	}
	defer rows.Close()

	buf := bytes.NewBufferString("Databases:\n")
	for rows.Next() {
		var dbName string
		if err := rows.Scan(&dbName); err != nil {
			http.Error(w, fmt.Sprintf("Could not scan result: %v", err), 500)
			return
		}
		fmt.Fprintf(buf, "- %s\n", dbName)
	}
	w.Write(buf.Bytes())
}

func mustGetenv(k string) string {
	v := os.Getenv(k)
	if v == "" {
		log.Panicf("%s environment variable not set.", k)
	}
	return v
}

アプリのデプロイ

アプリケーションを App Engine にアップロードするには:

gcloud app deploy コマンドを実行します。

gcloud app deploy

App Engine へのデプロイ方法については、Go アプリをデプロイするをご覧ください。

設定は以上です。ブラウザを起動して http://[YOUR_PROJECT_ID].appspot.com でアプリを表示するには、次のコマンドを実行します。

gcloud app browse

フィードバックを送信...

App Engine standard environment for Go