Cloud SQL への新しいアクセス方法として Private Service Connect が 2023/8/21 に GA されました。
これまで Cloud SQL へのプライベートアクセス方法は Private Services Access しかありませんでしたが、本機能がリリースされたことで選択肢が増えました。

今回は Private Service Connect を介した Cloud SQL へのプライベートアクセスについて、仕様や特徴および設定方法を解説します。

そもそも Private Service Connect とは?

Private Service Connect は Google Cloud ネットワーキング機能の一つで、Google Cloud の公開された VPC ホスト型サービスや Google API へプライベートネットワーク経由でアクセスするための仕組みです。
全てのトラフィックが Google Cloud 内で完結するため、パブリックインターネットを経由することなくセキュアで高速な通信を実現することができます。
Private Service Connect には以下の通信タイプがありますが、その内のエンドポイントと呼ばれるタイプを使用した接続がCloud SQL に対応したことが今回のアップデート内容となります。

  • エンドポイント
  • バックエンド
  • インターフェース(プレビュー)

ここでは Cloud SQL に関連する部分にフォーカスするため、Private Service Connect 自体の詳細については公式ドキュメントをご確認ください。

Private Service Connect を介した Cloud SQL へのプライベートアクセス

アーキテクチャ

Cloud SQL のような Google が公開しているサービスでは、Private Service Connect エンドポイントと呼ばれる独自のプライベート IP アドレスに紐づく転送ルールを、各サービスのサービス アタッチメントに関連づけることで実現することができます。
サービス アタッチメントは内部でロードバランサーをターゲットにする仕組みとなっており、トラフィックはエンドポイントからこのロードバランサーを経由して各サービスへ送信されます。

特徴

Private Service Connect を介した Cloud SQL へのプライベートアクセスには以下の特徴があります。

異なる複数の VPC からの同時アクセス

明示的に許可されたプロジェクトからの同時アクセスが可能です。
Private Services Access のような VPC ピアリングでは推移的ピアリングをサポートしていないため、現状本機能でのみ実現できる構成となります。

DNS レコードでのアクセス

プライベート IP アドレスの代わりに、DNS 名を使用できます。
インスタンスを別VPCに移動する必要がある場合でも、DNS 名はそのまま機能するためコードや構成設定を変更する手間が省けます。
また、IP アドレスが非表示となることによるセキュリティ向上や、DNS 名が分散データベースに保存される高スケーラビリティ性により多数のリクエストを処理できるといったメリットがあります。

制限事項

以下の制限事項があるため、利用する際は注意が必要です。

  • Cloud SQL インスタンスのサービス アタッチメントに接続できる Private Service Connect エンドポイントは最大 10 個まで
  • 外部レプリカは作成不可
  • クロスリージョンレプリカはサポートされていないため、レプリカはプライマリ インスタンスと同じリージョンでのみ作成可能
  • 既存のインスタンスで Private Service Connect を有効または無効にすることはできない
  • 2021/4/1 以降に Cloud SQL の使用を開始したプロジェクトでのみ作成可能
  • パブリック IP 接続を有効にすることはできない
  • Private Services Accessを有効にしたり、承認されたネットワークをインスタンスに追加したりすることはできない
  • インスタンスの接続タイプは変更不可
  • 認可されたネットワークを介した IP ベースのホワイトリスト登録はサポートされていない
  • gcloud sql connect コマンド、Cloud Shell、Cloud Build、Database Migration Service、Cloud SQL コネクタ、Unix ソケット、オンプレミス環境から Cloud SQL インスタンスへ接続できない
  • 接続テスト診断ツールでは以下の設定ができない
    • インスタンスのプライベート IP アドレスまたは DNS 名を宛先として指定
    • ソースとしてインスタンスおよび Private Service Connect エンドポイントの IP アドレスを指定
    • 宛先としてインスタンスを直接指定
    • ネットワーク エンドポイント間の接続確認
  • CLIの以下フラグについて制限あり
    • –availability-type:高可用性インスタンスのみがサポートされるため REGIONAL に設定する必要がある
    • –no-assign-ip:パブリック IP での接続はサポートされていないため設定必須
    • –authorized-networks:承認されたネットワークの追加は不可
    • –database-version:MySQL と PostgreSQL のみサポート対象のため、いずれかのバージョンに設定する必要がある
    • –network:Private Services Access は構成不可
    • –allocated-ip-range-name:許可された IP 範囲がサポートされていないため設定不可

