Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

AWS PrivateLink

Scale 计划功能

AWS PrivateLink 仅在 Scale 和 Enterprise 计划中可用。要升级,请访问 Cloud Console 中的计划页面。

您可以使用 AWS PrivateLink 在 VPC、AWS 服务、您的本地系统以及 ClickHouse Cloud 之间建立安全连接,而无需将流量暴露到公共互联网。本文档概述了通过 AWS PrivateLink 连接到 ClickHouse Cloud 的步骤。

若要将对您的 ClickHouse Cloud 服务的访问限制为仅可通过 AWS PrivateLink 地址进行,请按照 ClickHouse Cloud IP Access Lists 中提供的说明操作。

ClickHouse Cloud 支持为托管在以下 AWS 区域中的服务使用跨区域 PrivateLink:

该表仅涵盖服务托管区域。消费者接口 VPC 端点所在区域采用单独的允许列表;例如,尽管托管在 mx-central-1 的服务无法启用跨区域访问,mx-central-1 仍是允许的消费者区域。

区域代码 区域名称
af-south-1 非洲 (开普敦)
ap-east-1 亚太地区 (香港)
ap-northeast-1 亚太地区 (东京)
ap-northeast-2 亚太地区 (首尔)
ap-south-1 亚太地区 (孟买)
ap-southeast-1 亚太地区 (新加坡)
ap-southeast-2 亚太地区 (悉尼)
ap-southeast-3 亚太地区 (雅加达)
ap-southeast-5 亚太地区 (马来西亚)
ca-central-1 加拿大 (中部)
eu-central-1 欧洲 (法兰克福)
eu-north-1 欧洲 (斯德哥尔摩)
eu-west-1 欧洲 (爱尔兰)
eu-west-2 欧洲 (伦敦)
il-central-1 以色列 (特拉维夫)
me-central-1 中东 (阿联酋)
sa-east-1 南美洲 (圣保罗)
us-east-1 美国东部 (北弗吉尼亚)
us-east-2 美国东部 (俄亥俄)
us-west-2 美国西部 (俄勒冈)

请完成以下步骤以启用 AWS PrivateLink:

  1. 获取端点 "Service name"。
  2. 创建 AWS endpoint。
  3. 将 "Endpoint ID" 添加到 ClickHouse Cloud 组织。
  4. 将 "Endpoint ID" 添加到 ClickHouse 服务允许列表。

可在此处找到 Terraform 示例。

重要注意事项

ClickHouse 会尝试将您的服务分组,以便在同一 AWS 区域内复用已发布的服务端点。不过,这种分组并不一定能保证,尤其是在您将服务分布到多个 ClickHouse organizations 中时。 如果您所在的 ClickHouse organization 中的其他服务已经配置了 PrivateLink,通常就可以借助这种分组跳过大部分步骤,直接进入最后一步:将 ClickHouse “Endpoint ID” 添加到 ClickHouse 服务允许列表中。

此流程的前置条件

开始之前,您需要准备:

  1. 您的 AWS 账户。
  2. 具备在 ClickHouse 端创建和管理专用终结点所需权限的 ClickHouse API key。

步骤

按照以下步骤,通过 AWS PrivateLink 连接您的 ClickHouse Cloud 服务。

获取端点“Service name”信息

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,打开要通过 PrivateLink 连接的服务,然后前往 设置 菜单。

专用终结点

记下 Service name 和 DNS name,然后进入下一步。

选项 2:API

首先,在运行任何命令前,请先设置以下环境变量:

REGION=<Your region code using the AWS format, for example: us-west-2>
PROVIDER=aws
KEY_ID=<Your ClickHouse key ID>
KEY_SECRET=<Your ClickHouse key secret>
ORG_ID=<Your ClickHouse organization ID>
SERVICE_NAME=<Your ClickHouse service name>

按区域、提供商和服务名称筛选,以获取你的 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 配置所需的 endpointServiceId 和 privateDnsHostname:

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

记下 endpointServiceId 和 privateDnsHostname,然后进入下一步。

创建 AWS endpoint

选项 1:AWS 控制台

打开 AWS 控制台,前往 VPC → Endpoints → Create endpoints。

选择 Endpoint services that use NLBs and GWLBs,然后在 Service Name 字段中填入您在 获取 Endpoint“Service name” 步骤中获得的 Service nameconsole 或 endpointServiceIdAPI。点击 Verify service:

AWS PrivateLink 端点设置

如果出现 “Service name couldn't be verified.” 错误,请联系 Customer Support,申请将新区域添加到 supported regions 列表中。

接下来,选择您的 VPC 和子网:

选择 VPC 和子网

作为可选步骤,分配安全组 (Security Group) /标签:

创建 VPC 端点后,请记下 Endpoint ID 的值;后续步骤中会用到它。

