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. PHP の依存関係の管理用ツールである Composer をインストールします。
  6. Composer を使用して依存関係をインストールします。
    composer install
  7. Cloud SQL インスタンスの接続名、ユーザー、パスワードを app.yaml の環境変数に追加します。
    env_variables:
      # Replace USER, PASSWORD, DATABASE, and CONNECTION_NAME with the
      # values obtained when configuring your Cloud SQL instance.
      MYSQL_DSN: mysql:unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME;dbname=DATABASE
      MYSQL_USER: USER
      MYSQL_PASSWORD: PASSWORD

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 のゲストブックのエントリを読み込んで表示します。クリックしてゲストブックに署名すると、アプリケーションでエントリが追加され、その結果が Cloud SQL に書き戻されます。

use Silex\Application;
use Silex\Provider\TwigServiceProvider;
use Symfony\Component\HttpFoundation\Request;

// create the Silex application
$app = new Application();
$app->register(new TwigServiceProvider());
$app['twig.path'] = [ __DIR__ ];

$app->get('/', function () use ($app) {
    /** @var PDO $db */
    $db = $app['database'];
    /** @var Twig_Environment $twig */
    $twig = $app['twig'];

    // Show existing guestbook entries.
    $results = $db->query('SELECT * from entries');

    return $twig->render('cloudsql.html.twig', [
        'results' => $results,
    ]);
});

$app->post('/', function (Request $request) use ($app) {
    /** @var PDO $db */
    $db = $app['database'];

    $name = $request->request->get('name');
    $content = $request->request->get('content');

    if ($name && $content) {
        $stmt = $db->prepare('INSERT INTO entries (guestName, content) VALUES (:name, :content)');
        $stmt->execute([
            ':name' => $name,
            ':content' => $content,
        ]);
    }

    return $app->redirect('/');
});

// function to return the PDO instance
$app['database'] = function () use ($app) {
    // Connect to CloudSQL from App Engine.
    $dsn = getenv('MYSQL_DSN');
    $user = getenv('MYSQL_USER');
    $password = getenv('MYSQL_PASSWORD');
    if (!isset($dsn, $user) || false === $password) {
        throw new Exception('Set MYSQL_DSN, MYSQL_USER, and MYSQL_PASSWORD environment variables');
    }

    $db = new PDO($dsn, $user, $password);

    return $db;
};
<html>
    <body>
        {% if results %}
            <h2>Guestbook Entries</h2>

            {% for row in results %}
                <div><strong> {{ row.guestName }} </strong> wrote <br> {{ row.content }}</div>
            {% endfor %}
        {% endif %}

        <h2>Sign the Guestbook</h2>
        <form action="/" method="post">
            <div>Name: <input name="name" /></div>
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
        </form>
    </body>
</html>

このサンプルを使用する場合は、次の手順に従ってアプリケーションをテストし、デプロイします。アプリケーションの実行後、/create_tables に移動して必要なテーブルを作成します。

開発環境でのテスト

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

  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 にデプロイする方法については、PHP アプリのデプロイをご覧ください。

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

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

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

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