例: Cloud SQL インスタンスのプライベート接続

このページでは、Private Service Connect(PSC)を使用して、Private Service Access(PSA) 可能なCloud SQL インスタンスと統合コネクタ ランタイムの間の接続を確立する方法について説明します。Cloud SQL インスタンスは、次のいずれかのタイプです。

考慮事項

PSC サービス アタッチメントを作成する場合は、次の点に注意してください。

  • PSC サービス アタッチメントとロードバランサは、同じ VPC 内の異なるサブネットに作成されます。具体的には、サービス アタッチメントは常に NAT サブネットに作成されます。
  • SOCKS5 プロキシ サーバーは、0.0.0.0:<port> IP アドレスにバインドする必要があります。これは、ロードバランサとヘルスチェック プローブからの受信トラフィックに必要です。詳細については、ヘルスチェックをご覧ください。
  • ロードバランサとヘルスチェック プローブからのトラフィックは、同じポートに送信する必要があります。
  • ファイアウォール ルールを構成して、トラフィック フローを促進します。

    上り(内向き)ルール

    • PSC サービス アタッチメントのサブネットからのトラフィックは、ILB のサブネットに到達する必要があります。
    • ILB のサブネット内では、ILB は SOCKS5 プロキシ サーバーにトラフィックを送信できる必要があります。
    • ヘルスチェック プローブは SOCKS5 プロキシ サーバーにアクセスできる必要があります。Google Cloud ヘルスチェック プローブには固定 IP 範囲(35.191.0.0/16, 130.211.0.0/22)があるため、これらの IP で SOCKS プロキシ サーバーにトラフィックを送信できます。

    下り(外向き)ルール

    特定の拒否ルールが構成されていない限り、Google Cloud プロジェクトで下り(外向き)トラフィックはデフォルトで有効になっています。

  • PSC サービス アタッチメントやロードバランサなどの Google Cloud コンポーネントはすべて、同じリージョンに配置する必要があります。
  • セキュリティ上の懸念があるため、バックエンド システムをパブリック ネットワークに公開しないでください。ただし、次のシナリオでは、SOCKS5 プロキシ サーバーがトラフィックを受け入れるようにしてください。
    • パススルー ロードバランサ(L4 TCP/UDP ILB): PSC サービス アタッチメントの NAT IP からのリクエストは、SOCKS5 プロキシ サーバーに到達できる必要があります。これらの NAT IP は自動生成されます。したがって、サービス アタッチメントが存在する NAT サブネットの IP 範囲全体を許可する必要があります。詳細については、Private Service Connect サブネットをご覧ください。
    • プロキシベース/HTTP(S) ロードバランサ(L4 プロキシ ILB、L7 ILB): すべての新しいリクエストがロードバランサから送信されます。そのため、SOCKS5 プロキシ サーバーは VPC ネットワークのプロキシ サブネットからのリクエストを受け入れる必要があります。詳細については、Envoy ベースのロードバランサのプロキシ専用サブネットをご覧ください。

Cloud SQL インスタンス用の PSC を設定する

統合コネクタは、Cloud SQL Auth Proxy を使用して Cloud SQL インスタンスに接続します。Cloud SQL Auth Proxy では、SOCKS5 プロキシを介したチェーンがサポートされています。これにより、Cloud SQL Auth Proxy から宛先の Cloud SQL インスタンスに暗号化されたトラフィックを転送できます。そのため、プライベート Cloud SQL インスタンスに接続するには SOCKS5 プロキシ サーバーが必要です。

サンプルのイラスト

次の図は、サンプルの Cloud SQL インスタンス設定用に PSC サービス アタッチメントが構成された後、Google Cloud プロジェクトがどのように表示されるかを示しています。

サンプルのイラスト

この例では、PSKS5 プロキシ サーバーはサービス アタッチメントを介して公開されているため、PSC は Cloud SQL インスタンスに安全に接続できます。SOCKS プロキシ サーバーは、 プライベート サービス アクセスを介して Cloud SQL インスタンスにアクセスできます。SOCKS5 プロキシ サーバーは非マネージド Compute Engine インスタンス グループにあり、予想される上り(内向き)トラフィックに基づいてプロキシ インスタンスの数を決定できます。

この例のトラフィックの流れ

  1. Integration コネクタは、サービス アタッチメントにリクエストを送信します。
  2. サービス アタッチメントがリクエストを L4 ILB に転送します。
  3. L4 ILB は SOCKS5 プロキシ サーバーにリクエストを送信します。

    ILB には転送ルールがあり、ポート転送を行います。デフォルトでは、SOCKS5 プロキシは 1080 ポートをリッスンします。 ただし、SOCKS5 プロキシ サーバーが別のポートでリッスンしている場合は、そのポートも ILB でリッスンするために開く必要があります。

  4. SOCKS5 プロキシ サーバーは、リクエストを Cloud SQL インスタンスに転送します。

