メインコンテンツへスキップ
メインコンテンツへスキップ

AWS PrivateLink

Scale plan feature

AWS PrivateLink is available in the Scale and Enterprise plans. To upgrade, visit the plans page in the cloud console.

AWS PrivateLink を使用すると、VPC、AWS サービス、オンプレミスシステム、および ClickHouse Cloud 間で、安全な接続を確立しつつ、トラフィックをパブリックインターネット上に公開せずに済みます。本ドキュメントでは、AWS PrivateLink を使用して ClickHouse Cloud に接続する手順を説明します。

ClickHouse Cloud サービスへのアクセスを AWS PrivateLink アドレス経由のみに制限するには、ClickHouse Cloud の IP Access Lists に関する手順に従ってください。

注記

ClickHouse Cloud は、以下のリージョンからの クロスリージョン PrivateLink をサポートしています:

  • sa-east-1
  • il-central-1
  • me-central-1
  • me-south-1
  • eu-central-2
  • eu-north-1
  • eu-south-2
  • eu-west-3
  • eu-south-1
  • eu-west-2
  • eu-west-1
  • eu-central-1
  • ca-west-1
  • ca-central-1
  • ap-northeast-1
  • ap-southeast-2
  • ap-southeast-1
  • ap-northeast-2
  • ap-northeast-3
  • ap-south-1
  • ap-southeast-4
  • ap-southeast-3
  • ap-south-2
  • ap-east-1
  • af-south-1
  • us-west-2
  • us-west-1
  • us-east-2
  • us-east-1 料金に関する注意: クロスリージョン間のデータ転送については AWS から課金されます。料金の詳細はこちらを参照してください。

AWS PrivateLink を有効にするには、次を実施してください:

  1. エンドポイントの「Service name」を取得する。
  2. AWS Endpoint を作成する。
  3. ClickHouse Cloud の組織に「Endpoint ID」を追加する。
  4. ClickHouse サービスの許可リストに「Endpoint ID」を追加する。

Terraform のサンプルはこちらを参照してください。

重要な考慮事項

ClickHouse は、AWS リージョン内で同じ公開済みの サービスエンドポイント を再利用できるよう、サービスをグループ化しようとします。ただし、このグループ化が常に保証されるわけではなく、特にサービスを複数の ClickHouse 組織に分散している場合には当てはまらないことがあります。 すでに同じ ClickHouse 組織内の他のサービス向けに PrivateLink を構成済みの場合は、そのグループ化により多くの手順を省略できることが多く、最終ステップである「ClickHouse のエンドポイント ID を ClickHouse サービスの許可リストに追加する」に直接進むことができます。

この手順の前提条件

作業を開始する前に、次のものを用意してください。

  1. 利用可能な AWS アカウント
  2. ClickHouse 側でプライベートエンドポイントを作成および管理するために必要な権限を持つ ClickHouse API キー

手順

次の手順に従って、AWS PrivateLink 経由で ClickHouse Cloud サービスに接続します。

エンドポイントの「Service name」を取得する

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

ClickHouse Cloud コンソールで、PrivateLink 経由で接続したいサービスを開き、Settings メニューに移動します。

Private Endpoints

Service nameDNS name をメモしたら、次のステップに進みます

オプション 2: API

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

REGION=<AWSフォーマットを使用したリージョンコード、例: us-west-2>
PROVIDER=aws
KEY_ID=<ClickHouseキーID>
KEY_SECRET=<ClickHouseキーシークレット>
ORG_ID=<ClickHouse組織ID>
SERVICE_NAME=<ClickHouseサービス名>

リージョン、プロバイダー、サービス名で絞り込んで ClickHouse の INSTANCE_ID を取得します。

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:?}\" and .name==\"${SERVICE_NAME:?}\") | .id " -r)

PrivateLink 構成用の endpointServiceIdprivateDnsHostname を取得します。

curl --silent --user "${KEY_ID:?}:${KEY_SECRET:?}" \
"https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig" | \
jq .result

このコマンドを実行すると、次のような出力が得られます。

{
  "endpointServiceId": "com.amazonaws.vpce.us-west-2.vpce-svc-xxxxxxxxxxxxxxxxx",
  "privateDnsHostname": "xxxxxxxxxx.us-west-2.vpce.aws.clickhouse.cloud"
}

endpointServiceIdprivateDnsHostname を控えてから、次のステップに進みます

AWS エンドポイントを作成する

参考文献

このセクションでは、AWS PrivateLink を介して ClickHouse を構成するための、ClickHouse 固有の詳細について説明します。AWS 固有の手順は、どこを参照すべきかを示すための参考情報として提供しているものであり、AWS クラウドプロバイダからの事前通知なしに変更される可能性があります。ご利用のユースケースに基づいて、適切に AWS の設定を行ってください。

