本文介绍如何使用Alibaba Cloud SDK for Python在VPC路由器或边界路由器VBR(Virtual Border Router)上创建自定义路由条目。
前提条件
在使用Alibaba Cloud SDK for Python前,您需要完成以下准备工作:
您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面上创建和查看您的AccessKey。
确保您已经安装了Alibaba Cloud SDK for Python。
下载阿里云专有网络Python SDK场景示例的VPC Python Example库。
进入setup.py所在的目录,执行以下命令,完成环境初始化配置。
python setup.py install
背景信息
本文中的代码示例包含以下操作:
在华北3(张家口)地域创建一个名为sdk_route_table的自定义路由表。
查询专有网络vpc-8vb7ztbjqomi9mh1q****下的vSwitch。
将新创建的自定义路由表与交换机vsw-8vbfqpcijj0d13eaq****进行绑定。
为新建的自定义路由表创建自定义路由条目,目的网络为192.168.0.0/16,下一跳类型为ECS实例,下一跳ID为i-8vbgsnt7046a2qm****。
删除新创建的路由条目。
将新创建的自定义路由表与vSwitch解绑。
删除新创建的自定义路由表。
操作步骤
在下载的SDK目录中,打开aliyun-openapi-python-sdk-examples\sdk_examples\examples\vpc文件夹。
使用编辑器打开vpc_route_entry.py文件,根据实际情况配置相关参数,保存并退出。
完整代码示例如下:
# encoding=utf-8 import sys import json import time from alibabacloud_credentials.client import Client as CredClient from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException from aliyunsdkvpc.request.v20160428 import CreateRouteEntryRequest from aliyunsdkvpc.request.v20160428 import DeleteRouteEntryRequest from aliyunsdkvpc.request.v20160428 import DescribeRouteTablesRequest from sdk_lib.exception import ExceptionHandler from sdk_lib.check_status import CheckStatus from sdk_lib.common_util import CommonUtil from sdk_lib.sdk_vswitch import VSwitch from sdk_lib.sdk_route_table import RouteTable from sdk_lib.consts import * class RouteEntry(object): def __init__(self, client): self.client = client def create_route_entry(self, params): """ create_route_entry: 创建route_entry路由条目 """ try: request = CreateRouteEntryRequest.CreateRouteEntryRequest() # 路由表ID request.set_RouteTableId(params['route_table_id']) # 自定义路由条目的目标网段 request.set_DestinationCidrBlock(params['destination_cidr_block']) # 下一跳的类型 request.set_NextHopType(params['nexthop_type']) # 下一跳实例的ID request.set_NextHopId(params['nexthop_id']) response = self.client.do_action_with_exception(request) response_json = json.loads(response) # 判断router entry状态是否可用 if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME, self.describe_route_entry_status, AVAILABLE, params['route_table_id']): return response_json except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def delete_route_entry(self, params): """ delete_route_entry: 删除route_entry路由条目 """ try: request = DeleteRouteEntryRequest.DeleteRouteEntryRequest() # 路由条目所在的路由表的ID request.set_RouteTableId(params['route_table_id']) # 路由条目的目标网段 request.set_DestinationCidrBlock(params['destination_cidr_block']) # 下一跳实例的ID request.set_NextHopId(params['nexthop_id']) response = self.client.do_action_with_exception(request) response_json = json.loads(response) time.sleep(DEFAULT_TIME) return response_json except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def describe_route_entry_vrouter(self, params): """ describe_route_entry_vrouter: 查询route_entry路由条目 """ try: request = DescribeRouteTablesRequest.DescribeRouteTablesRequest() # 路由表所属的VPC路由器或边界路由器的ID request.set_VRouterId(params['vrouter_id']) # 路由表的ID request.set_RouteTableId(params['route_table_id']) response = self.client.do_action_with_exception(request) response_json = json.loads(response) return response_json except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def describe_route_entry(self, route_table_id): """ describe_route_entry: 查询route_entry路由条目 """ try: request = DescribeRouteTablesRequest.DescribeRouteTablesRequest() request.set_RouteTableId(route_table_id) response = self.client.do_action_with_exception(request) response_json = json.loads(response) return response_json except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def describe_route_entry_status(self, route_table_id): """ describe_route_entry_status: 查询route_entry路由条目当前状态 """ response = self.describe_route_entry(route_table_id) return response["RouteTables"]["RouteTable"][0]["RouteEntrys"]["RouteEntry"][0]["Status"] def main(): # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。 # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。 # 本示例通过阿里云Credentials工具从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://www.alibabacloud.com/help/alibaba-cloud-sdk-262060/latest/configure-credentials-378659。 cred = CredClient() access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() # 创建AcsClient实例 client = AcsClient(access_key_id, access_key_secret, '<YOUR-REGION-ID>') vswitch = VSwitch(client) route_table = RouteTable(client) route_entry = RouteEntry(client) params = {} params['route_table_name'] = "sdk_route_table" params['destination_cidr_block'] = "0.0.0.0/0" params['nexthop_id'] = "i-xxx" params['nexthop_type'] = "Instance" params['vpc_id'] = "vpc-xxx" params['vswitch_id'] = "vsw-xxx" # 创建route table route_table_json = route_table.create_route_table(params) CommonUtil.log("create_route_table", route_table_json) # 查询vSwitch vswitch_json = vswitch.describe_vswitch_attribute(params) CommonUtil.log("describe_vswitch_attribute", vswitch_json) # route table绑定vSwitch params['route_table_id'] = route_table_json['RouteTableId'] associate_json = route_table.associate_route_table(params) CommonUtil.log("associate_route_table", associate_json) # 创建路由条目 create_route_entry_json = route_entry.create_route_entry(params) CommonUtil.log("create_route_entry", create_route_entry_json) # 删除路由条目 delete_route_entry_json = route_entry.delete_route_entry(params) CommonUtil.log("delete_route_entry", delete_route_entry_json) # route table解绑vSwitch unassociate_json = route_table.unassociate_route_table(params) CommonUtil.log("unassociate_route_table", unassociate_json) # 删除route table delete_route_table_json = route_table.delete_route_table(params) CommonUtil.log("delete_route_table", delete_route_table_json) if __name__ == "__main__": sys.exit(main())
进入vpc_route_entry.py所在的目录,执行如下命令,运行创建自定义路由条目示例。
python vpc_route_entry.py
执行结果
系统回显结果如下:
---------------------------create_route_table---------------------------
{
"RouteTableId": "vtb-8vbn7px9zxwr2mh1q****",
"RequestId": "8B351EE1-614F-44E4-93AF-1CADA4BF02E8"
}
---------------------------describe_vswitch_attribute---------------------------
{
"Status": "",
"NetworkAclId": "",
"VpcId": "",
"Description": "",
"Ipv6CidrBlock": "",
"CreationTime": "",
"CloudResources": {
"CloudResourceSetType": []
},
"ZoneId": "",
"ResourceGroupId": "",
"VSwitchId": "",
"RequestId": "5E199415-BBA3-443D-B1EC-06341FE267F4",
"VSwitchName": "",
"CidrBlock": ""
}
---------------------------associate_route_table---------------------------
{
"RequestId": "5F33E444-5CCD-4677-91AB-3E234A9A64E4"
}
---------------------------create_route_entry---------------------------
{
"RequestId": "D6035ECA-DD81-4FAB-B084-55BE60FB18ED"
}
---------------------------delete_route_entry---------------------------
{
"RequestId": "54108FD7-8609-4111-919D-B2983466F480"
}
---------------------------unassociate_route_table---------------------------
{
"RequestId": "0F36A76A-1E54-41DC-852E-1D970FDE8F3F"
}
---------------------------delete_route_table---------------------------
{
"RequestId": "F3151A59-4F90-4531-AFDC-B7B7CF70A8C1"
}