VPC Endpoint ID

选项 2:AWS CloudFormation

接下来,您需要使用在获取端点“Service name”步骤中获得的 Service name控制台 或 endpointServiceIdAPI 创建 VPC 端点。 请务必使用正确的子网 ID、安全组 (Security Group) 和 VPC ID。

Resources:
  ClickHouseInterfaceEndpoint:
    Type: 'AWS::EC2::VPCEndpoint'
    Properties:
      VpcEndpointType: Interface
      PrivateDnsEnabled: false
      ServiceName: <Service name(endpointServiceId), pls see above>
      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 是你在获取端点“Service name”信息步骤中获取到的 Service name控制台 或 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      = "(Optional) If specified, the VPC endpoint will connect to the service in the provided region. Define it for multi-regional PrivateLink connections."
}

创建 VPC 端点后,请记下 Endpoint ID 的值;后续步骤会用到它。

为端点设置私有 DNS 名称

你需要将获取端点“Service name”步骤中获取的“DNS name”指向 AWS endpoint 网络接口。这样可确保你的 VPC/网络中的服务/组件能够正确解析该名称。

将“Endpoint ID”添加到 ClickHouse 服务的允许列表中

选项 1:ClickHouse Cloud 控制台

如需添加,请前往 ClickHouse Cloud 控制台,打开要通过 PrivateLink 连接的服务,然后进入 设置。点击 Set up private endpoint 打开专用终结点设置。输入在创建 AWS endpoint步骤中获取的 Endpoint ID。点击“Create endpoint”。

专用终结点过滤器

如需移除,请前往 ClickHouse Cloud 控制台,找到相应服务,然后进入该服务的 设置,找到要移除的端点,并将其从端点列表中删除。

选项 2:API

你需要将每个应可通过 PrivateLink 访问的实例的 Endpoint ID 添加到允许列表中。

使用创建 AWS Endpoint步骤中的数据设置 ENDPOINT_ID 环境变量。

在运行任何命令之前,请先设置以下环境变量:

REGION=<您的区域代码,使用 AWS 格式,例如:us-west-2>
PROVIDER=aws
KEY_ID=<您的 ClickHouse 密钥 ID>
KEY_SECRET=<您的 ClickHouse 密钥 secret>
ORG_ID=<您的 ClickHouse 组织 ID>
SERVICE_NAME=<您的 ClickHouse 服务名称>

将 Endpoint 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

要从允许列表中删除某个 Endpoint 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 进行连接,您需要使用专用端点,即 获取端点“Service name” 中的 privateDnsHostnameAPI 或 DNS Name控制台。

获取私有 DNS 主机名

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,前往 设置。点击 Set up private endpoint 按钮。在打开的弹出面板中,复制 DNS Name。

专用终结点 DNS 名称
选项 2:API

运行任何命令前,请先设置以下环境变量:

KEY_ID=<Your ClickHouse key ID>
KEY_SECRET=<Your ClickHouse key secret>
ORG_ID=<Your ClickHouse organization ID>
INSTANCE_ID=<Your ClickHouse service name>

你可以在步骤中获取 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 主机名建立的连接则会经由互联网路由。

故障排查

一个区域中的多个 PrivateLink

在大多数情况下,每个 VPC 只需创建一个终结点服务。该终结点可将请求从 VPC 路由到多个 ClickHouse Cloud 服务。 请参阅此处

连接专用终结点超时
  • 请将安全组 (Security Group) 关联到 VPC 端点。
  • 请检查关联到端点的安全组 (Security Group) 的 inbound 规则,确保允许访问 ClickHouse 端口。
  • 请检查关联到用于连接测试的 VM 的安全组 (Security Group) 的 outbound 规则,确保允许连接到 ClickHouse 端口。
私网主机名:找不到主机地址
  • 请检查你的 DNS 配置
连接被对端重置
  • 最可能的原因是 Endpoint ID 未添加到服务允许列表,请参阅步骤
检查端点过滤器

在运行任何命令前,请设置以下环境变量:

KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<please set ClickHouse organization ID>
INSTANCE_ID=<Instance 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
连接到远程数据库

根据 AWS PrivateLink 文档:

当你采用客户端/服务器架构,并希望允许一个或多个消费者 VPC 单向访问服务提供商 VPC 中的特定服务或一组实例时,请使用 AWS PrivateLink。只有消费者 VPC 中的客户端才能发起与服务提供商 VPC 中服务的连接。

要将 ClickHouse Cloud 中的 MySQL 或 PostgreSQL 表函数连接到托管在你的 AWS VPC 中的数据库,请配置你的 AWS 安全组,允许来自 ClickHouse Cloud 的连接。请查看 ClickHouse Cloud 各区域的默认出口 IP 地址以及可用的静态 IP 地址。

Navigation