跳转至主要内容
跳转至主要内容

AWS PrivateLink

您可以使用 AWS PrivateLink 在 VPC、AWS 服务、您的本地系统和 ClickHouse Cloud 之间提供连接,而无需让您的流量通过互联网。本文档介绍了如何使用 AWS PrivateLink 连接到 ClickHouse Cloud。要禁用从 AWS PrivateLink 地址以外的地址访问您的 ClickHouse Cloud 服务,请使用 ClickHouse Cloud IP 访问列表

注意

ClickHouse Cloud 目前不支持跨区域 PrivateLink。但是,您可以使用 VPC 对等连接连接到 PrivateLink。有关更多信息和配置指南,请参阅 AWS 文档。

仅在生产环境中可用

AWS PrivateLink 仅在 ClickHouse Cloud 生产服务中可用。不支持开发服务。

请完成以下步骤以启用 AWS Private Link

  1. 获取端点服务名称。
  2. 创建服务端点。
  3. 将端点 ID 添加到 ClickHouse Cloud 组织。
  4. 将端点 ID 添加到服务允许列表。

在此处查找 AWS Private Link 的完整 Terraform 示例:here

先决条件

在开始之前,您需要

  1. 一个 AWS 账户。
  2. 一个具有创建和管理私有链接所需权限的 API 密钥。

步骤

按照以下步骤将您的 ClickHouse Cloud 连接到您的 AWS PrivateLink。

获取端点服务名称

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,打开您想要通过 PrivateLink 连接的服务,然后打开 设置 菜单。单击 设置私有端点 按钮。复制 服务名称,这将用于设置 Private Link。

Private Endpoints

选项 2:API

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

REGION=<Your region code using the AWS format>
PROVIDER=aws
KEY_ID=<Your key ID>
KEY_SECRET=<Your key secret>
ORG_ID=<Your ClickHouse organization ID>
SERVICE_NAME=<Your ClickHouse service name>

通过按区域、提供商和服务名称进行筛选来获取所需的实例 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:?}\" and .name==\"${SERVICE_NAME:?}\") | .id " -r)

获取您的 Private Link 配置的 AWS 服务名称

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.yy-xxxx-N.vpce-svc-xxxxxxxxxxxx",
...
}

记下 endpointServiceId继续执行步骤 2

创建服务端点

接下来,您需要使用上一步中的 endpointServiceId 创建一个服务端点。

选项 1:AWS 控制台

打开 AWS 控制台并转到 VPC端点创建端点

选择 其他端点服务 并使用您从上一步获得的 endpointServiceId。完成后,单击 验证服务

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

Select VPC and subnets

作为可选步骤,分配安全组/标签

端口

确保安全组中允许端口 84439440

创建 VPC 端点后,记下 Endpoint ID 值;您将在后续步骤中需要它。

VPC endpoint ID

选项 2:AWS CloudFormation

确保使用正确的子网 ID、安全组和 VPC ID。

Resources:
ClickHouseInterfaceEndpoint:
Type: 'AWS::EC2::VPCEndpoint'
Properties:
VpcEndpointType: Interface
PrivateDnsEnabled: false
ServiceName: <use endpointServiceId from 'Obtain AWS Service Name for Private Link' step>
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

选项 3:Terraform

resource "aws_vpc_endpoint" "this" {
vpc_id = var.vpc_id
service_name = "<use endpointServiceId from 'Obtain AWS Service Name for Private Link' step>"
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
}

修改端点的私有 DNS 名称

此步骤将私有 DNS 区域 <区域代码>.vpce.aws.clickhouse.cloud 配置注入到 AWS VPC 中。

DNS 解析器

如果您使用自己的 DNS 解析器,请创建 <区域代码>.vpce.aws.clickhouse.cloud DNS 区域,并将通配符记录 *.<区域代码>.vpce.aws.clickhouse.cloud 指向端点 ID IP 地址。

选项 1:AWS 控制台

导航到 VPC 端点,右键单击 VPC 端点,然后选择 修改私有 DNS 名称

Endpoints menu

在打开的页面上,选择 启用私有 DNS 名称

Modify DNS names

选项 2:AWS CloudFormation

更新 CloudFormation 模板并将 PrivateDnsEnabled 设置为 true

PrivateDnsEnabled: true

应用更改。

