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 ツールをすでにインストールしており、初期化時に指定した ID とは異なる 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. MySQLdb ライブラリをローカルにインストールして、開発環境でテストを行います。

    • 使用している Linux ディストリビューションで apt-get を使用できる場合には、次のコマンドを実行して MySQLdb をインストールします。
      sudo apt-get install python-mysqldb
    • 他のオペレーティング システムの手順については、SourceForge で MySQLdb のインストール手順をご覧ください。
  6. Cloud SQL インスタンスの接続名、ユーザー、パスワードを app.yaml の環境変数に追加します。
    env_variables:
        CLOUDSQL_CONNECTION_NAME: your-connection-name
        CLOUDSQL_USER: root
        CLOUDSQL_PASSWORD: your-cloudsql-user-password
  7. MySQLdb クライアント ライブラリをアプリケーションの app.yaml に追加します。
    libraries:
    - name: MySQLdb
      version: "latest"
    
    

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. [追加] をクリックします。

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

コードサンプルの概要

以下のコードサンプルでは、App Engine のネイティブ UNIX ソケットを使用して Cloud SQL に接続し、SHOW VARIABLES コマンドを使用して MySQL フラグの値を表示します。

import os

import MySQLdb
import webapp2

# These environment variables are configured in app.yaml.
CLOUDSQL_CONNECTION_NAME = os.environ.get('CLOUDSQL_CONNECTION_NAME')
CLOUDSQL_USER = os.environ.get('CLOUDSQL_USER')
CLOUDSQL_PASSWORD = os.environ.get('CLOUDSQL_PASSWORD')

def connect_to_cloudsql():
    # When deployed to App Engine, the `SERVER_SOFTWARE` environment variable
    # will be set to 'Google App Engine/version'.
    if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
        # Connect using the unix socket located at
        # /cloudsql/cloudsql-connection-name.
        cloudsql_unix_socket = os.path.join(
            '/cloudsql', CLOUDSQL_CONNECTION_NAME)

        db = MySQLdb.connect(
            unix_socket=cloudsql_unix_socket,
            user=CLOUDSQL_USER,
            passwd=CLOUDSQL_PASSWORD)

    # If the unix socket is unavailable, then try to connect using TCP. This
    # will work if you're running a local MySQL server or using the Cloud SQL
    # proxy, for example:
    #
    #   $ cloud_sql_proxy -instances=your-connection-name=tcp:3306
    #
    else:
        db = MySQLdb.connect(
            host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD)

    return db

class MainPage(webapp2.RequestHandler):
    def get(self):
        """Simple request handler that shows all of the MySQL variables."""
        self.response.headers['Content-Type'] = 'text/plain'

        db = connect_to_cloudsql()
        cursor = db.cursor()
        cursor.execute('SHOW VARIABLES')

        for r in cursor.fetchall():
            self.response.write('{}\n'.format(r))

app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=True)

開発環境でのテスト

ローカルの開発用サーバーでアプリをテストするには:

  1. ローカルテスト環境から Cloud SQL に接続するには、ローカルテストにプロキシを使用するためのクイックスタートに記載されている手順を使用して、ローカル Cloud SQL プロキシ クライアントをインストールします。

  2. まだ Cloud SQL Proxy を起動していない場合は、起動します。

    言語や環境に応じて、TCP ソケットまたは Unix ソケットのどちらかを使用してプロキシを開始できます。

    TCP ソケット

    1. [インスタンスの詳細] ページからインスタンス接続名をコピーします。
    2. 新しいターミナル ウィンドウを開き、プロキシを開始します。
      ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
      
      指定されたポートは、ローカル データベース サーバーなどによってまだ使用されていないものである必要があります。
    3. プロキシ オプションの詳細については、プロキシを認証するためのオプションインスタンスを指定するためのオプションをご覧ください。

    Unix ソケット

    1. 明示的なインスタンス指定を使用する場合は、インスタンス接続名を [インスタンスの詳細] ページからコピーします。
    2. プロキシ ソケットを格納するディレクトリを作成します。
      sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
    3. 新しいターミナル ウィンドウを開き、プロキシを開始します。
      • 明示的なインスタンス指定を使用する場合(本番環境で推奨):
        ./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME> &
      • 自動インスタンス検出を使用する場合:
        ./cloud_sql_proxy -dir=/cloudsql &

      専用のターミナルでプロキシを開始することが最善です。この場合、他のプログラムからの出力と混ざることなく出力を監視できます。

      プロキシ オプションの詳細については、プロキシを認証するためのオプションインスタンスを指定するためのオプションをご覧ください。

  3. アプリケーション ディレクトリから開発用サーバーを開始します。

    dev_appserver.py .
  4. ウェブサーバーが起動し、ポート 8080 でリクエストをリッスンします。表示するには、次の URL にアクセスします。

    http://localhost:8080/

問題が発生する場合は、ローカル開発用サーバーの使用で詳細をご確認ください。

アプリのデプロイ

App Engine にアプリをデプロイするには、gcloud app deploy コマンドを実行します。

gcloud app deploy

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

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

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

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

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