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

このページでは、Private Service Connect(PSC)を使用して、プライベート ネットワーク上にある MySQL バックエンド システムと Integration Connectors ランタイムとの接続を確立する方法について例を交えて説明します。

考慮事項

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

  • PSC サービス アタッチメントとロードバランサは、同じ VPC 内の異なるサブネット内に存在する必要があります。具体的には、サービス アタッチメントが NAT サブネット内に存在する必要があります。
  • バックエンド VM 上で動作するソフトウェアは、ロード バランシングによって各転送ルールの IP アドレスに送信されるトラフィックとヘルスチェック プローブの両方に応答する必要があります(ソフトウェアはネットワーク インターフェースに割り当てられている特定の IP アドレスではなく 0.0.0.0:<port> をリッスンする必要があります)詳細については、ヘルスチェックをご覧ください。
  • ファイアウォール ルールを構成して、トラフィック フローを促進します。

    上り(内向き)ルール

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

    下り(外向き)ルール

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

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

プライベート VPC ネットワークで Google Cloud にホストされている MySQL インスタンスがあり、その MySQL インスタンスを Integration Connectors ランタイムに公開するとします。

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

サンプルのイラスト

準備

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

  • gcloud CLI をインストールします
  • Google Cloud プロジェクトで Compute Engine 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 を 3306 に置き換えます。これは、MySQL サーバーが実行されるデフォルトのポートです。
  • このサンプル シナリオを試す場合は、新しい VPC ネットワークを作成して使用することをおすすめします。シナリオをテストしたら、VPC ネットワークと他のリソースを削除できます。
  • 作成した既存の接続が 1 つ以上ある必要があります。接続は任意のタイプにできます。既存の接続があると、Integration Connectors ランタイムからサービス ディレクトリのプロジェクト ID を取得できます。このプロジェクト ID は、PSC サービス アタッチメントの作成に必要です。

PSC サービス アタッチメントを作成する

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

  1. VPC ネットワークと必要なサブネットを作成します。
    1. VPC ネットワークを作成します。
      gcloud compute networks create VPC_NETWORK --project=PROJECT_NAME --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. VM インスタンスを作成します。

    新しく作成した VPC に VM インスタンスを作成するには、次のコマンドを実行します。

    gcloud compute instances create \
    --image-family debian-10 \
    --image-project debian-cloud \
    --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address \
    mysql-test

    このコマンドは、mysql-test という名前の VM インスタンスを作成します。

  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. VM インスタンスに SSH で接続します。
    1. SSH を許可するファイアウォール ルールを作成します。
      gcloud compute firewall-rules create VPC_NETWORK-allow-ssh --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
    2. VM インスタンスに SSH で接続します。
      gcloud compute ssh \
          --tunnel-through-iap \
          mysql-test
  5. MySQL サーバーをインストールします。詳細な手順については、MySQL をインストールするをご覧ください。
  6. MySQL インスタンスに接続し、サンプルデータを作成します。
    1. MySQL クライアントを使用して MySQL に接続します。
      sudo mysql -u root -p
    2. 新しいユーザーを作成し、任意のホストアドレスから接続するためのアクセス権を付与します。
      CREATE USER 'test-user'@'%' IDENTIFIED BY 'test-pass';
      GRANT ALL PRIVILEGES ON * . * TO 'test-user'@'%';
      FLUSH PRIVILEGES;
      

      このコマンドは、ユーザー名が test-user、パスワードが test-pass のユーザーを作成します。

    3. サンプルデータとともにデータベースを作成します。
      CREATE DATABASE test-db;
      USE test-db;
      CREATE TABLE Singers (SingerId int, FirstName varchar(255), LastName varchar(255));
      INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards');
      
    4. MySQL クライアントを終了します。
      mysql> exit
    5. VM インスタンスを終了します。
      exit
  7. 非マネージド インスタンス グループを設定します。
    1. 非マネージド インスタンス グループを作成します。
      gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
    2. ステップ 2 で作成した VM インスタンスをグループに追加します。
      gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances=mysql-test
  8. ヘルスチェック プローブを作成し、プローブからのトラフィックを許可します。
    1. ヘルスチェック プローブを作成します。
      gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port BACKEND_SERVER_PORT --region=REGION

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

    2. プローブからのトラフィックを許可するファイアウォール ルールを作成します。
      gcloud compute firewall-rules create VPC_NETWORK-allow-health-check --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 VPC_NETWORK-allow-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 VPC_NETWORK-allow-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 の設定を確認します。PSC サービス アタッチメントの接続を確認するには、このチュートリアル用に作成した test-db データベースへの MySQL 接続を作成します。MySQL 接続の詳細な作成手順については、MySQL 接続を作成するをご覧ください。接続を作成するときに、Destinations セクション(MySQL 接続を作成するのステップ 5 を参照)で、Destination typeHostname として選択し、適切なエンドポイントの IP アドレスまたはホスト名を入力します。接続が正常に作成されると、新しく作成された接続のステータスが 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 です。

他のバックエンド システム用の PSC サービス アタッチメント

前述のの手順に沿って、他のバックエンド システムに PSC サービス アタッチメントを設定できます。ただし、目的のバックエンド システムに合わせて、ステップ 5 と 6 を変更する必要があります。VM インスタンスにバックエンド システムをインストールしたら、バックエンド システムをインスタンス グループに追加し、残りの手順を通常どおりに進めます。