必要な AWS VPC エンドポイント、セキュリティグループルール、DNS レコードの構成については、ClickHouse は責任を負いません。

以前に PrivateLink のセットアップ時に「private DNS names」を有効にしており、PrivateLink 経由で新しいサービスを構成する際に問題が発生している場合は、ClickHouse サポートにお問い合わせください。その他の AWS 設定作業に関連する問題については、AWS サポートへ直接お問い合わせください。

オプション 1: AWS コンソール

AWS コンソールを開き、VPCEndpointsCreate endpoints に移動します。

Endpoint services that use NLBs and GWLBs を選択し、Service Name フィールドに、Obtain Endpoint "Service name" の手順で取得した Service nameconsole または endpointServiceIdAPI を指定します。Verify service をクリックします。

AWS PrivateLink エンドポイント設定

PrivateLink を介してリージョンをまたいだ接続を確立したい場合は、「Cross region endpoint」チェックボックスを有効にし、サービスリージョンを指定します。サービスリージョンは、ClickHouse インスタンスが動作しているリージョンです。

「Service name could not be verified.」というエラーが表示された場合は、サポート対象リージョンへの新規リージョン追加を依頼するために、カスタマーサポートにお問い合わせください。

次に、VPC とサブネットを選択します。

VPC とサブネットの選択

任意の手順として、Security groups/Tags を割り当てます。

注記

セキュリティグループで、ポート 443, 8443, 9440, 3306 が許可されていることを確認してください。

VPC エンドポイントを作成したら、Endpoint ID の値を控えておきます。次のステップで必要になります。

VPC エンドポイント ID

オプション 2: AWS CloudFormation

次に、エンドポイントの「Service name」を取得 の手順で取得した Service nameconsole または endpointServiceIdAPI を使用して、VPC エンドポイントを作成する必要があります。 正しいサブネット ID、セキュリティグループ、および VPC ID を使用していることを確認してください。

Resources:
  ClickHouseInterfaceEndpoint:
    Type: 'AWS::EC2::VPCEndpoint'
    Properties:
      VpcEndpointType: Interface
      PrivateDnsEnabled: false
      ServiceName: <サービス名(endpointServiceId)、上記参照>
      VpcId: vpc-vpc_id
      SubnetIds:
        - subnet-subnet_id1
        - subnet-subnet_id2
        - subnet-subnet_id3
      SecurityGroupIds:
        - sg-security_group_id1
        - sg-security_group_id2
        - sg-security_group_id3

VPC エンドポイントを作成したら、Endpoint ID の値を控えておいてください。後続のステップで必要になります。

オプション 3: Terraform

以下の service_name には、Obtain Endpoint "Service name" のステップで取得した Service nameconsole または endpointServiceIdAPI を指定します。

resource "aws_vpc_endpoint" "this" {
  vpc_id            = var.vpc_id
  service_name      = "<pls see comment above>"
  vpc_endpoint_type = "Interface"
  security_group_ids = [
    Var.security_group_id1,var.security_group_id2, var.security_group_id3,
  ]
  subnet_ids          = [var.subnet_id1,var.subnet_id2,var.subnet_id3]
  private_dns_enabled = false
  service_region      = "(オプション) 指定した場合、VPCエンドポイントは指定されたリージョン内のサービスに接続します。複数リージョンにまたがるPrivateLink接続を構成する際に定義してください。"
}

VPC Endpoint を作成したら、Endpoint ID の値を控えておいてください。後続の手順で必要になります。

エンドポイントのプライベート DNS 名を設定する

注記

DNS の構成方法はいくつかあります。ご利用のユースケースに応じて、適切に DNS を構成してください。

Obtain Endpoint "Service name" の手順で取得した「DNS name」が、AWS Endpoint のネットワークインターフェイスを指すように設定する必要があります。これにより、VPC/ネットワーク内のサービスやコンポーネントから、正しく名前解決できるようになります。

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

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

追加するには、ClickHouse Cloud コンソールに移動し、PrivateLink 経由で接続したいサービスを開いてから、Settings に移動します。Set up private endpoint をクリックしてプライベートエンドポイントの設定を開きます。Create AWS Endpoint の手順で取得した Endpoint ID を入力します。最後に "Create endpoint" をクリックします。

注記

既存の PrivateLink 接続からのアクセスを許可したい場合は、既存のエンドポイントをドロップダウンメニューから選択してください。

Private Endpoints フィルター

削除するには、ClickHouse Cloud コンソールに移動し、対象のサービスを見つけてその Settings に移動し、削除したいエンドポイントを探します。エンドポイントの一覧からそのエンドポイントを削除します。

オプション 2: API