準備

サンプル シナリオ用の PSC サービス アタッチメントを作成する前に、次の作業を行います。

  • gcloud CLI をインストールします
  • Google Cloud プロジェクトで Compute Engine APIService Networking API を有効にします。
  • CLI コマンドの詳細度を下げるには、次のコマンドを使用して PROJECT_ID、REGION、ZONE の値を設定します。
    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
  • このチュートリアルのコマンドでは、BACKEND_SERVER_PORT を 1080 に置き換えます。これは、SOCKS5 プロキシ サーバーが実行されるデフォルトのポートです。
  • このサンプル シナリオを試す場合は、新しい VPC ネットワークを作成して使用することをおすすめします。シナリオをテストしたら、VPC ネットワークやその他のリソースを削除できます。
  • 少なくとも 1 つの既存の接続が作成されている必要があります。任意の接続のタイプを使用できます。既存の接続があると、Integration Connectors ランタイムからサービス ディレクトリのプロジェクト ID を取得できます。PSC サービス アタッチメントを作成するには、このプロジェクト ID が必要です。

PSC サービス アタッチメントの作成

サンプル シナリオ用の PSC サービス アタッチメントを作成するには、次の作業を行います。

  1. VPC ネットワークと必要なサブネットを作成します。
    1. VPC ネットワークを作成します。
      gcloud compute networks create VPC_NETWORK \
      --project=PROJECT_ID --subnet-mode=custom --mtu=1460 \
      --bgp-routing-mode=regional
    2. サブネット1を追加
      gcloud compute networks subnets create SUBNET_NAME_1 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_1 \
      --purpose=PRIVATE_SERVICE_CONNECT

      このコマンドは、PSC サービス アタッチメントのホストにのみ使用される NAT サブネットとして Subnet-1 を作成します。この NAT サブネット内の他のサービスはホストできません。

    3. サブネット2を追加
      gcloud compute networks subnets create SUBNET_NAME_2 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_2
  2. プライベート Cloud SQL インスタンスを作成します。
    1. プライベート サービス アクセスを構成する
      1. IP アドレス範囲を割り振る
        gcloud compute addresses create google-managed-services-VPC_NETWORK \
        --global --purpose=VPC_PEERING --prefix-length=16 \
        --network=projects/PROJECT_ID/global/networks/VPC_NETWORK
        
      2. プライベート接続を作成します。
        gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=google-managed-services-VPC_NETWORK \
        --network=VPC_NETWORK \
        --project=PROJECT_ID
        
    2. プライベート IP を使用して Cloud SQL インスタンスを作成します。
      gcloud beta sql instances create \
      INSTANCE_NAME \
      --database-version=DATABASE_VERSION \
      --cpu=NUMBER_OF_CPUs \
      --memory=MEMORY \
      --zone=ZONE \
      --root-password=ROOT_PASSWORD \
      --network=projects/PROJECT_ID/global/networks/VPC_NETWORK \
      --no-assign-ip \
      --allocated-ip-range-name=google-managed-services-VPC_NETWORK
      

      作成するインスタンスのタイプに基づいて DATABASE_VERSION を指定します。MySQL、PostgreSQL、SQL Server タイプのインスタンスを作成できます。サポートされているすべてのデータベース バージョンの一覧については、SQL データベース バージョンをご覧ください。

      このコマンドは、Cloud SQL インスタンスのデフォルト ユーザーを作成します。さまざまな Cloud SQL * インスタンス用に作成されるデフォルト ユーザーは次のとおりです。

      • Cloud SQL for MySQL - root
      • Cloud SQL for SQL Server - sqlserver
      • Cloud SQL for PostgreSQL - postgres
    3. (省略可)デフォルト ユーザーを使用しない場合は、新しく作成した Cloud SQL インスタンス用に新しいユーザーを作成します。
      gcloud sql users create USER --host=% --instance=INSTANCE_NAME \
      --password=PASSWORD
      

      次のステップで作成するデータベースへのアクセスに必要なすべての権限がユーザーに付与されていることを確認します。

    4. 新しく作成した Cloud SQL インスタンスにデータベースを作成します。
      gcloud sql databases create DATABASE_NAME \
      --instance=INSTANCE_NAME
      
  3. Cloud NAT を構成する
    1. シンプルなルーターを作成します。
      gcloud compute routers create NAT_ROUTER_NAME \
          --network=VPC_NETWORK
      
    2. ネットワーク アドレス変換を構成します。
      gcloud compute routers nats create NAT_GATEWAY_NAME \
          --router=NAT_ROUTER_NAME \
          --auto-allocate-nat-external-ips \
          --nat-all-subnet-ip-ranges
      
  4. SOCKS5 プロキシ サーバーを実行するための Compute Engine VM インスタンスを作成します。
    1. プロキシ インスタンス 1 を作成します。
      gcloud compute instances create PROXY_INSTANCE_1 \
      --project=PROJECT_ID \
      --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address
      

    要件に応じて、必要な数の VM インスタンスを作成できます。

  5. VM インスタンスへの SSH 接続を許可するファイアウォール ルールを作成します。
    gcloud compute firewall-rules create FIREWALL_RULE_NAME_SSH \
    --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
    
  6. SOCKS5 プロキシをインストールします。

    SOCKS5 プロキシ サーバーのインストールと構成の詳細な手順は、このドキュメントでは扱いません。任意の SOCKS5 プロキシをインストールできます。次の手順は、Dante SOCKS5 プロキシ サーバーをインストールして構成する方法を示しています。

    1. VM インスタンスに SSH で接続します。
      gcloud compute ssh \
          --tunnel-through-iap \
          PROXY_INSTANCE_1
      
    2. Dante SOCKS5 プロキシ サーバーをインストールします。
      sudo apt update
      sudo apt install dante-server
    3. サーバー インターフェースを確認します。
      sudo ip a
    4. Dante 構成のバックアップを作成します。
      sudo mv /etc/danted.conf /etc/danted.conf.bak
    5. 新しい Dante 構成ファイルを作成します。
      sudo nano /etc/danted.conf
    6. 構成ファイルに次の構成をコピーします。
      logoutput: /var/log/socks.log
      # Bind the server to the 0.0.0.0 IP address to allow traffic
      # traffic from the load balancer and the health check probes.
      internal: 0.0.0.0 port = 1080
      external: ens4
      clientmethod: none
      socksmethod: none
      user.privileged: root
      user.notprivileged: nobody
      client pass {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: error connect disconnect
      }
      client block {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: connect error
      }
      socks pass {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: error connect disconnect
      }
      socks block {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: connect error
      }
    7. Dante サーバーを再起動し、ステータスを確認します。
      sudo systemctl restart danted
      sudo systemctl status danted
    8. VM インスタンスを終了します。
      exit
  7. 非マネージド インスタンス グループを設定します。
    1. 非マネージド インスタンス グループを作成します。
      gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
    2. 手順 3 で作成した VM インスタンスをグループに追加します。
      gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME \
      --instances=PROXY_INSTANCE_1
  8. ヘルスチェック プローブを作成し、プローブからのトラフィックを許可します。
    1. ヘルスチェック プローブを作成します。
      gcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --port BACKEND_SERVER_PORT --region=REGION

      このコマンドで、BACKEND_SERVER_PORT を 1080 に設定します。これは、SOCKS5 プロキシ サーバーが実行されるデフォルトのポートです。

    2. プローブからのトラフィックを許可するファイアウォール ルールを作成します。
      gcloud compute firewall-rules create FIREWALL_RULE_NAME_HEALTHCHECK \
      --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT \
      --source-ranges=35.191.0.0/16,130.211.0.0/22
  9. L4 内部ロードバランサを作成し、ロードバランサからのトラフィックを許可します。
    1. バックエンド サービスを作成します。
      gcloud compute backend-services create BACKEND_SERVICE \
      --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME \
      --health-checks-region=REGION 
    2. バックエンド サービスにインスタンス グループを追加します。
      gcloud compute backend-services add-backend BACKEND_SERVICE \
      --instance-group=INSTANCE_GROUP_NAME \
      --instance-group-zone=ZONE
    3. 転送ルールを作成します。
      gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
      --load-balancing-scheme=internal --network=VPC_NETWORK --subnet=SUBNET_NAME_2 \
      --ip-protocol=TCP --ports=BACKEND_SERVER_PORT --backend-service=BACKEND_SERVICE \
      --backend-service-region=REGION
    4. ロードバランサからインスタンス グループへの内部トラフィックを許可するファイアウォール ルールを作成します。
      gcloud compute firewall-rules create FIREWALL_RULE_NAME_INTERNAL \
      --direction=INGRESS --priority=1000 --network=VPC_NETWORK \
      --action=ALLOW --rules=all --source-ranges=SUBNET_RANGE_2
  10. PSC サービス アタッチメントを作成します。
    1. PSC サービス アタッチメントから前のステップで作成した内部ロードバランサへのトラフィックを許可するファイアウォール ルールを作成します。
      gcloud compute firewall-rules create FIREWALL_RULE_NAME_SA \
      --direction=INGRESS --priority=1000 --network=VPC_NETWORK \
      --allow=tcp:BACKEND_SERVER_PORT --source-ranges=SUBNET_RANGE_1
    2. 明示的な承認を使用してサービス アタッチメントを作成します。
      gcloud compute service-attachments create SERVICE_ATTACHMENT_NAME \
      --producer-forwarding-rule=FORWARDING_RULE_NAME  \
      --connection-preference=ACCEPT_MANUAL \
      --consumer-accept-list=SERVICE_DIRECTORY_PROJECT_ID=LIMIT \
      --nat-subnets=SUBNET_NAME_1

      このコマンドで、LIMIT はプロジェクトの接続上限です。接続上限は、このサービスに接続できるコンシューマ Private Service Connect エンドポイントの数になります。SERVICE_DIRECTORY_PROJECT_ID の取得方法については、サービス ディレクトリのプロジェクト ID を取得するをご覧ください。

  11. エンドポイント アタッチメントを作成します。

    エンドポイント アタッチメントは、PSC サービス アタッチメントへのインターフェースと考えることができます。PSC サービス アタッチメントを直接使用してプライベート接続を構成することはできません。PSC サービス アタッチメントには、エンドポイント アタッチメントを使用してのみアクセスできます。エンドポイント アタッチメントは、IP アドレスまたはホスト名として作成できます。エンドポイント アタッチメントは、作成したコネクタをプライベート接続用に構成するときに使用できます。詳細については、エンドポイント アタッチメントを作成するをご覧ください。

  12. PSC の設定を確認します。

    プライベート接続を確認するには、Cloud SQL 接続を作成し、このチュートリアルに示すように SOCKS5 プロキシ サーバーを設定します。接続を作成する詳しい手順については、Cloud SQL for MySQLCloud SQL for PostgreSQLCloud SQL SQL for SQL Server コネクタ)のドキュメントをご覧ください。 接続を作成するときは、Destinations セクション(ステップ 5)で Destination typeHost address として選択し、エンドポイント アタッチメントの IP アドレスまたは SOCKS5 プロキシ サーバーの詳細のホスト名を入力します。SOCKS5 プロキシ サーバーに別のポートを構成していない限り、ポート値を 1080 に設定します。接続が正常に作成されると、新しく作成された接続のステータスが Cloud Console[接続] ページActive になります。

