mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-14 18:32:29 +00:00
489 lines
21 KiB
Markdown
489 lines
21 KiB
Markdown
---
|
||
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=<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)から取得可能です。
|
||
- [新しいキーを作成](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 <<EOF | tee pl_config_org.json
|
||
{
|
||
"privateEndpoints": {
|
||
"add": [
|
||
{
|
||
"cloudProvider": "gcp",
|
||
"id": "${ENDPOINT_ID:?}",
|
||
"description": "A GCP private endpoint",
|
||
"region": "${REGION:?}"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
エンドポイントを削除するには、以下を実行します:
|
||
|
||
```bash
|
||
cat <<EOF | tee pl_config_org.json
|
||
{
|
||
"privateEndpoints": {
|
||
"remove": [
|
||
{
|
||
"cloudProvider": "gcp",
|
||
"id": "${ENDPOINT_ID:?}",
|
||
"region": "${REGION:?}"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
組織に Private Endpoint を追加/削除します:
|
||
|
||
```bash
|
||
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 の追加](#adding-a-private-service-connection) ステップから取得した `Endpoint ID` を入力します。**エンドポイントの作成** をクリックします。
|
||
|
||
:::note
|
||
既存の Private Service Connect 接続からのアクセスを許可する場合は、既存のエンドポイントドロップダウンメニューを使用してください。
|
||
:::
|
||
|
||
![Private Endpoints](./images/gcp-privatelink-pe-filters.png)
|
||
|
||
|
||
### オプション 2: API
|
||
|
||
コマンドを実行する前に次の環境変数を設定します:
|
||
|
||
[Private Service Connection の追加](#adding-a-private-service-connection) ステップでの **Endpoint ID** の値に **ENDPOINT_ID** を置き換えます。
|
||
|
||
Private Service Connect を使用できるようにする各サービスに対して実行します。
|
||
|
||
追加:
|
||
|
||
```bash
|
||
cat <<EOF | tee pl_config.json
|
||
{
|
||
"privateEndpointIds": {
|
||
"add": [
|
||
"${ENDPOINT_ID}"
|
||
]
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
削除:
|
||
|
||
```bash
|
||
cat <<EOF | tee pl_config.json
|
||
{
|
||
"privateEndpointIds": {
|
||
"remove": [
|
||
"${ENDPOINT_ID}"
|
||
]
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
```bash
|
||
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 サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **endpointServiceId** を参照してください。
|
||
|
||
:::note
|
||
プライベートDNSホスト名はGCP VPC内からのみ利用可能です。GCP VPC外のマシンからDNSホストを解決しようとしないでください。
|
||
:::
|
||
|
||
### プライベートDNSホスト名の取得
|
||
|
||
#### オプション 1: ClickHouse Cloud コンソール
|
||
|
||
ClickHouse Cloud コンソールで、**設定** に移動します。**プライベートエンドポイントを設定する** ボタンをクリックします。開かれたパネルで **DNS 名** をコピーします。
|
||
|
||
![Private Endpoints](./images/gcp-privatelink-pe-dns.png)
|
||
|
||
|
||
#### オプション 2: API
|
||
|
||
```bash
|
||
curl --silent --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services/$INSTANCE_ID/privateEndpointConfig | jq .result
|
||
```
|
||
|
||
```response
|
||
{
|
||
...
|
||
"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 サービスアタッチメント取得](#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) を参照してください。
|