ClickHouse/docs/ja/cloud/security/gcp-private-service-connect.md
2024-11-18 11:58:58 +09:00

21 KiB
Raw Blame History

title description sidebar_label slug
GCP Private Service Connect この文書は、Google Cloud Platform (GCP) の Private Service Connect (PSC) を使用して ClickHouse Cloud に接続する方法、および GCP PSC アドレス以外のアドレスから ClickHouse Cloud サービスへのアクセスを ClickHouse Cloud IP アクセスリストを使用して無効にする方法を説明します。 GCP Private Service Connect /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

:::important デフォルトでは、PSC 接続が承認され確立されていても、ClickHouse サービスは Private Service 接続からは利用できません。インスタンスレベルで PSC ID を許可リストに明示的に追加する必要があります。ステップを完了してください。 :::

:::note GCP Private Service Connect は ClickHouse Cloud Production サービスでのみ有効にできます。 :::

リージョン間の接続はサポートされていません。提供者と消費者のリージョンは同じでなければなりません。PSC レベルでグローバルアクセスを有効にすれば、自分の VPC 内の他のリージョンからでも接続できるようになります(以下を参照)。

このプロセスは以下の4つのステップに分かれています

  1. Private Service Connect用のGCPサービスアタッチメントを取得します。
  2. サービスエンドポイントを作成します。
  3. Endpoint ID を ClickHouse Cloud 組織に追加します。
  4. 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 を使用する場合、以下の環境変数を設定してから進めてください:

export REGION=us-central1
export PROVIDER=gcp
export KEY_ID=<Key ID>
export KEY_SECRET=<Key secret>
export ORG_ID=<ClickHouse organization 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)から取得可能です。
  • 新しいキーを作成するか、既存のものを使用できます。 :::

GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得する

オプション 1: ClickHouse Cloud コンソール

ClickHouse Cloud コンソールで、Private Service Connect 経由で接続したいサービスを開き、設定 メニューを開きます。プライベートエンドポイントを設定する ボタンをクリックします。サービス名 (endpointServiceId) と DNS 名 (privateDnsHostname) をメモしておいてください。次のステップで使用します。

Private Endpoints

オプション 2: API

:::note このステップを実行するために、少なくとも1つのインスタンスがリージョン内でデプロイされている必要があります。 :::

GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得します:

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"
}

endpointServiceIdprivateDnsHostname をメモしておいてください。次のステップで使用します。

サービスエンドポイントを作成する

このセクションでは、サービスエンドポイントを作成します。

Private Service Connection の追加

まず最初に、Private Service Connection を作成します。

オプション 1: Google Cloud コンソールを使用する

Google Cloud コンソールで、Network services -> Private Service Connect に移動します。

Open PSC

Connect Endpoint ボタンをクリックして、Private Service Connect 作成ダイアログを開きます。

  • Target: Published service を使用してください
  • Target service: Private Service Connect 用の GCP サービスアタッチメント取得 ステップの 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

ADD ENDPOINT ボタンを使って PSC エンドポイントを作成します。

接続が承認されると、Status 列が Pending から Accepted に変わります。

Accepted

PSC Connection ID をコピーします。この ID を次のステップで Endpoint ID として使用します。

オプション 2: Terraform を使用する

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 サービスアタッチメント取得 ステップでの endpointServiceId を使用してください。 :::

DNS の設定

Google Cloud コンソールを使用するものと gcloud CLI を使用するものの2つのオプションがあります。

オプション 1: Google Cloud コンソールを使用する

  • Supported regions からプライベート DNS ゾーンを作成します。
  • Network services -> Cloud DNS を開きます。
  • Create Zone を選択します:

Create Zone

ゾーンタイプダイアログで以下を設定します:

  • ゾーンタイプ: Private
  • ゾーン名: 適切なゾーン名を入力します。
  • DNS 名: Supported regions テーブルの Private DNS domain 列をリージョンに合わせて使用します。
  • ネットワーク: ClickHouse Cloud に PSC を使って接続する予定のネットワークに DNS ゾーンをアタッチします。

Zone Type

プライベート DNS ゾーンでの DNS レコードの作成

Private Service Connection の追加 ステップで作成した IP アドレスを指すように設定します。

DNS Record

オプション 2: gcloud CLI を使用する

DNS ゾーンの作成

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 レコードの作成

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 サービスアタッチメント取得 ステップでの privateDnsHostname を使用します。 :::

オプション 3: Terraform を使用する

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 サービスアタッチメント取得 ステップでの privateDnsHostname を使用します。 :::

DNS 設定の確認

DNS_RECORD - Private Service Connect 用の GCP サービスアタッチメント取得 ステップでの privateDnsHostname を使用します。

ping $DNS_RECORD

Endpoint ID を ClickHouse Cloud 組織に追加する

オプション 1: ClickHouse Cloud コンソール

組織にエンドポイントを追加するには、サービスの許可リストに Endpoint ID を追加 ステップに進みます。ClickHouse Cloud コンソールを使用して許可リストに PSC Connection ID を追加すると、組織にも自動的に追加されます。

エンドポイントを削除するには、Organization details -> Private Endpoints を開き、削除ボタンをクリックしてエンドポイントを削除します。

endpoints

オプション 2: API

コマンドを実行する前に次の環境変数を設定します:

ENDPOINT_ID を、Private Service Connection の追加 ステップでの Endpoint ID の値に置き換えます。

エンドポイントを追加するには、以下を実行します:

cat <<EOF | tee pl_config_org.json
{
  "privateEndpoints": {
    "add": [
      {
        "cloudProvider": "gcp",
        "id": "${ENDPOINT_ID:?}",
        "description": "A GCP private endpoint",
        "region": "${REGION:?}"
      }
    ]
  }
}
EOF

エンドポイントを削除するには、以下を実行します:

cat <<EOF | tee pl_config_org.json
{
  "privateEndpoints": {
    "remove": [
      {
        "cloudProvider": "gcp",
        "id": "${ENDPOINT_ID:?}",
        "region": "${REGION:?}"
      }
    ]
  }
}
EOF

組織に Private Endpoint を追加/削除します:

curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X PATCH -H "Content-Type: application/json" https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?} -d @pl_config_org.json

サービスの許可リストに Endpoint ID を追加する

Private Service Connect を使用できるようにするには、各インスタンスに Endpoint ID を許可リストに追加する必要があります。

:::note このステップは開発サービスには実行できません。 :::

オプション 1: ClickHouse Cloud コンソール

ClickHouse Cloud コンソールで、Private Service Connect 経由で接続したいサービスを開き、設定 に移動します。Private Service Connection の追加 ステップから取得した Endpoint ID を入力します。エンドポイントの作成 をクリックします。

:::note 既存の Private Service Connect 接続からのアクセスを許可する場合は、既存のエンドポイントドロップダウンメニューを使用してください。 :::

Private Endpoints

オプション 2: API

コマンドを実行する前に次の環境変数を設定します:

Private Service Connection の追加 ステップでの Endpoint ID の値に ENDPOINT_ID を置き換えます。

Private Service Connect を使用できるようにする各サービスに対して実行します。

追加:

cat <<EOF | tee pl_config.json
{
  "privateEndpointIds": {
    "add": [
      "${ENDPOINT_ID}"
    ]
  }
}
EOF

削除:

cat <<EOF | tee pl_config.json
{
  "privateEndpointIds": {
    "remove": [
      "${ENDPOINT_ID}"
    ]
  }
}
EOF
curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X PATCH -H "Content-Type: application/json" https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?} -d @pl_config.json | jq

Private Service Connect を使用したインスタンスへのアクセス

Private Service Connect フィルターが設定された各インスタンスには、パブリックエンドポイントとプライベートエンドポイントの2つのエンドポイントがあります。Private Service Connect を使用して接続するには、プライベートエンドポイントを使用する必要があります。Private Service Connect 用の GCP サービスアタッチメント取得 ステップでの endpointServiceId を参照してください。

:::note プライベートDNSホスト名はGCP VPC内からのみ利用可能です。GCP VPC外のマシンからDNSホストを解決しようとしないでください。 :::

プライベートDNSホスト名の取得

オプション 1: ClickHouse Cloud コンソール

ClickHouse Cloud コンソールで、設定 に移動します。プライベートエンドポイントを設定する ボタンをクリックします。開かれたパネルで DNS 名 をコピーします。

Private Endpoints

オプション 2: API

curl --silent --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services/$INSTANCE_ID/privateEndpointConfig | jq  .result 
{
  ...
  "privateDnsHostname": "xxxxxxx.<region code>.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 サービスアタッチメント取得 ステップでの privateDnsHostname を使用します。

nslookup $DNS_NAME
Non-authoritative answer:
...
Address: 10.128.0.2

Connection reset by peer

接続テスト

PSCリンクを使用して接続する際に問題がある場合は、openssl を使用して接続をテストしてください。Private Service Connect エンドポイントのステータスが Accepted であることを確認してください:

OpenSSL は接続できるはずです(出力に CONNECTED が表示されます)。errno=104 は予期されたものです。

DNS_NAME - Private Service Connect 用の GCP サービスアタッチメント取得 ステップでの privateDnsHostname を使用します。

openssl s_client -connect ${DNS_NAME}:9440
# 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

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 テーブル関数を使用して、ClickHouse Cloud からGCPにホストされたデータベースに接続しようとしているとします。GCP PSC はこの接続を安全に有効にするために使用できません。PSC は一方向で、単方向接続です。内部ネットワークやGCP VPCが ClickHouse Cloud に安全に接続できるようにしますが、ClickHouse Cloud から内部ネットワークに接続することはできません。

GCP Private Service Connect ドキュメント によると:

サービス指向の設計: プロデューサーサービスは、消費者VPCネットワークに単一の IP アドレスを公開するロードバランサーを通じて公開されます。プロデューサーサービスにアクセスする消費者トラフィックは単方向であり、ピアリングされたVPCネットワーク全体にアクセスするのではなく、サービスIPアドレスのみにアクセスできます。

このためには、ClickHouse Cloud から内部/プライベートデータベースサービスへの接続を許可するように GCP VPC のファイアウォールルールを構成してください。ClickHouse Cloud リージョンのデフォルトのEgress IPアドレスと利用可能な静的 IP アドレスを確認してください。

詳細情報

詳細な情報については、cloud.google.com/vpc/docs/configure-private-service-connect-services を参照してください。