Private Services Accessとの比較

項目 Private Services Access Private Service Connect
Cloud SQL の構成 シングル
マルチ
マルチのみ
アクセス方式 VPC ピアリング 独自エンドポイント
アクセス制御 Firewall
VPC 単位
IP 範囲単位
Firewall
プロジェクト単位
エンドポイント プライベート IP プライベート IP
DNS 名
パブリック IP 併用可能 併用不可
対応エンジン MySQL
PostgreSQL
SQL Server
MySQL
PostgreSQL
レプリカ作成 制限なし 一部制限あり

設定方法

事前準備

Cloud SQL インスタンスで Private Service Connect を使用するには以下のロールが必要です。

  • Cloud SQL 管理者(cloudsql.admin)
  • コンピューティングネットワーク管理者(compute.networkAdmin)
  • DNS管理者(dns.admin)
  • Cloud SQL インスタンス ユーザー(cloudsql.instanceUser)
    ※Cloud SQL Auth Proxy クライアント経由で接続する場合に必要なため、直接接続する場合はなくてもOK

構築手順

現状マネジメントコンソールからの作成は対応していませんので、gcloud CLI を使用する必要があります。
プロジェクトは gcloud config set project で予めセットしています。

1. Cloud SQL インスタンスの作成

Private Service Connect が有効なインスタンスを作成します。

gcloud sql instances create 【インスタンス名】 \
    --region=【リージョン】 \
    --enable-private-service-connect \
    --allowed-psc-projects=【アクセスを許可するプロジェクト ID】 \  #project-a,project-b,...のように複数指定も可能
    --availability-type=regional \
    --no-assign-ip \
    --tier=【マシンタイプ】 \
    --enable-bin-log \
    --database-version=【エンジンバージョン】    

Private Service Connect の設定に必要なフラグは以下です。

  • enable-private-service-connect:Private Service Connect エンドポイントからのアクセスを許可
  • allowed-psc-projects:アクセスを許可するプロジェクト ID のリスト
  • no-assign-ip:パブリック IP アドレスを付与しない

2. サービス アタッチメント URI を確認

Private Service Connect エンドポイントの作成時に、サービス アタッチメントを指定する必要があるので先に確認します。
サービス アタッチメントはインスタンス作成時に自動で作成されます。

gcloud sql instances describe 【インスタンス名】

出力例
~~~
pscServiceAttachmentLink: projects/xxxxxxxx/regions/asia-northeast1/serviceAttachments/xxxx-psc-service-attachment-xxxx
~~~

また、Private Service Connect に関係ある項目は以下です。

  • dnsName:インスタンスの DNS 名
  • pscServiceAttachmentLink:インスタンスのサービス アタッチメントを指す URI
  • allowedConsumerProjects:インスタンスへのアクセスを許可されたプロジェクト ID のリスト
  • pscEnabled:Private Service Connect が有効かどうか

3.Private Service Connect エンドポイントを作成

※ここからは allowedConsumerProjects で許可したプロジェクト毎に設定が必要です。

先に Private Service Connect エンドポイントで使用するプライベート IP アドレスを予約します。

gcloud compute addresses create 【プライベート IP アドレス名】 \ 
    --region=【リージョン】 \
    --subnet=【サブネット名】 \
    --addresses=【予約する IP アドレス】  #サブネットのプライマリ IP 範囲内で指定

