メインコンテンツまでスキップ
メインコンテンツまでスキップ

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アクセスリストに記載された手順に従ってください。

注記

ClickHouse Cloudは、現在クロスリージョンPrivateLinkのベータ版をサポートしています。

AWS PrivateLinkを有効にするには、次の手順を完了してください

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

Terraformの例はこちらでご確認いただけます。

注意

ClickHouseは、AWSリージョン内で同じ公開されたサービスエンドポイントを再利用するためにサービスをグループ化しようとします。ただし、このグループ化は保証されておらず、特に複数のClickHouse組織にサービスを分散させた場合は特にそうです。 既にClickHouse組織内の他のサービスに対してPrivateLinkが設定されている場合、そのグループ化のためにほとんどの手順をスキップし、最終手順「ClickHouseの「エンドポイントID」をClickHouseサービスの許可リストに追加」に直接進むことが可能です。

前提条件

始める前に、必要なものは次のとおりです:

  1. あなたのAWSアカウント。
  2. ClickHouse APIキーで、ClickHouse側でプライベートエンドポイントを作成および管理するために必要な権限を持っていること。

手順

AWS PrivateLinkを介してClickHouse Cloudサービスに接続するための手順は以下の通りです。

エンドポイント「サービス名」を取得

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

ClickHouse Cloudコンソールで、PrivateLinkを介して接続したいサービスを開き、次に設定メニューに移動します。

プライベートエンドポイント

サービス名DNS名をメモし、次のステップに移動します

オプション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)

プライベートリンク構成のために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構成を検討してください。

ClickHouseは、必要なAWS VPCエンドポイント、セキュリティグループのルール、またはDNSレコードの設定に対して責任を負わないことに注意してください。

以前にPrivateLinkの設定中に「プライベートDNS名」を有効にしており、新しいサービスをPrivateLink経由で構成する際に問題が発生した場合は、ClickHouseサポートにお問い合わせください。他のAWSの設定作業に関する問題については、直接AWSサポートに連絡してください。

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

AWSコンソールを開き、VPCエンドポイントエンドポイントを作成に移動します。

NLBおよびGWLBを使用するエンドポイントサービスを選択し、エンドポイント「サービス名」ステップで取得したサービス名コンソールまたはendpointServiceIdAPIサービス名フィールドに入力します。サービスの確認をクリックします:

AWS PrivateLinkエンドポイント設定

PrivateLinkを介してクロスリージョン接続を確立したい場合は、「クロスリージョンエンドポイント」のチェックボックスを有効にし、サービスリージョンを指定します。サービスリージョンはClickHouseインスタンスが稼働している場所です。

「サービス名を確認できませんでした。」というエラーメッセージが表示された場合は、新しいリージョンをサポートされているリージョンリストに追加するようカスタマーサポートにお問い合わせください。

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

VPCとサブネットの選択

オプションのステップとして、セキュリティグループ/タグを割り当てます:

注記

ポート443844394403306がセキュリティグループ内で許可されていることを確認してください。

VPCエンドポイントを作成した後、エンドポイントIDの値をメモします。次のステップで必要になります。

VPCエンドポイントID

オプション2: AWS CloudFormation

次に、エンドポイント「サービス名」ステップで取得したサービス名コンソールまたは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エンドポイントを作成した後、エンドポイントIDの値をメモします。次のステップで必要になります。

オプション3: Terraform

以下のservice_nameは、エンドポイント「サービス名」ステップで取得したサービス名コンソールまたはendpointServiceIdAPIです。

resource "aws_vpc_endpoint" "this" {
  vpc_id            = var.vpc_id
  service_name      = "<上記のコメントを参照>"
  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エンドポイントを作成した後、エンドポイントIDの値をメモします。次のステップで必要になります。

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

注記

DNSを設定する方法は多岐にわたります。特定のユースケースに応じてDNSを設定してください。

エンドポイント「サービス名」ステップから取得した「DNS名」をAWSエンドポイントネットワークインターフェースにポイントする必要があります。これにより、VPC/ネットワーク内のサービス/コンポーネントが正しくそれを解決できるようになります。

「エンドポイントID」をClickHouseサービスの許可リストに追加

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

追加するには、ClickHouse Cloudコンソールに移動し、PrivateLink経由で接続したいサービスを開いて、次に設定に移動します。プライベートエンドポイントを設定をクリックして、プライベートエンドポイント設定を開きます。Create AWS Endpointステップで取得したエンドポイントIDを入力します。「エンドポイントを作成」をクリックします。

注記

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

プライベートエンドポイントフィルター

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

オプション2: API

プライベートリンクを使用して利用可能にする必要がある各インスタンスにエンドポイント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

Private Linkが有効になっている各サービスには、パブリックおよびプライベートエンドポイントがあります。Private Linkを使用して接続するには、エンドポイント「サービス名」を取得から取得したprivateDnsHostnameAPIまたはDNS名コンソールであるプライベートエンドポイントを使用する必要があります。

プライベートDNSホスト名を取得する

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

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

プライベートエンドポイント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のために単一のエンドポイントサービスを作成する必要があります。このエンドポイントは、VPCから複数のClickHouse Cloudサービスへのリクエストをルーティングできます。 こちらを参照してください。

プライベートエンドポイントへの接続がタイムアウトしました

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

プライベートホスト名: ホストのアドレスが見つかりません

  • DNS構成を確認してください。

ピアによる接続リセット

  • おそらくエンドポイント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

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

たとえば、ClickHouse CloudでMySQLまたはPostgreSQLテーブル関数を使用して、Amazon Web Services (AWS) VPCにホストされているデータベースに接続しようとしている場合、AWS PrivateLinkを使用してこの接続を安全に有効にすることはできません。PrivateLinkは一方向の単方向接続です。あなたの内部ネットワークまたはAmazon VPCがClickHouse Cloudに安全に接続できるようにしますが、ClickHouse Cloudが内部ネットワークに接続することはできません。

AWS PrivateLinkのドキュメントによると:

AWS PrivateLinkを使用するのは、クライアント/サーバーのセットアップがあり、特定のサービスまたはサービスプロバイダーVPC内のインスタンスのセットに対して1つ以上の消費者VPCによる単方向のアクセスを許可したい場合です。消費者VPC内のクライアントのみが、サービスプロバイダーVPC内のサービスへの接続を開始できます。

これを実現するために、AWSセキュリティグループを構成して、ClickHouse Cloudから内部/プライベートデータベースサービスへの接続を許可する必要があります。ClickHouse CloudリージョンのデフォルトのイーグレスIPアドレスや、利用可能な静的IPアドレスを確認してください。