通过私网连接(PrivateLink)调用云控制API可以实现私网访问服务,避免通过公网访问服务带来的潜在安全风险。
概述
什么是PrivateLink
私网连接(PrivateLink)是阿里云提供的一种私网访问服务,能够实现VPC与阿里云服务之间的私网连接,避免通过公网访问,从而提升安全性和稳定性。
使用场景
当您的应用程序运行在阿里云生产环境上,并需要调用云控制API服务时,推荐使用PrivateLink技术来实现内网调用,适用于以下场景:
-
安全合规要求高:企业内部安全策略要求禁止或限制公网访问。
-
成本优化:减少公网流量费用,降低总体拥有成本。
-
跨地域部署:需要在多个地域部署应用,要求统一的网络架构。
技术优势
|
优势 |
说明 |
|
低时延 |
内网直连,相比公网访问可降低30%-50%的网络时延。 |
|
高稳定性 |
避免公网波动。 |
|
安全隔离 |
流量不经过公网。 |
前提条件
权限要求
配置PrivateLink终端节点需授予以下权限:
-
AliyunVPCFullAccess:VPC完整访问权限。 -
AliyunPrivateLinkFullAccess:PrivateLink完整访问权限。
资源要求
根据您调用的云控制API服务部署地域,需要满足以下条件:
|
云控制API服务地域 |
访问域名 |
需要的VPC地域 |
|
国内服务 |
cloudcontrol.aliyuncs.com |
cn-zhangjiakou(华北3-张家口) |
|
国际服务 |
cloudcontrol.ap-southeast-1.aliyuncs.com |
ap-southeast-1(新加坡) |
资源清单:
-
目标地域的VPC实例。
-
VPC内至少一个可用的交换机(vSwitch)。
-
确保交换机有足够的可用IP地址。
服务地域说明
云控制API服务目前支持部署在以下地域,请根据您的业务需求选择:
国内服务(cn-zhangjiakou)
-
终端节点服务:
com.aliyuncs.privatelink.cn-zhangjiakou.cloudcontrol-api -
公网域名:
cloudcontrol.aliyuncs.com -
私网域名:
cloudcontrol.vpc-proxy.aliyuncs.com
国际服务(ap-southeast-1)
-
终端节点服务:
com.aliyuncs.privatelink.ap-southeast-1.cloudcontrol -
公网域名:
cloudcontrol.ap-southeast-1.aliyuncs.com -
私网域名:
cloudcontrol-vpc.ap-southeast-1.aliyuncs.com
配置PrivateLink后,应用代码需要将调用域名修改为对应的私网域名。
配置步骤
同地域配置
当您的应用部署在cn-zhangjiakou或ap-southeast-1时,可以直接在同地域创建终端节点。
步骤1:登录控制台
-
登录阿里云VPC控制台。
-
在左侧导航栏中,单击进入终端节点页面。
-
在接口终端节点中,单击创建终端节点 。
步骤2:选择地域
在“所属地域”下拉框中选择:
-
访问国内服务 → 选择华北3(张家口)。
-
访问国际服务 → 选择新加坡。
步骤3:配置基本信息
|
配置项 |
说明 |
配置示例 |
|
终端节点名称 |
自定义名称,建议使用有意义的命名 |
|
|
终端节点类型 |
选择“接口终端节点” |
接口终端节点 |
|
资源类型 |
选择“阿里云服务” |
阿里云服务 |
步骤4:选择终端节点服务
-
在搜索终端节点服务输入框中,根据目标服务输入:
-
国内服务:
com.aliyuncs.privatelink.cn-zhangjiakou.cloudcontrol-api -
国际服务:
com.aliyuncs.privatelink.ap-southeast-1.cloudcontrol
-
-
搜索后会显示唯一的终端节点服务,选中即可。
步骤5:启用自定义域名
勾选开启自定义服务域名,系统会自动分配私网访问域名,无需手动填写。
-
国内服务域名:
cloudcontrol.vpc-proxy.aliyuncs.com -
国际服务域名:
cloudcontrol-vpc.ap-southeast-1.aliyuncs.com
选择终端节点服务名称为 com.aliyuncs.privatelink.cn-zhangjiakou.cloudcontrol-api 的服务。
步骤6:网络配置
|
配置项 |
说明 |
建议 |
|
专有网络(VPC) |
选择您的应用所在的VPC |
确保选择正确的VPC |
|
可用区与交换机 |
至少选择一个交换机,建议选择多个以实现高可用 |
生产环境建议选择2-3个不同可用区 |
|
安全组 |
选择安全组限制访问来源 |
建议配置仅允许应用安全组访问 |
多可用区配置示例:
可用区A:vsw-xxxxx
可用区B:vsw-yyyyy
步骤7:配置访问策略
终端节点策略用于控制哪些主账号/RAM用户可以通过该终端节点访问服务。
根据最小权限原则,建议限制仅允许必要的账号访问。
默认策略(允许所有):
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Principal":"*",
"Action":"*",
"Resource":"*"
}
]
}
推荐策略(仅允许本账号):
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Aliyun":[
"acs:ram:YOUR_ACCOUNT_ID:root"
]
},
"Action":"*",
"Resource":"*"
}
]
}
步骤8:创建并验证
-
单击确定创建,创建终端节点。
-
等待2-5分钟,终端节点状态变为可用。
-
连接状态显示为已连接。
状态说明:
-
创建中:终端节点正在创建。
-
可用:终端节点已就绪,可以使用。
-
异常 :创建失败或连接异常,需要检查配置。
终端节点创建完成后,在终端节点详情页的基本信息区域,确认状态为可用、连接状态为已连接。在终端节点服务域名区域,可查看默认服务域名,并确认自定义服务域名已启用,域名为cloudcontrol.vpc-proxy.aliyuncs.com。
跨地域配置
当您的应用部署在cn-zhangjiakou或ap-southeast-1以外的地域,需要通过云企业网(CEN)打通跨地域网络。
步骤1:在目标地域创建终端节点
-
在
cn-zhangjiakou或ap-southeast-1创建终端节点。具体操作,请参见同地域配置。 -
记录终端节点所在的VPC ID。
步骤2:创建CEN实例打通region
CEN配置说明请参考跨地域VPC互通。
验证与测试
连通性验证
登录到部署应用的ECS或容器实例,执行以下命令:
国内服务验证:
curl -v cloudcontrol.vpc-proxy.aliyuncs.com
国际服务验证:
curl -v cloudcontrol-vpc.ap-southeast-1.aliyuncs.com
成功标志:
返回的HTTP响应头中包含 x-acs-request-id,示例输出:
< HTTP/1.1 401 Unauthorized
< date:Thu, 09 Oct 2025 10:30:00 GMT
< content-type:application/json
< x-acs-request-id:23C12345-1234-1234-1234-123456789ABC
< x-acs-trace-id:0b12345678901234567890123456789a
...
由于请求未携带身份凭证信息,接口返回401状态码属于预期行为。
测试关注点:响应头中必须包含阿里云标识性字段(如 x-acs-request-id),以确认请求已被阿里云 API 网关或服务正确处理。
应用集成示例
Java示例
import com.aliyun.cloudcontrol20220830.Client;
import com.aliyun.teaopenapi.models.Config;
public class PrivateLinkExample {
public static void main(String[] args) throws Exception {
// 配置客户端
Config config = new Config()
.setAccessKeyId("<YOUR-ACCESS-KEY-ID>")
.setAccessKeySecret("<YOUR-ACCESS-KEY-SECRET>")
// 使用私网域名
.setEndpoint("cloudcontrol.vpc-proxy.aliyuncs.com") // 国内服务
.setHost("cloudcontrol.aliyuncs.com") // 国内服务
// .setEndpoint("cloudcontrol-vpc.ap-southeast-1.aliyuncs.com") // 国际服务
.setProtocol("https");
Client client = new Client(config);
// 后续使用client进行API调用
try {
var response = client.listResources(...);
System.out.println("Request successful: " + response.getBody().getRequestId());
} catch (Exception e) {
System.err.println("Request failed: " + e.getMessage());
}
}
}