跳至主要内容

AWS 私有链接

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

仅在生产环境中可用

AWS 私有链接仅在 ClickHouse Cloud 生产服务中可用。不支持开发服务。

请完成以下步骤以启用 AWS 私有链接

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

这里查找 AWS 私有链接的完整 Terraform 示例。

先决条件

在开始之前,您需要

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

步骤

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

获取端点服务名称

选项 1:ClickHouse Cloud 控制台

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

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)

获取私有链接配置的 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 端点后,记下 端点 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 区域 <region code>.vpce.aws.clickhouse.cloud 配置注入到 AWS VPC 中。

DNS 解析器

如果您使用的是自己的 DNS 解析器,请创建一个 <region code>.vpce.aws.clickhouse.cloud DNS 区域,并将通配符记录 *.<region code>.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 控制台将 端点 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 控制台中,打开您要通过私有链接连接的服务,然后导航到 **设置**。输入从上一步获得的 端点 ID

注意

如果您要允许从现有的私有链接连接访问,请使用现有的端点下拉菜单。

Private Endpoints

选项 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

每个配置了 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 将通过互联网路由。

故障排除

如果您在一个 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 中使用 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 地址