AWS 私有链接
您可以使用 AWS 私有链接 在 VPC、AWS 服务、您的本地系统和 ClickHouse Cloud 之间提供连接,而无需让您的流量跨越互联网。本文档介绍了如何使用 AWS 私有链接连接到 ClickHouse Cloud。要禁用从 AWS 私有链接地址以外的地址访问您的 ClickHouse Cloud 服务,请使用 ClickHouse Cloud IP 访问列表。
AWS 私有链接仅在 ClickHouse Cloud 生产服务中可用。不支持开发服务。
请完成以下步骤以启用 AWS 私有链接
- 获取端点服务名称。
- 创建服务端点。
- 将端点 ID 添加到 ClickHouse Cloud 组织。
- 将端点 ID 添加到服务允许列表。
在这里查找 AWS 私有链接的完整 Terraform 示例。
先决条件
在开始之前,您需要
- AWS 帐户。
- 具有创建和管理私有链接所需权限的 API 密钥。
步骤
按照以下步骤将您的 ClickHouse Cloud 连接到您的 AWS 私有链接。
获取端点服务名称
选项 1:ClickHouse Cloud 控制台
在 ClickHouse Cloud 控制台中,打开您要通过私有链接连接的服务,然后打开 **设置** 菜单。单击 **设置私有端点** 按钮。复制将用于设置私有链接的 **服务名称**。
选项 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)
获取私有链接配置的 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 和子网
作为可选步骤,分配安全组/标签
确保端口 8443
和 9440
在安全组中被允许。
创建 VPC 端点后,记下 端点 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 区域 <region code>.vpce.aws.clickhouse.cloud
配置注入到 AWS VPC 中。
如果您使用的是自己的 DNS 解析器,请创建一个 <region code>.vpce.aws.clickhouse.cloud
DNS 区域,并将通配符记录 *.<region code>.vpce.aws.clickhouse.cloud
指向端点 ID 的 IP 地址。
选项 1:AWS 控制台
导航到 **VPC 端点**,右键单击 VPC 端点,然后选择 **修改私有 DNS 名称**
在打开的页面上,选择 **启用私有 DNS 名称**
选项 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 控制台将 端点 ID
添加到服务允许列表会自动将其添加到组织。
要删除端点,请打开 **组织详细信息 -> 私有端点** 并单击删除按钮以删除端点。
选项 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 控制台中,打开您要通过私有链接连接的服务,然后导航到 **设置**。输入从上一步获得的 端点 ID
。
如果您要允许从现有的私有链接连接访问,请使用现有的端点下拉菜单。
选项 2:API
您需要将端点 ID 添加到应使用私有链接提供的每个实例的允许列表。
在运行任何命令之前,设置以下环境变量
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
使用 PrivateLink 访问实例
每个配置了 Private Link 过滤器的实例都有一个公共端点和一个私有端点。要使用 PrivateLink 连接到您的服务,您需要使用私有端点 privateDnsHostname
。
私有 DNS 主机名只能从您的 AWS VPC 中获得。请勿尝试从本地计算机解析 DNS 主机。
获取私有 DNS 主机名
选项 1:ClickHouse Cloud 控制台
在 ClickHouse Cloud 控制台中,导航到 **设置**。单击 **设置私有端点** 按钮。在打开的弹出窗口中,复制 **DNS 名称**。
选项 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
将通过互联网路由。
故障排除
一个区域中的多个 PrivateLink
如果您在一个 AWS 区域内需要两个或更多个 AWS Private Link,请注意:在 ClickHouse 中,我们在区域级别提供 VPC 端点服务。当您在同一个 VPC 中设置两个或更多个 VPC 端点时 - 从 AWS VPC 的角度来看 - 您只使用了一个 AWS Private Link。在这种情况下,如果您需要在同一个区域内配置两个或更多个 AWS Private Link,请只在您的 VPC 中创建一个 VPC 端点,并要求 ClickHouse 为同一个 AWS 区域中的所有 ClickHouse 服务配置相同的 VPC 端点 ID。
连接到私有端点超时
- 请将安全组附加到 VPC 端点。
- 请验证附加到端点的安全组的
inbound
规则,并允许 ClickHouse 端口。 - 请验证用于连接性测试的 VM 附加的安全组的
outbound
规则,并允许连接到 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 中使用 MySQL 或 PostgreSQL 表函数,并连接到托管在 Amazon Web Services (AWS) VPC 中的数据库。AWS PrivateLink 不能用于安全地启用此连接。PrivateLink 是一种单向、单向连接。它允许您的内部网络或 Amazon VPC 安全地连接到 ClickHouse Cloud,但它不允许 ClickHouse Cloud 连接到您的内部网络。
当您有一个客户端/服务器设置,您希望允许一个或多个消费者 VPC 单向访问服务提供商 VPC 中的特定服务或一组实例时,请使用 AWS PrivateLink。只有消费者 VPC 中的客户端才能发起到服务提供商 VPC 中服务的连接。
为此,请配置您的 AWS 安全组以允许来自 ClickHouse Cloud 的连接到您的内部/私有数据库服务。查看 ClickHouse Cloud 区域的默认出口 IP 地址,以及 可用的静态 IP 地址。