选项 3:Terraform

  • 更改 Terraform 代码中的 aws_vpc_endpoint 资源,并将 private_dns_enabled 设置为 true
private_dns_enabled = true

应用更改。

将端点 ID 添加到 ClickHouse Cloud 组织

选项 1:ClickHouse Cloud 控制台

要将端点添加到组织,请继续执行将端点 ID 添加到服务允许列表步骤。使用 ClickHouse Cloud 控制台将 Endpoint ID 添加到服务允许列表会自动将其添加到组织。

要删除端点,请打开 组织详细信息 -> 私有端点 并单击删除按钮以删除端点。

endpoints

选项 2:API

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

PROVIDER=aws
KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<please set ClickHouse organization ID>
ENDPOINT_ID=<Endpoint ID from previous step>
REGION=<region code, please use AWS format>

使用上一步的数据设置 VPC_ENDPOINT 环境变量。

要添加端点,请运行

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

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

要删除端点,请运行

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

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

将端点 ID 添加到服务允许列表

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,打开您想要通过 PrivateLink 连接的服务,然后导航到 设置。输入从上一步获得的 Endpoint ID

注意

如果您想允许从现有 PrivateLink 连接进行访问,请使用现有的端点下拉菜单。

Private Endpoints

选项 2:API

您需要将端点 ID 添加到每个应使用 PrivateLink 的实例的允许列表中。

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

PROVIDER=aws
KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<please set ClickHouse organization ID>
ENDPOINT_ID=<Endpoint ID from previous step>
INSTANCE_ID=<Instance ID>

要将端点 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 过滤器的实例都有一个公共端点和一个私有端点。为了使用 PrivateLink 连接到您的服务,您需要使用私有端点 privateDnsHostname

注意

私有 DNS 主机名仅在您的 AWS VPC 中可用。请勿尝试从本地计算机解析 DNS 主机。

获取私有 DNS 主机名

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,导航到 设置。单击 设置私有端点 按钮。在打开的弹出窗口中,复制 DNS 名称

Private Endpoints

选项 2:API

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

KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<please set ClickHouse organization ID>
INSTANCE_ID=<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.yy-xxxx-N.vpce-svc-xxxxxxxxxxxx",
"privateDnsHostname": "xxxxxxx.yy-xxxx-N.vpce.aws.clickhouse.cloud"
}

在此示例中,到 xxxxxxx.yy-xxxx-N.vpce.aws.clickhouse.cloud 主机名的连接将路由到 PrivateLink,但 xxxxxxx.yy-xxxx-N.aws.clickhouse.cloud 将通过互联网路由。

故障排除

在大多数情况下,每个 VPC 只需要创建一个端点服务。此端点可以将来自 VPC 的请求路由到多个 ClickHouse Cloud 服务。

连接到私有端点超时

  • 请将安全组附加到 VPC 端点。
  • 请验证附加到端点的安全组上的 入站 规则,并允许 ClickHouse 端口。
  • 请验证附加到用于连接性测试的 VM 的安全组上的 出站 规则,并允许连接到 ClickHouse 端口。

私有主机名:找不到主机地址

  • 请检查是否启用了“私有 DNS 名称”选项,访问步骤了解详情

连接被对端重置

  • 最有可能端点 ID 未添加到服务允许列表,请访问步骤

检查端点过滤器

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

KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<please set ClickHouse organization 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

连接到远程数据库

假设您尝试在 ClickHouse Cloud 中使用 MySQLPostgreSQL 表函数,并连接到托管在 Amazon Web Services (AWS) VPC 中的数据库。AWS PrivateLink 不能用于安全地启用此连接。PrivateLink 是单向的、单向的连接。它允许您的内部网络或 Amazon VPC 安全地连接到 ClickHouse Cloud,但不允许 ClickHouse Cloud 连接到您的内部网络。

根据 AWS PrivateLink 文档

当您有客户端/服务器设置,并且您希望允许一个或多个消费者 VPC 单向访问服务提供商 VPC 中的特定服务或实例集时,请使用 AWS PrivateLink。只有消费者 VPC 中的客户端可以启动与服务提供商 VPC 中服务的连接。

为此,请配置您的 AWS 安全组,以允许从 ClickHouse Cloud 连接到您的内部/私有数据库服务。查看 ClickHouse Cloud 区域的默认出口 IP 地址,以及 可用的静态 IP 地址