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. Cloud SDK のダウンロード、インストール、初期化を行います。

    SDK をダウンロード

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

Cloud SQL インスタンスの設定

  1. Cloud SQL の第 2 世代インスタンスを作成します
  2. Cloud SQL インスタンスのデフォルト ユーザーのパスワードをまだ設定していない場合は、ここで設定します。
    gcloud sql users set-password root % --instance [INSTANCE_NAME] --password [PASSWORD]
  3. 接続にデフォルトのユーザーを使用しない場合は、ユーザーを作成します。
  4. 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
  5. 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 と 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. サービス アカウントがすでに存在し、cloudsql.instances.connect 権限を含む役割が割り当てられている場合は、設定に進みます。

    Cloud SQL ClientCloud SQL EditorCloud SQL Admin の役割はすべて、従来の EditorOwner のプロジェクト役割と同様に、必要な権限を提供します。

  7. それ以外の場合、[追加] をクリックしてサービス アカウントを追加します。
  8. [メンバーの追加] ダイアログで、サービス アカウントの名前を指定し、cloudsql.instances.connect 権限を含む役割を選択します(Cloud SQL の事前定義された役割のうち、閲覧者以外の役割はこの条件に当てはまります)。

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

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

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

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

コードサンプルの概要

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

// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// 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 1.9 アプリのデプロイをご覧ください。

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

gcloud app browse
このページは役立ちましたか?評価をお願いいたします。

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

Go の App Engine スタンダード環境