Cloud Run から Cloud SQL に接続する(フルマネージド)

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

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

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

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

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

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

    APIを有効にする

Cloud Run を構成する(フルマネージド)

Console

  1. Cloud Run に移動します

  2. デプロイする新しいサービスに Cloud SQL 接続を追加する場合は、[サービスを作成] をクリックします。既存のサービスに Cloud SQL 接続を追加する場合は、サービスをクリックし、[新しいバージョンをデプロイ] をクリックします。

  3. [オプションの設定を表示] をクリックします。

    Cloud SQL 接続を追加する

    • プロジェクト内の Cloud SQL インスタンスへの接続を追加する場合は、プルダウン メニューから目的の Cloud SQL インスタンスを選択します。
    • 他のプロジェクトから Cloud SQL インスタンスを使用する場合は、プルダウンの [custom connection string] を選択し、PROJECT-ID:REGION:INSTANCE-ID という形式で完全なインスタンス接続名を入力します。

    • 接続を削除する場合は、接続の右側にカーソルを置いてゴミ箱のアイコンを表示し、クリックします。

  4. [作成] または [デプロイ] をクリックします。

コマンドライン

後述のコマンドを使用する前に、次のように置き換えます。

  • IMAGE をデプロイ対象のイメージに置き換えます。
  • SERVICE を実際の Cloud Run サービスの名前に置き換えます。
  • INSTANCE-CONNECTION-NAME を実際の Cloud SQL インスタンスのインスタンス接続名か、接続名のカンマ区切りリストに置き換えます。

新しいコンテナをデプロイする場合は、次のコマンドを使用します。

gcloud run deploy --image IMAGE --add-cloudsql-instances INSTANCE-CONNECTION-NAME --set-env-vars INSTANCE-CONNECTION-NAME="INSTANCE-CONNECTION-NAME"

既存のサービスを更新する場合は、次のコマンドを使用します。

gcloud run services update SERVICE --add-cloudsql-instances INSTANCE-CONNECTION-NAME --set-env-vars INSTANCE-CONNECTION-NAME="INSTANCE-CONNECTION-NAME"

Cloud Run(フルマネージド)は、サービス アカウントを使用して Cloud SQL への接続を承認します。正常に接続するためには、このサービス アカウントに適切な IAM 権限が必要です。特に指定しない限り、デフォルトのサービス アカウントは service-YOUR_PROJECT_NUMBER-compute@developer.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 インスタンスに接続できます。このような接続は、追加構成なしで自動的に暗号化されます。

Python

# The SQLAlchemy engine will help manage interactions, including automatically
# managing a pool of connections to your database
db = sqlalchemy.create_engine(
    # Equivalent URL:
    # mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<cloud_sql_instance_name>
    sqlalchemy.engine.url.URL(
        drivername='mysql+pymysql',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_socket': '/cloudsql/{}'.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:mysql:///%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.mysql.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);
config.addDataSourceProperty("useSSL", "false");

// ... Specify additional connection properties here.
// ...

// Initialize the connection pool using the configuration object.
DataSource pool = new HikariDataSource(config);
このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub にあるソースコードを表示してください。

Node.js

let pool;
const createPool = async () => {
  pool = await mysql.createPool({
    user: process.env.DB_USER, // e.g. 'my-db-user'
    password: process.env.DB_PASS, // e.g. 'my-db-password'
    database: process.env.DB_NAME, // e.g. 'my-database'
    // If connecting via unix domain socket, specify the path
    socketPath: `/cloudsql/${process.env.CLOUD_SQL_CONNECTION_NAME}`,
    // If connecting via TCP, enter the IP and port instead
    // host: 'localhost',
    // port: 3306,

    //...
  });
};
createPool();
このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub にあるソースコードを表示してください。

おすすめの方法とその他の情報

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

Docker コンテナ経由で Cloud SQL Proxy を使用して、テストを行うこともできます。

接続プール

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

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

接続制限

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

Cloud Run には負荷の増加に応じて自動的にインスタンスを作成する機能があり、この制限を超える可能性があります。インスタンスごとの最大接続数は、接続プールを使用して制限できます。接続の数を制限する使用例については、データベース接続の管理ページをご覧ください。

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

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