プライベート IP アドレスが予約されたことを確認するために以下を実行します。
STATUS の値が RESERVED となっていれば OK です。

gcloud compute addresses list 【プライベート IP アドレス名】

~~~
STATUS: RESERVED

ここまでに作成してきたリソースを指定して、Private Service Connect エンドポイントを作成します。

gcloud compute forwarding-rules create 【エンドポイント名】 \ 
    --address=【プライベート IP アドレス名】 \
    --region=【リージョン】 \
    --network=【VPC名】 \
    --target-service-attachment=【サービス アタッチメント URI】

エンドポイントがサービス アタッチメントによって受け入れられることを確認します。
pscConnectionStatus の値が ACCEPTED となっていれば OK です。

gcloud compute forwarding-rules describe 【Private Service Connect エンドポイント名】 \
    --region=【リージョン】

PENDING から変わらない場合は、対象プロジェクトが許可リストに登録されていない可能性があります。
同プロジェクトからアクセスする場合でも、許可リストに含める必要があるので注意です。

アクセス方法

Private Service Connect が有効な Cloud SQL インスタンスへのアクセス方法は複数あります。

  • プライベート IP アドレス
  • DNS レコード
  • Cloud SQL Auth プロキシ
  • Cloud SQL 言語コネクタ

プライベート IP アドレス以外のアクセス方法では、別途 DNS マネージドゾーンと DNS レコードを構成する必要があります。
しかし、上述した利点のため DNS レコードでアクセスすることが推奨されておりますので、今回は DNS レコードで直接アクセスする方法で確認します。

1. DNS マネージド ゾーンと DNS レコードを構成

手順 2 のコマンドの結果から DNS 名を確認できます。
DNS 名は xxxx.xxxx.asia-northeast1.sql.goog. のようなピリオドで終わるものです。
確認した値を指定して、Cloud DNS でプライベート DNS ゾーンを作成します。

gcloud dns managed-zones create 【DNS ゾーン名】 \
    --description="【ゾーンの説明】" #必須項目
    --dns-name=【DNS 名】 \
    --networks=【VPC 名】 \
    --visibility=private

ゾーンが作成できたら、次に DNS レコードを作成します。

gcloud dns record-sets create DNS 名 \
    --type=【レコード タイプ】 \ 
    --rrdatas=【プライベート IP アドレス】 \
    --zone=【DNS ゾーン名】

2. MySQL クライアントからアクセス

許可された VPC 内に GCE を作成し、MySQL クライアントを導入してアクセスします。
Firewall での許可設定が必要な場合は、Private Service Connect エンドポイントのプライベート IP アドレスに対して指定することができます。

mysql --host=【DNS 名】 --user=【インスタンスに接続するユーザー名】 -p

その他

サーバーレス サービスからのアクセス

以下のサポートされているサービスからアクセスすることができます。
これらのサーバーレス環境では、Cloud SQL 言語コネクタと、プライベート IP アドレス使用した直接アクセスがサポートされています。

  • App Engine Standard
  • Cloud Run
  • Cloud Functions

BigQuery からのアクセス

BigQuery では、--enable-google-private-path パラメータを使用して Cloud SQL のデータにアクセスし、プライベート IP 接続経由でデータに対してクエリを実行できます。
上記のパラメータを使用するには、以下のパラメータも有効にする必要があります。

  • –no-assign-ip
  • –network

終わりに

Private Service Connect を介した Cloud SQL へのプライベートアクセスの仕組みや特徴、および設定方法について解説しました。
異なるプロジェクトからの同時アクセスや DNS レコードを参照先としてアクセス可能など本機能ならではのメリットがありますが、細かい制限事項も多いため仕様を正しく理解した上で利用できる機能だと感じました。
機能や役割ごとにプロジェクトを分離したアーキテクチャのような場合に、より効果的な機能かと思います!

参考:
Private Service Connect
Private Service Connect の概要
Private Service Connect を使用してインスタンスに接続する