--- title: "GCP Private Service Connect" description: "この文書は、Google Cloud Platform (GCP) の Private Service Connect (PSC) を使用して ClickHouse Cloud に接続する方法、および GCP PSC アドレス以外のアドレスから ClickHouse Cloud サービスへのアクセスを ClickHouse Cloud IP アクセスリストを使用して無効にする方法を説明します。" sidebar_label: "GCP Private Service Connect" slug: /ja/manage/security/gcp-private-service-connect --- ## Private Service Connect Private Service Connect (PSC) は、Google Cloud のネットワーク機能であり、消費者が自分の仮想プライベートクラウド (VPC) ネットワーク内で管理サービスにプライベートにアクセスできるようにします。同様に、管理サービスの提供者は、これらのサービスを独自の別の VPC ネットワークにホストし、消費者にプライベート接続を提供できます。 サービス提供者は、Private Service Connect サービスを作成することで、消費者に自分のアプリケーションを公開します。サービス消費者は、これらの Private Service Connect タイプのいずれかを通じて、直接そのサービスにアクセスします。 ![Overview of PSC](@site/docs/ja/cloud/security/images/gcp-psc-overview.png) :::important デフォルトでは、PSC 接続が承認され確立されていても、ClickHouse サービスは Private Service 接続からは利用できません。インスタンスレベルで PSC ID を許可リストに明示的に追加する必要があります。[ステップ](#add-endpoint-id-to-services-allow-list)を完了してください。 ::: :::note GCP Private Service Connect は ClickHouse Cloud Production サービスでのみ有効にできます。 ::: リージョン間の接続はサポートされていません。提供者と消費者のリージョンは同じでなければなりません。PSC レベルでグローバルアクセスを有効にすれば、自分の VPC 内の他のリージョンからでも接続できるようになります(以下を参照)。 このプロセスは以下の4つのステップに分かれています: 1. Private Service Connect用のGCPサービスアタッチメントを取得します。 1. サービスエンドポイントを作成します。 1. Endpoint ID を ClickHouse Cloud 組織に追加します。 1. Endpoint ID をサービスの許可リストに追加します。 :::note 以下の例では、次の事項を使用します: - GCP リージョン: `us-central1` - GCP プロジェクト (顧客のGCPプロジェクト): `my-gcp-project` - 顧客のGCPプロジェクト内のGCPプライベートIPアドレス: `10.128.0.2` - 顧客のGCPプロジェクト内のGCP VPC: `default` 以下に、ClickHouse Cloud サービス内で Private Service Connect を設定する方法を示すコード例を示します。 ::: ## はじめに ClickHouse Cloud サービスに関する情報を取得する必要があります。ClickHouse Cloud コンソールまたは ClickHouse API を通じてこれを行うことができます。ClickHouse API を使用する場合、以下の環境変数を設定してから進めてください: ```bash export REGION=us-central1 export PROVIDER=gcp export KEY_ID= export KEY_SECRET= export ORG_ID= export INSTANCE_ID=$(curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services" | jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\") | .id " -r | head -1) ``` :::note - 自身のOrganization IDはClickHouseコンソール (Organization -> Organization Details)から取得可能です。 - [新しいキーを作成](https://clickhouse.com/docs/ja/cloud/manage/openapi)するか、既存のものを使用できます。 ::: ## GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得する ### オプション 1: ClickHouse Cloud コンソール ClickHouse Cloud コンソールで、Private Service Connect 経由で接続したいサービスを開き、**設定** メニューを開きます。**プライベートエンドポイントを設定する** ボタンをクリックします。**サービス名** (`endpointServiceId`) と **DNS 名** (`privateDnsHostname`) をメモしておいてください。次のステップで使用します。 ![Private Endpoints](./images/gcp-privatelink-pe-create.png) ### オプション 2: API :::note このステップを実行するために、少なくとも1つのインスタンスがリージョン内でデプロイされている必要があります。 ::: GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得します: ```bash curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig" | jq .result { "endpointServiceId": "projects/.../regions/us-central1/serviceAttachments/production-us-central1-clickhouse-cloud", "privateDnsHostname": "xb164akwxw.us-central1.p.gcp.clickhouse.cloud" } ``` `endpointServiceId` と `privateDnsHostname` をメモしておいてください。次のステップで使用します。 ## サービスエンドポイントを作成する このセクションでは、サービスエンドポイントを作成します。 ### Private Service Connection の追加 まず最初に、Private Service Connection を作成します。 #### オプション 1: Google Cloud コンソールを使用する Google Cloud コンソールで、**Network services -> Private Service Connect** に移動します。 ![Open PSC](@site/docs/ja/cloud/security/images/gcp-psc-open.png) **Connect Endpoint** ボタンをクリックして、Private Service Connect 作成ダイアログを開きます。 - **Target**: **Published service** を使用してください - **Target service**: [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップの **endpointServiceId** を使用してください。 - **Endpoint name**: PSC の **Endpoint name** 名を設定します。 - **Network/Subnetwork/IP address**: 接続に使用するネットワークを選択してください。Private Service Connect エンドポイントの IP アドレスを新規作成するか既存のものを使用します。例では、名前 **your-ip-address** でIPアドレス `10.128.0.2` を事前に作成して割り当てています。 - エンドポイントを任意のリージョンから利用可能にするには、**Enable global access** チェックボックスを有効にすることができます。 ![Enable Global Access](@site/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png) **ADD ENDPOINT** ボタンを使って PSC エンドポイントを作成します。 接続が承認されると、**Status** 列が **Pending** から **Accepted** に変わります。 ![Accepted](@site/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png) ***PSC Connection ID*** をコピーします。この ID を次のステップで ***Endpoint ID*** として使用します。 #### オプション 2: Terraform を使用する ```json provider "google" { project = "my-gcp-project" region = "us-central1" } variable "region" { type = string default = "us-central1" } variable "subnetwork" { type = string default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/regions/us-central1/subnetworks/default" } variable "network" { type = string default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default" } resource "google_compute_address" "psc_endpoint_ip" { address = "10.128.0.2" address_type = "INTERNAL" name = "your-ip-address" purpose = "GCE_ENDPOINT" region = var.region subnetwork = var.subnetwork } resource "google_compute_forwarding_rule" "clickhouse_cloud_psc" { ip_address = google_compute_address.psc_endpoint_ip.self_link name = "ch-cloud-${var.region}" network = var.network region = var.region load_balancing_scheme = "" # service attachment target = "https://www.googleapis.com/compute/v1/$TARGET" # 以下のノートを参照 } output "psc_connection_id" { value = google_compute_forwarding_rule.clickhouse_cloud_psc.psc_connection_id description = "インスタンスレベルで許可リストにGCP PSC接続IDを追加します。" } ``` :::note TARGET - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **endpointServiceId** を使用してください。 ::: ## DNS の設定 Google Cloud コンソールを使用するものと `gcloud` CLI を使用するものの2つのオプションがあります。 ### オプション 1: Google Cloud コンソールを使用する - **Supported regions** からプライベート DNS ゾーンを作成します。 - **Network services -> Cloud DNS** を開きます。 - **Create Zone** を選択します: ![Create Zone](@site/docs/ja/cloud/security/images/gcp-psc-create-zone.png) ゾーンタイプダイアログで以下を設定します: - ゾーンタイプ: **Private** - ゾーン名: 適切なゾーン名を入力します。 - DNS 名: **Supported regions** テーブルの **Private DNS domain** 列をリージョンに合わせて使用します。 - ネットワーク: ClickHouse Cloud に PSC を使って接続する予定のネットワークに DNS ゾーンをアタッチします。 ![Zone Type](@site/docs/ja/cloud/security/images/gcp-psc-zone-type.png) #### プライベート DNS ゾーンでの DNS レコードの作成 [Private Service Connection の追加](#adding-a-private-service-connection) ステップで作成した IP アドレスを指すように設定します。 ![DNS Record](@site/docs/ja/cloud/security/images/gcp-psc-dns-record.png) ### オプション 2: `gcloud` CLI を使用する #### DNS ゾーンの作成 ```bash gcloud dns \ --project=my-gcp-project \ managed-zones create ch-cloud-us-central1 \ --description="Private DNS zone for PSC" \ --dns-name="us-central1.p.gcp.clickhouse.cloud." \ --visibility="private" \ --networks="https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default" ``` #### DNS レコードの作成 ```bash gcloud dns \ --project=my-gcp-project \ record-sets create $DNS_RECORD \ --zone="ch-cloud-us-central1" \ --type="A" \ --ttl="300" \ --rrdatas="10.128.0.2" ``` :::note DNS_RECORD - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 ::: ### オプション 3: Terraform を使用する ```json variable "ch_dns_record" { type = string default = "$DNS_NAME" # 以下のノートを参照 } resource "google_dns_managed_zone" "clickhouse_cloud_private_service_connect" { description = "Private DNS zone for accessing ClickHouse Cloud using Private Service Connect" dns_name = "${var.region}.p.gcp.clickhouse.cloud." force_destroy = false name = "clickhouse-cloud-private-service-connect-${var.region}" visibility = "private" } resource "google_dns_record_set" "psc_dns_record" { managed_zone = google_dns_managed_zone.clickhouse_cloud_private_service_connect.name name = "${var.ch_dns_record}" type = "A" rrdatas = [google_compute_address.psc_endpoint_ip.address] } ``` :::note DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 ::: ## DNS 設定の確認 DNS_RECORD - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 ```bash ping $DNS_RECORD ``` ## Endpoint ID を ClickHouse Cloud 組織に追加する ### オプション 1: ClickHouse Cloud コンソール 組織にエンドポイントを追加するには、[サービスの許可リストに Endpoint ID を追加](#add-endpoint-id-to-services-allow-list) ステップに進みます。ClickHouse Cloud コンソールを使用して許可リストに `PSC Connection ID` を追加すると、組織にも自動的に追加されます。 エンドポイントを削除するには、**Organization details -> Private Endpoints** を開き、削除ボタンをクリックしてエンドポイントを削除します。 ![endpoints](./images/gcp-pe-remove-private-endpoint.png) ### オプション 2: API コマンドを実行する前に次の環境変数を設定します: `ENDPOINT_ID` を、[Private Service Connection の追加](#adding-a-private-service-connection) ステップでの **Endpoint ID** の値に置き換えます。 エンドポイントを追加するには、以下を実行します: ```bash cat <.p.gcp.clickhouse.cloud" } ``` この例では、`xxxxxxx.yy-xxxxN.p.gcp.clickhouse.cloud` ホスト名への接続が Private Service Connect にルーティングされます。一方、`xxxxxxx.yy-xxxxN.gcp.clickhouse.cloud` はインターネット経由でルーティングされます。 ## トラブルシューティング ### DNS 設定のテスト DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 ```bash nslookup $DNS_NAME ``` ```response Non-authoritative answer: ... Address: 10.128.0.2 ``` ### Connection reset by peer - 最も可能性が高いのは、サービス許可リストに Endpoint ID が追加されていない場合です。[サービスの許可リストに Endpoint ID を追加](#add-endpoint-id-to-services-allow-list) ステップを再確認してください。 ### 接続テスト PSCリンクを使用して接続する際に問題がある場合は、`openssl` を使用して接続をテストしてください。Private Service Connect エンドポイントのステータスが `Accepted` であることを確認してください: OpenSSL は接続できるはずです(出力に CONNECTED が表示されます)。`errno=104` は予期されたものです。 DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 ```bash openssl s_client -connect ${DNS_NAME}:9440 ``` ```response # highlight-next-line CONNECTED(00000003) write:errno=104 --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 0 bytes and written 335 bytes Verification: OK --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 0 (ok) ``` ### エンドポイントフィルターの確認 #### REST API ```bash curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X GET -H "Content-Type: application/json" "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}" | jq .result.privateEndpointIds [ "102600141743718403" ] ``` ### リモートデータベースへの接続 MySQL](../../sql-reference/table-functions/mysql.md) または [PostgreSQL](../../sql-reference/table-functions/postgresql.md) テーブル関数を使用して、ClickHouse Cloud からGCPにホストされたデータベースに接続しようとしているとします。GCP PSC はこの接続を安全に有効にするために使用できません。PSC は一方向で、単方向接続です。内部ネットワークやGCP VPCが ClickHouse Cloud に安全に接続できるようにしますが、ClickHouse Cloud から内部ネットワークに接続することはできません。 [GCP Private Service Connect ドキュメント](https://cloud.google.com/vpc/docs/private-service-connect) によると: > サービス指向の設計: プロデューサーサービスは、消費者VPCネットワークに単一の IP アドレスを公開するロードバランサーを通じて公開されます。プロデューサーサービスにアクセスする消費者トラフィックは単方向であり、ピアリングされたVPCネットワーク全体にアクセスするのではなく、サービスIPアドレスのみにアクセスできます。 このためには、ClickHouse Cloud から内部/プライベートデータベースサービスへの接続を許可するように GCP VPC のファイアウォールルールを構成してください。ClickHouse Cloud リージョンの[デフォルトのEgress IPアドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api)と利用可能な[静的 IP アドレス](https://api.clickhouse.cloud/static-ips.json)を確認してください。 ## 詳細情報 詳細な情報については、[cloud.google.com/vpc/docs/configure-private-service-connect-services](https://cloud.google.com/vpc/docs/configure-private-service-connect-services) を参照してください。