例: 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 を設定する

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

サンプルのイラスト

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

サンプルのイラスト

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

この例のトラフィック フローは次のとおりです。

  1. Integration Connectors は、サービス アタッチメントにリクエストを送信します。
  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 を取得できます。このプロジェクト ID は、PSC サービス アタッチメントの作成に必要です。

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 for SQL Server)のドキュメントをご覧ください。接続を作成するときは、Destinations セクション(ステップ 5)で Destination typeHost address として選択し、エンドポイント アタッチメントの IP アドレスまたは SOCKS5 プロキシ サーバーの詳細のホスト名を入力します。SOCKS5 プロキシ サーバーに別のポートを構成していない限り、ポート値を 1080 に設定します。接続が正常に作成されると、新しく作成された接続のステータスが Cloud コンソール[接続] ページActive になります。

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

ベスト プラクティスとして、指定した Google Cloud プロジェクトからのリクエストのみを受け入れるように PSC サービス アタッチメントを作成できます。ただし、これを行うには、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 です。