Cloud SQL の使用

このページでは、App Engine アプリケーションから Cloud SQL for MySQL 第 2 世代インスタンスに接続する方法を説明します。また、Cloud SQL で読み取りや書き込みを行う方法も説明します。Cloud SQL は Google のクラウドで使われている SQL データベースの 1 つです。

Cloud SQL の詳細については、Cloud SQL のドキュメントをご覧ください。Cloud SQL の料金と上限については、Cloud SQL の料金ページをご覧ください。App Engine アプリケーションには、App Engine の割り当ても適用されます。

始める前に

  1. GCP Console で GCP プロジェクトを作成または選択します。そのプロジェクトに App Engine アプリケーションが含まれていること、そして課金が有効になっていることを確認してください。
    App Engine に移動

    プロジェクトに App Engine アプリケーションがすでに存在し、課金が有効な場合、ダッシュボードが開きます。それ以外の場合には、プロンプトに従ってリージョンを選択し、課金を有効にします。

  2. Cloud SQL API を有効にします。

    APIを有効にする

  3. gcloud ツールを使用してアプリをデプロイする場合は、Cloud SDK をダウンロードしてインストールし、初期化する必要があります。
    SDK をダウンロード

Cloud SQL インスタンスの構成

Cloud SQL インスタンスを作成して構成するには:

  1. Cloud SQL 第 2 世代インスタンスを作成します。
  2. Cloud SQL インスタンスのデフォルト ユーザーのパスワードをまだ設定していない場合は、ここで設定します。
    gcloud sql users set-password root --host=% --instance [INSTANCE_NAME] --password [PASSWORD]
    
  3. 接続にデフォルトのユーザーを使用しない場合は、ユーザーを作成します。
  4. インスタンスの接続名を記録します。
    gcloud sql instances describe [INSTANCE_NAME]
    

    次に例を示します。

    connectionName: project1:us-central1:instance1
    

    この値は Google Cloud Platform Console の [インスタンスの詳細] ページでも確認できます。

  5. Cloud SQL インスタンスにデータベースを作成します。
    gcloud sql databases create [DATABASE_NAME] --instance=[INSTANCE_NAME]
    
    データベースの作成と管理の詳細については、Cloud SQL のドキュメントをご覧ください。

ローカル環境の設定

デプロイされたアプリケーションは、App Engine ランタイム環境に組み込まれている Cloud SQL Proxy を使用して Cloud SQL インスタンスと通信します。ただし、アプリケーションをローカルでテストするには、Cloud SQL Proxy のローカルコピーを開発環境にインストールして使用する必要があります。

Cloud SQL インスタンスに対する基本的な管理タスクを実行するには、データベースの管理クライアントまたは GCP Console を使用できます。

  1. プロキシを使用してローカルマシンから接続できるように gcloud ツールを認証します。

    gcloud auth application-default login
    
  2. Cloud SQL Proxy をインストールします。

    Linux 64 ビット

    1. プロキシをダウンロードします。
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
      
    2. プロキシを実行できるようにします。
      chmod +x cloud_sql_proxy
      

    Linux 32 ビット

    1. プロキシをダウンロードします。
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
      
    2. プロキシを実行できるようにします。
      chmod +x cloud_sql_proxy
      

    macOS 64 ビット

    1. プロキシをダウンロードします。
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
      
    2. プロキシを実行できるようにします。
      chmod +x cloud_sql_proxy
      

    macOS 32 ビット

    1. プロキシをダウンロードします。
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
      
    2. プロキシを実行できるようにします。
      chmod +x cloud_sql_proxy
      

    Windows 64 ビット

    https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイルの名前を cloud_sql_proxy.exe に変更します。

    Windows 32 ビット

    https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイルの名前を cloud_sql_proxy.exe に変更します。
    お使いのオペレーティング システムがここに記載されていない場合は、ソースからプロキシをコンパイルすることもできます。
  3. プロキシを実行します。

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

    TCP ソケット

    1. [インスタンスの詳細] ページからインスタンス接続名をコピーします。

      例: myproject:us-central1:myinstance

    2. サービス アカウントを使用してプロキシを認証する場合は、サービス アカウントを作成したときに作成された秘密鍵ファイルのクライアント マシン上での場所を記録しておきます。
    3. プロキシを開始します。

      考えられるプロキシ呼び出し文字列を以下にいくつか示します。

      • Cloud SDK 認証を使用する場合
        ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
        
        指定されたポートは、ローカル データベース サーバーなどがまだ使用していないものにする必要があります。
      • サービス アカウントと明示的なインスタンス指定を使用する場合(本番環境で推奨)
        ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306 \
                          -credential_file=<PATH_TO_KEY_FILE> &
        

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

    Unix ソケット

    1. 明示的なインスタンス指定を使用する場合は、[インスタンスの詳細] ページからインスタンス接続名をコピーします。
    2. プロキシ ソケットを格納するディレクトリを作成します。
      sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
    3. サービス アカウントを使用してプロキシを認証する場合は、サービス アカウントを作成したときに作成された秘密鍵ファイルのクライアント マシン上での場所を記録しておきます。
    4. 新しいターミナル ウィンドウを開き、プロキシを開始します。

      考えられるプロキシ呼び出し文字列を以下にいくつか示します。

      • サービス アカウントと明示的なインスタンス指定を使用する場合(本番環境で推奨)
        ./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME> \
                          -credential_file=<PATH_TO_KEY_FILE> &
      • Cloud SDK 認証と自動インスタンス検出を使用する場合
        ./cloud_sql_proxy -dir=/cloudsql &

      専用のターミナルでプロキシを開始することを強くおすすめします。こうすることで他のプログラムからの出力と混ざることなく出力をモニタリングできます。

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

  4. 管理クライアントを使用するには、ローカルコピーをインストールし、プロキシまたは IP アドレスのいずれかで接続します。

    詳細については、Cloud SQL Proxy を使用して MySQL クライアントを接続するIP アドレスを使用して MySQL クライアントを接続するをご覧ください。

