App Engine からの接続

ここでは、App Engine アプリケーションから Cloud SQL インスタンスに接続する方法を説明し、いくつかの例を紹介します。

Cloud SQL と App Engine の設定

Cloud SQL インスタンスまたは App Engine アプリケーションを設定する方法の詳細については、次の手順をご覧ください。

  • Cloud SQL インスタンスの接続名を識別する。これは、インスタンスごとに固有の文字列です。形式は <PROJECT_ID>:<REGION>:<INSTANCE_ID> となっています。接続名は、お使いのインスタンスの [インスタンスの詳細] ページに表示される [インスタンス接続名] で確認できます。gcloud sql instances describe <INSTANCE_ID> コマンドを使用する場合は、connectionName に示されます。

  • Cloud SQL インスタンスを含むプロジェクトで Cloud SQL Admin API が有効になっていることを確認する。

    APIを有効にする

パフォーマンスとレスポンス時間を最適化するには、アプリケーションで接続プールを使用する必要があります。接続プールの具体例については、データベース接続を管理するをご覧ください。

App Engine スタンダード環境を Cloud SQL に接続する

App Engine スタンダード環境には、Cloud SQL インスタンスに接続するための Unix ドメイン ソケットが用意されています。このソケットによる接続は、App Engine のデフォルト サービス アカウントを使用して自動的に承認されます。

このソケットは /cloudsql/INSTANCE_CONNECTION_NAME にあり、アプリケーションで直接使用できます。使用例については、以下をご覧ください。

PostgreSQL では、.s.PGSQL.5432 接尾辞をソケットパスに追加しなければならない場合があります。一部のコネクタ ライブラリでは接尾辞が自動的に適用されますが、それ以外のコネクタ ライブラリではソケットパスを次のように指定する必要があります。 /cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432

Python

# The SQLAlchemy engine will help manage interactions, including automatically
# managing a pool of connections to your database
db = sqlalchemy.create_engine(
    # Equivalent URL:
    # postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<cloud_sql_instance_name>
    sqlalchemy.engine.url.URL(
        drivername='postgres+pg8000',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_sock': '/cloudsql/{}'.format(cloud_sql_connection_name)
        }
    ),
    # ... Specify additional properties here.
    # ...
)
上記のスニペットをアプリケーションのコンテキストで確認するには、こちらでプロジェクト全体をご覧ください。

Java

// The configuration object specifies behaviors for the connection pool.
HikariConfig config = new HikariConfig();

// Configure which instance and what database user to connect with.
config.setJdbcUrl(String.format("jdbc:postgresql:///%s", DB_NAME));
config.setUsername(DB_USER); // e.g. "root", "postgres"
config.setPassword(DB_PASS); // e.g. "my-password"

// For Java users, the Cloud SQL JDBC Socket Factory can provide authenticated connections.
// See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details.
config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);

// ... Specify additional connection properties here.

// ...

// Initialize the connection pool using the configuration object.
DataSource pool = new HikariDataSource(config);
上記のスニペットをアプリケーションのコンテキストで確認するには、こちらでプロジェクト全体をご覧ください。

Node.js

// Initialize Knex, a Node.js SQL query builder library with built-in connection pooling.
const knex = connect();

function connect() {
  // Configure which instance and what database user to connect with.
  // Remember - storing secrets in plaintext is potentially unsafe. Consider using
  // something like https://cloud.google.com/kms/ to help keep secrets secret.
  const config = {
    user: process.env.DB_USER, // e.g. 'my-user'
    password: process.env.DB_PASS, // e.g. 'my-user-password'
    database: process.env.DB_NAME, // e.g. 'my-database'
  };

  config.host = `/cloudsql/${process.env.CLOUD_SQL_CONNECTION_NAME}`;

  // Establish a connection to the database
  const knex = Knex({
    client: 'pg',
    connection: config,
  });

  // ... Specify additional properties here.
  // ...
  return knex;
上記のスニペットをアプリケーションのコンテキストで確認するには、こちらでプロジェクト全体をご覧ください。

App Engine フレキシブル環境を Cloud SQL に接続する

App Engine フレキシブル環境では、Unix ドメイン ソケットと TCP 接続のいずれかを使用した、Cloud SQL インスタンスへのセキュアな接続が可能です。

Unix ドメイン ソケット

用意されている Unix ソケットを有効にするには、プロジェクトの app.yaml に次のコードを追加します。
beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME> 
これにより、アプリケーションは /cloudsql/<INSTANCE_CONNECTION_NAME> にある Unix ソケットを使用して Cloud SQL インスタンスに接続できるようになります。
複数の Cloud SQL インスタンスに接続する場合は、インスタンス接続名のカンマ区切りのリストを使用します。リストに記載された各インスタンスに、そのインスタンス接続名から派生した個別のソケットが作成されます。

TCP 接続

指定されている TCP ポートを有効にするには、プロジェクトの app.yaml に次のコードを追加します。
beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME>=tcp:<TCP_PORT>
これにより、アプリケーションは 127.0.0.1:<TCP_PORT> でリッスンする TCP ポート使用して Cloud SQL インスタンスに接続できます。
複数の Cloud SQL インスタンスに接続する場合は、インスタンス接続名のカンマ区切りのリストを使用します。インスタンスごとに別のローカルポートを使用する必要があります。

追加情報

異なるプロジェクトに属する App Engine と Cloud SQL

App Engine アプリケーションと Cloud SQL インスタンスがそれぞれ異なるプロジェクトに属する場合、App Engine のデフォルト サービス アカウント([PROJECT-ID]@appspot.gserviceaccount.com)に次のいずれかの IAM 役割を付与する必要があります。

  • Cloud SQL Client
  • Cloud SQL Editor
  • Cloud SQL Admin

サービス アカウントに IAM 役割を追加する方法の詳細については、サービス アカウントへの役割の付与をご覧ください。

おすすめの方法

App Engine から Cloud SQL に接続するときは、以下のおすすめの方法を念頭においてください。

  • App Engine には、負荷が増加したときに自動的にインスタンスを作成する機能があります。App Engine インスタンスの数が Cloud SQL インスタンスで処理可能なサイズを超えて増加した場合、Cloud SQL インスタンスは要求を満たすことができなくなります。この問題を回避するには、App Engine インスタンス数の上限を設定します。詳細については、要素のスケーリングをご覧ください。

  • データベース接続はリソースを消費します。アプリケーションでは接続の管理のおすすめの方法を適用して、必要な接続数を減らしてください。App Engine スタンダード環境では、App Engine インスタンスが Cloud SQL に対して開ける接続数にハードリミットが適用されます。

次のステップ

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

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