サービス ディレクトリのプロジェクト ID を取得する

PSC サービス アタッチメントは、指定された Google Cloud プロジェクトからのリクエストのみを受け入れるように作成することをおすすめします。ただし、これを行うには、Google Cloud プロジェクトに関連付けられたサービス ディレクトリのプロジェクト ID が必要です。サービス ディレクトリのプロジェクト ID を取得するには、次の例に示すように List Connections API を使用します。

構文

curl -X GET \
    -H "authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://connectors.googleapis.com/v1/projects/CONNECTORS_PROJECT_ID/locations/-/connections"

次のように置き換えます。

  • CONNECTORS_PROJECT_ID: 接続を作成した Google Cloud プロジェクトの ID。

この例では、connectors-test Google Cloud プロジェクトのサービス ディレクトリのプロジェクト ID を取得します。

curl -X GET \
    -H "authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://connectors.googleapis.com/v1/projects/connectors-test/locations/-/connections"

ターミナルでこのコマンドを実行すると、次のような出力が表示されます。

.....
{
  "connections": [
    {
      "name": "projects/connectors-test/locations/asia-northeast1/connections/big-query-iam-invalid-sa",
      "createTime": "2022-10-07T09:02:31.905048520Z",
      "updateTime": "2022-10-07T09:22:39.993778690Z",
      "connectorVersion": "projects/connectors-test/locations/global/providers/gcp/connectors/bigquery/versions/1",
      "status": {
        "state": "ACTIVE"
      },
      "configVariables": [
        {
          "key": "project_id",
          "stringValue": "connectors-test"
        },
        {
          "key": "dataset_id",
          "stringValue": "testDataset"
        }
      ],
      "authConfig": {},
      "serviceAccount": "564332356444-compute@developer.gserviceaccount.com",
      "serviceDirectory": "projects/abcdefghijk-tp/locations/asia-northeast1/namespaces/connectors/services/runtime",
      "nodeConfig": {
        "minNodeCount": 2,
        "maxNodeCount": 50
      }
    },
....

このサンプル出力では、connectors-test Google Cloud プロジェクトの場合、サービス ディレクトリのプロジェクト ID は abcdefghijk-tp です。