本文为您介绍如何使用Alibaba Cloud SDK for Python调用API接口,实现多个应用共享一份公网带宽,以节省公网成本。
配置场景
本文以下图场景为例。某公司创建了两台ECS实例,每台ECS实例都部署了一个应用服务,要求应用服务可以面向互联网提供服务,服务端口为80。两个ECS实例在不同时间段的带宽需求量不同,具体如下:
- ECS1实例的业务高峰期为每天的13:00:00~18:00:00,带宽需求量为1000Mbps,其他时间为业务低谷期,带宽需求量为500Mbps。
- ECS2实例的业务高峰期为每天的19:00:00~23:00:00,带宽需求量为1000Mbps,其他时间为业务低谷期,带宽需求量为500Mbps。
如果为每个ECS实例购买公网带宽,则需要购买2000Mbps带宽,但在业务低谷期带宽利用率低,造成带宽资源浪费。
您可以组合使用NAT网关的DNAT功能和共享带宽的共享功能,配置成功后:

- DNAT功能可以将NAT网关上的公网IP映射给ECS实例使用,使ECS实例可以面向互联网提供服务。
- 共享带宽可以实现多个应用共享一份公网带宽,以节省公网成本。

前提条件
开始前,请确保以下条件:
- 您已经注册了阿里云账号。如未注册,请先完成账号注册。
- 您已经创建了访问密钥(AccessKey)。 如未创建,请前往AccessKey管理页面创建AccessKey。
- 您已经安装了Python开发环境和Alibaba Cloud SDK for Python。详细信息,请参见安装阿里云Python SDK。
- 您已经创建了专有网络(VPC)和交换机。具体操作,请参见CreateVpc。
- 您已经在交换机中创建了ECS实例,且ECS实例部署了应用服务。具体操作,请参见CreateInstance。
- 您已经创建了两个弹性公网IP(EIP),用于绑定NAT网关实例。EIP必须满足以下条件:
- EIP的地域与要绑定的NAT网关的地域相同。
- EIP的计费方式必须为按量计费。
具体操作,请参见AllocateEipAddress。
配置步骤

