例: 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 を取得できます。PSC サービス アタッチメントを作成するには、このプロジェクト ID が必要です。

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 を取得する

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 です。

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

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