PrivateLink 経由で利用可能にする必要がある各インスタンスについて、その許可リストに Endpoint ID を追加する必要があります。

Create AWS Endpoint の手順で取得した情報を使用して、ENDPOINT_ID 環境変数を設定します。

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

REGION=<AWS 形式を使用したリージョンコード (例: us-west-2)>
PROVIDER=aws
KEY_ID=<ClickHouse のキー ID>
KEY_SECRET=<ClickHouse のキーシークレット>
ORG_ID=<ClickHouse の組織 ID>
SERVICE_NAME=<ClickHouse のサービス名>

許可リストにエンドポイント ID を追加するには、次の手順を実行します。

cat <<EOF | tee pl_config.json
{
  "privateEndpointIds": {
    "add": [
      "${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

許可リストからエンドポイント ID を削除するには、次の手順を実行します。

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

PrivateLink を有効にした各サービスには、パブリックエンドポイントとプライベートエンドポイントがあります。PrivateLink を使用して接続するには、プライベートエンドポイントを使用する必要があります。これは privateDnsHostnameAPI または DNS Nameconsole のいずれかであり、エンドポイント "Service name" の取得 で確認できます。

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

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

ClickHouse Cloud コンソールで Settings に移動します。Set up private endpoint ボタンをクリックします。開いたフライアウトで DNS Name をコピーします。

プライベートエンドポイントの DNS 名
オプション 2: API

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

KEY_ID=<あなたのClickHouseキーID>
KEY_SECRET=<あなたのClickHouseキーシークレット>
ORG_ID=<あなたのClickHouse組織ID>
INSTANCE_ID=<あなたのClickHouseサービス名>

INSTANCE_IDこちらの手順から取得できます。

curl --silent --user "${KEY_ID:?}:${KEY_SECRET:?}" \
"https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig" | \
jq .result

次のような出力が得られるはずです:

{
  "endpointServiceId": "com.amazonaws.vpce.us-west-2.vpce-svc-xxxxxxxxxxxxxxxxx",
  "privateDnsHostname": "xxxxxxxxxx.us-west-2.vpce.aws.clickhouse.cloud"
}

この例では、privateDnsHostname の値に対応するホスト名での接続は PrivateLink 経由でルーティングされますが、endpointServiceId に対応するホスト名での接続はインターネット経由でルーティングされます。

トラブルシューティング

ほとんどのケースでは、各 VPC ごとに 1 つのエンドポイントサービスを作成するだけで十分です。このエンドポイントを介して、その VPC から複数の ClickHouse Cloud サービスへリクエストをルーティングできます。 こちらを参照してください。

プライベートエンドポイントへの接続がタイムアウトする

  • VPC エンドポイントにセキュリティグループがアタッチされていることを確認してください。
  • VPC エンドポイントにアタッチされているセキュリティグループの inbound ルールを確認し、ClickHouse のポートを許可してください。
  • 接続テストに使用している VM にアタッチされているセキュリティグループの outbound ルールを確認し、ClickHouse のポートへの接続を許可してください。

Private Hostname: Not found address of host

  • DNS 設定を確認してください。

Connection reset by peer

  • 多くの場合、エンドポイント ID がサービスの許可リストに追加されていません。この手順を参照してください。

エンドポイントフィルタの確認

コマンドを実行する前に、次の環境変数を設定してください。

KEY_ID=<キーID>
KEY_SECRET=<キーシークレット>
ORG_ID=<ClickHouse組織IDを設定>
INSTANCE_ID=<インスタンスID>

INSTANCE_IDこちらの手順から取得できます。

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

リモートデータベースへの接続

MySQL または PostgreSQL のテーブル関数を ClickHouse Cloud で使用し、Amazon Web Services (AWS) の VPC 内でホストしているデータベースに接続しようとしているとします。AWS PrivateLink を使用して、この接続を安全に確立することはできません。PrivateLink は一方向の単方向接続であり、内部ネットワークまたは Amazon VPC から ClickHouse Cloud へのセキュアな接続は可能ですが、ClickHouse Cloud から内部ネットワークへの接続はできません。

AWS PrivateLink のドキュメント には次のように記載されています:

クライアント/サーバー構成において、1 つ以上のコンシューマー VPC から、サービスプロバイダー VPC 内の特定のサービスまたはインスタンス群への一方向アクセスを許可したい場合に AWS PrivateLink を使用します。接続を開始できるのは、コンシューマー VPC 内のクライアントからサービスプロバイダー VPC 内のサービスに対してのみです。

これを実現するには、AWS のセキュリティグループを構成し、ClickHouse Cloud から内部/プライベートなデータベースサービスへの接続を許可します。ClickHouse Cloud リージョンのデフォルト送信 (egress) IP アドレス と、利用可能な固定 IP アドレス を確認してください。