App Engine から Cloud SQL に接続する

このページには、App Engine で実行されているサービスから Cloud SQL インスタンスに接続するための情報と例が含まれています。

Cloud SQL は、クラウド上の PostgreSQL と MySQL のリレーショナル データベースを簡単に設定、維持、運用、管理できるようにするフルマネージド データベース サービスです。

App Engine は、大規模なウェブ アプリケーションを開発およびホスティングするための、フルマネージド型のサーバーレス プラットフォームです。アプリの開発では複数の一般的な言語、ライブラリ、フレームワークからの選択が可能で、開発したアプリのインスタンスのサーバー プロビジョニングとスケーリングは App Engine によってオンデマンドで行われます。

Cloud SQL インスタンスを設定する

  1. Cloud SQL for PostgreSQL のインスタンスを作成します

  2. [インスタンスの詳細] ページで、インスタンスの INSTANCE_CONNECTION_NAME を見つけます。これは、PROJECT_ID:REGION:INSTANCE_ID の形式で、接続先の Cloud SQL インスタンスを識別するために使用されます。

  3. まだ Cloud SQL Admin API を有効にしていない場合は有効にします。

    を有効にする

App Engine を構成する

スタンダード

App Engine では、使用するサービス アカウントに正しいアクセス許可が設定されていること以外に、特別な構成は必要ありません。

フレキシブル

最適に機能するオプションを使用して、プロジェクトの app.yaml ファイルを更新します。インスタンスのカンマ区切りのリストを使用すると、複数のオプションを一度に指定できます。

Unix ドメイン ソケットの有効化

Unix ドメイン ソケットを有効にするには、プロジェクトの app.yaml ファイルに次の行を追加します。

beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME>

TCP ポートの有効化

ローカル TCP ポートを有効にするには、プロジェクトの app.yaml ファイルに次の行を追加します。

beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME>=tcp:<PORT>

App Engine はサービス アカウントを使用して Cloud SQL への接続を承認します。正常に接続するためには、このサービス アカウントに適切な IAM 権限が必要です。特に指定しない限り、デフォルトのサービス アカウントの形式は service-PROJECT_ID@gae-api-prod.google.com.iam.gserviceaccount.com になります。

2 つの異なるプロジェクトでリソースを接続する場合は、両方のプロジェクトで、正しい IAM 役割を有効にし、サービス アカウントに正しい権限を付与していることを確認します。

サービスのサービス アカウントが次のいずれかの IAM 役割を持つことを確認します。

  • Cloud SQL Client(推奨)
  • Cloud SQL Editor
  • Cloud SQL Admin

または、次の IAM 権限を手動で割り当てることもできます。

  • cloudsql.instances.connect
  • cloudsql.instances.get

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

Cloud SQL への接続

正しく構成されたら、/cloudsql/INSTANCE_CONNECTION_NAME にある Unix ドメイン ソケットを使用して、サービスを Cloud SQL インスタンスに接続できます。これらの接続は、追加の構成なしで自動的に暗号化されます。

App Engine フレキシブル環境は、TCP 経由の接続もサポートしています。TCP ポートを使用してインスタンスを構成した場合、代わりに 172.17.0.1:PORT に接続するようにアプリケーションを構成します。

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_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432
    sqlalchemy.engine.url.URL(
        drivername='postgres+pg8000',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_sock': '/cloudsql/{}/.s.PGSQL.5432'.format(
                cloud_sql_connection_name)
        }
    ),
    # ... Specify additional properties here.
    # ...
)
このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub にあるソースコードを表示してください。

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);
このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub にあるソースコードを表示してください。

C#

var connectionString = new NpgsqlConnectionStringBuilder(
    Configuration["CloudSql:ConnectionString"])
// ConnectionString set in appsetings.json formatted as:
// "Uid=aspnetuser;Pwd=;Host=cloudsql;Database=votes"
{
    // Connecting to a local proxy that does not support ssl.
    SslMode = SslMode.Disable
};
connectionString.Pooling = true;
// ...
NpgsqlConnection connection =
    new NpgsqlConnection(connectionString.ConnectionString);
このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub にあるソースコードを表示してください。

ベスト プラクティスとその他の情報

アプリケーションをローカルでテストする場合、Cloud SQL プロキシを使用できます。詳細については、ローカルテストにプロキシを使用する場合のクイックスタートを参照してください。

接続プール

データベース サーバー自体、または基盤となるインフラストラクチャによって、基盤となるデータベースへの接続が切断される可能性があります。これを軽減するには、接続プールと自動再接続をサポートするクライアント ライブラリを使用することをおすすめします。

接続プールの使用方法の詳しい例については、データベース接続を管理するをご覧ください。

接続上限

Cloud SQL では、同時接続の上限が設定されています。これらの上限は、選択したデータベース エンジンによって異なります。詳しくは、Cloud SQL の割り当てと上限をご覧ください。

App Engine には負荷の増加に応じて自動的にインスタンスを作成する機能があるため、これらの上限を超える可能性があります。この問題を回避するには、App Engine インスタンスの上限を設定します。詳しくは、要素のスケーリングをご覧ください。

インスタンスごとの最大接続数は、接続プールを使用して制限できます。接続の数を制限する使用例の詳細については、データベース接続を管理するのページをご覧ください。