接続文字列の設定とライブラリの追加

  1. ローカルテストの接続用にローカル環境を設定します。

    コードサンプルの例:

    export MYSQL_USER=[YOUR_USER]
    export MYSQL_PASSWORD=[YOUR_PASSWORD]
    export MYSQL_DATABASE=[YOUR_DATABASE]
    export MYSQL_SOCKET_PATH=/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]
    
  2. アプリのデプロイ時にアプリが Cloud SQL インスタンスに接続できるようにするには、Cloud SQL のユーザー、パスワード、データベース、インスタンス接続名の各変数を、app.yaml ファイル内の関連する環境変数に追加します。

    env_variables:
      MYSQL_USER: [YOUR_USER]
      MYSQL_PASSWORD: [YOUR_PASSWORD]
      MYSQL_DATABASE: [YOUR_DATABASE]
      MYSQL_SOCKET_PATH: /cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]

  3. Cloud SQL インスタンス接続名を使用して、beta_settings セクションを app.yaml に追加します。

    beta_settings:
      cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]
  4. Ruby MySQL クライアント ライブラリをアプリケーションの Gemfile に追加します。たとえば、次のサンプルコードでは、Sequel とドライバとして Mysql2 を使用しています。

    source "https://rubygems.org"
    
    gem "mysql2"
    gem "sequel"
  5. アプリケーションの依存関係をインストールします。

    bundle install
    

    Bundler について詳しくは、Ruby ライブラリの使用方法をご覧ください。

サンプルコードの実行

次の app.rb サンプルでは、Sinatra フレームワークを使用して、訪問者用のログを Cloud SQL インスタンスに作成します。また、接続プールとクエリの処理に Sequel も使用します。

サンプルを実行する前に、必要なテーブルを作成し、データベースが正しく設定されていることを確認してください。

bundle exec ruby create_tables.rb
次のサンプルは、訪問情報を Cloud SQL に書き込んでから、最新の 10 件の訪問を読み取って返します。
require "digest/sha2"
require "sinatra"
require "sequel"

DB = Sequel.mysql2 user:     ENV["MYSQL_USER"],
                   password: ENV["MYSQL_PASSWORD"],
                   database: ENV["MYSQL_DATABASE"],
                   socket:   ENV["MYSQL_SOCKET_PATH"]

get "/" do
  # Store a hash of the visitor's ip address
  visitor_ip = Digest::SHA256.hexdigest request.ip

  # Save visit in database
  DB[:visits].insert user_ip: visitor_ip, timestamp: Time.now

  # Retrieve the latest 10 visit records from the database
  visits = DB[:visits].limit(10).order Sequel.desc(:timestamp)

  response.write "Last 10 visits:\n"

  visits.each do |visit|
    response.write "Time: #{visit[:timestamp]} Addr: #{visit[:user_ip]}\n"
  end

  content_type "text/plain"
  status 200
end

テストとデプロイ

  1. アプリケーションをローカルでテストするには、次のコマンドを実行します。

    bundle exec ruby app.rb
    
  2. ローカルテストの後、App Engine にアプリをデプロイします。

    gcloud app deploy
    

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

    gcloud app browse
    

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

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

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

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

Ruby の App Engine フレキシブル環境に関するドキュメント