步骤一:创建NAT网关
NAT网关是一款企业级的公网网关,提供NAT代理功能。在配置DNAT条目前,您需要先创建一个NAT网关实例。
说明 创建增强型NAT网关时,您必须指定NAT网关所属的交换机,系统会为增强型NAT网关分配一个交换机内的空闲私网IP地址。
- 如果您要在存量交换机中创建增强型NAT网关,请确保交换机所属的可用区支持创建增强型NAT网关,且交换机有可用的IP。
- 如果您还未创建交换机,请先在支持创建增强型NAT网关的可用区创建交换机,然后再指定增强型NAT网关所属的交换机。
您可以通过ListEnhanhcedNatGatewayAvailableZones接口查询增强型NAT网关的资源可用区,通过DescribeVSwitches接口查询交换机中的可用IP数。
步骤二:将EIP与NAT网关绑定
NAT网关作为一个网关设备,需要绑定公网IP才能正常工作。
根据以下代码示例,将EIP与NAT网关绑定。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.AssociateEipAddressRequest import AssociateEipAddressRequest
# 要绑定NAT网关的EIP的ID,本示例取值EIP1和EIP2的ID
allocationIds = ["eip-uf6pvlaprugu1azc8****", "eip-uf69ls0f3qgv0alk6****"]
# 创建AcsClient实例
# yourAccessKeyId:您的AccessKey ID
# yourAccessKeySecret:您的AccessKey Secret
# yourRegionId:地域ID
client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
# 将EIP与NAT网关绑定
for i in range(0, 2):
request = AssociateEipAddressRequest()
request.set_accept_format('json')
# 要绑定EIP的NAT网关ID
request.set_InstanceId("ngw-uf6htj15rgyp8ivix****")
# 要绑定NAT网关的EIP的ID
request.set_AllocationId(allocationIds[i])
# 要绑定EIP的资源类型
request.set_InstanceType("NAT")
# 发起API请求并打印返回
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
执行结果如下:
{
"RequestId": "8292A46D-F720-4AEE-98FB-7D3352BA2B63"
}
{
"RequestId": "E62EEBF8-D327-440E-95BC-8884832C1326"
}
步骤三:创建DNAT条目
通过NAT网关的DNAT功能,可以将NAT网关上的公网IP映射给ECS实例使用,使ECS实例能够提供互联网服务。在本示例中,您需要为ECS1和ECS2实例创建如下DNAT条目。
条目名称 | 公网IP地址 | 公网端口 | 协议类型 | 私网IP地址 | 私网端口 |
---|---|---|---|---|---|
DNAT1 | EIP1 | 80 | TCP | ECS1 | 80 |
DNAT2 | EIP2 | 80 | TCP | ECS2 | 80 |
步骤四:创建共享带宽
共享带宽提供地域级带宽共享和复用功能,可以为您节省公网带宽使用成本。
根据以下代码示例,创建一个共享带宽实例。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.CreateCommonBandwidthPackageRequest import CreateCommonBandwidthPackageRequest
# 创建AcsClient实例
# yourAccessKeyId:您的AccessKey ID
# yourAccessKeySecret:您的AccessKey Secret
# yourRegionId:地域ID
client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
# 创建共享带宽实例
request = CreateCommonBandwidthPackageRequest()
request.set_accept_format('json')
# 共享带宽的带宽峰值,取值:1000~5000,单位为Mbps,本示例取值1500,请根据实际业务需求设置带宽峰值
request.set_Bandwidth(1500)
# 线路类型
# 取值:BGP:BGP(多线)线路 BGP_PRO:BGP(多线)精品线路
request.set_ISP("BGP")
# 共享带宽的名称
request.set_Name("test")
# 共享带宽的描述
request.set_Description("test")
# 共享带宽的计费方式
# 取值:PayByBandwidth(默认值):按带宽计费 PayBy95:按增强型95计费
request.set_InternetChargeType("PayByBandwidth")
# 发起API请求并打印返回
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
执行结果如下:
{
"RequestId": "592C8AB6-09AC-4751-9B17-231BF8FEEA44",
"ResourceGroupId": "rg-acfmx2k5unk****",
"BandwidthPackageId": "cbwp-uf6jvfp1wqps1vywa****"
}
步骤五:将EIP添加到共享带宽
您可以将EIP1和EIP2添加到共享带宽实例中,EIP添加到共享带宽实例后:
- EIP绑定的NAT网关会共享已购买的共享带宽。
- EIP原本的带宽峰值无效,与共享带宽实例的带宽峰值相同。
- EIP原本的计费方式无效。EIP变为一个公网IP,不额外收取EIP的流量费和带宽费。
根据以下代码示例,将EIP添加到共享带宽。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.AddCommonBandwidthPackageIpRequest import AddCommonBandwidthPackageIpRequest
# 定义要添加到共享带宽实例的EIP,本示例要将EIP1和EIP2添加到共享带宽
IpInstanceIds = ["eip-uf6pvlaprugu1azc8****","eip-uf69ls0f3qgv0alk6****"]
# 创建AcsClient实例
# yourAccessKeyId:您的AccessKey ID
# yourAccessKeySecret:您的AccessKey Secret
# yourRegionId:地域ID
client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
for i in range(0, 2):
# 将EIP添加到共享带宽
request = AddCommonBandwidthPackageIpRequest()
request.set_accept_format('json')
# 共享带宽的ID
request.set_BandwidthPackageId("cbwp-uf6jvfp1wqps1vywa****")
# 要添加到共享带宽实例的EIP
request.set_IpInstanceId(IpInstanceIds[i])
# 发起API请求并打印返回
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
执行结果如下:
{
"RequestId": "658D8E3C-A85E-406C-AE49-EE6ECA2B9252"
}
{
"RequestId": "166E9BF2-C12B-45B6-A712-633AD535B446"
}
步骤六:访问测试
您可以使用互联网中的任意一台电脑访问ECS1和ECS2实例上部署的应用服务,测试ECS实例的连通性。
说明 请确保ECS实例的安全组规则允许互联网访问ECS实例。
在文档使用中是否遇到以下问题
更多建议
匿名提交