すべてのプロダクト
Search
ドキュメントセンター

:カスタムルートの作成

最終更新日:Mar 11, 2024

このトピックでは、Alibaba Cloud SDK for Pythonを使用して、仮想プライベートクラウド (VPC) のvRouterまたは仮想ボーダールーター (VBR) にカスタムルートを作成する方法について説明します。

前提条件

Alibaba Cloud SDK for Pythonを使用する前に、次の要件が満たされていることを確認してください。
  • Alibaba CloudアカウントとAccessKeyペアが取得されます。 Alibaba Cloud管理コンソールの [セキュリティ管理] ページで、AccessKeyペアを作成して表示できます。
  • Alibaba Cloud SDK for Pythonがインストールされています。
  • VPC Pythonサンプルライブラリがダウンロードされます。
    setup.pyファイルが保存されているディレクトリに移動し、次のコマンドを実行して環境を初期化します。
    python setup.py install

背景情報

このトピックのコードサンプルには、次の操作が含まれます。

  1. 中国 (張家口) リージョンにsdk_route_tableという名前のカスタムルートテーブルを作成します。

  2. vpc-8vb7ztbjqomi9mh1q **** という名前のVPCでvSwitchを照会します。

  3. カスタムルートテーブルをvsw-8vbfqpcijj0d13eaq **** という名前のvSwitchに関連付けます。

  4. カスタムルートテーブルにルートを追加します。 宛先CIDRブロックは168.168.0.0/16です。 ネクストホップはElastic Compute Service (ECS) インスタンスです。 ネクストホップのIDはi-8vbgsnt7046a2qm **** です。

  5. ルートを削除します。

  6. vSwitchからカスタムルートテーブルの関連付けを解除します。

  7. カスタムルートテーブルを削除します。

手順

  1. ダウンロードしたsdkディレクトリにあるaliyun-openapi-python-SDK-examples\sdk_examples\examples\vpcフォルダーを開きます。

  2. エディターを使用してvpc_route_entry.pyファイルを開き、パラメーターを設定してから保存して終了します。

    次のサンプルコードが表示されます。

    # encoding=utf-8
    インポートsys
    jsonのインポート
    インポート時間
    
    alibabacloud_credentials.clientからCredClientとしてのインポートクライアント
    からaliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
    aliyunsdkvpc.request.v20160428からCreateRouteEntryRequestをインポート
    aliyunsdkvpc.request.v20160428からDeleteRouteEntryRequestをインポート
    aliyunsdkvpc.request.v20160428からDescribeRouteTablesRequestをインポート
    sdk_lib.exception import ExceptionHandlerから
    sdk_lib.check_statusからCheckStatusをインポートする
    sdk_lib.common_utilインポートからCommonUtil
    sdk_lib.sdk_vswitchからVSwitchをインポート
    sdk_lib.sdk_route_tableからRouteTableをインポート
    sdk_lib.consts import * から
    
    クラスRouteEntry (オブジェクト):
        def __init__(self, client):
            self.client=クライアント
    
        def create_route_entry(self、params):
            """
            create_route_entry: ルートを作成します。
    
            """
            試してみてください。
                request = CreateRouteEntryRequest.CreateRouteEntryRequest()
                # ルートテーブルのID。
                request.set_RouteTableId(params['route_table_id '])
                # ルートの宛先CIDRブロック。
                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 (レスポンス)
                # ルートが使用可能状態かどうかを確認します。
                CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
                                            self.de scribe_route_entry_status、
                                            利用可能、params ['rout_table_id ']):
                    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: ルートを削除します。
    
            """
            試してみてください。
                request = DeleteRouteEntryRequest.DeleteRouteEntryRequest()
                # ルートが属するルートテーブルのID。
                request.set_RouteTableId(params['route_table_id '])
                # ルートの宛先CIDRブロック。
                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 (レスポンス)
                time.sleep(DEFAULT_TIME)
                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: ルートを照会します。
    
            """
            試してみてください。
                request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
                # ルートテーブルが属するvRouterまたはVBRの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_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: ルートを照会します。
    
            """
            試してみてください。
                request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
                request.set_RouteTableId(route_table_id)
                response = self.client.do_action_with_exception(request)
                response_json = json.loads (レスポンス)
                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: ルートのステータスを照会します。
    
            """
            response = self.de scribe_route_entry(route_table_id)
            return response["RouteTables"]["RouteTable"][0]["RouteEntrys"]["RouteEntry"][0]["Status"]
    
    def main():
        # Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 セキュリティリスクを防ぐために、RAMユーザーとしてAPI操作を呼び出すか、ルーチンのO&Mを実行することを推奨します。 
        # AccessKey IDとAccessKey secretをプロジェクトコードに保存することはお勧めしません。 そうしないと、AccessKeyペアが漏洩し、リソースのセキュリティが侵害される可能性があります。 
        # この例では、AccessKeyペアはAlibaba Cloudが提供する資格情報を使用して取得されます。 ペアは、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()
    
        # Create an AcsClient instance.
        client = AcsClient(access_key_id, access_key_secret, '<YOUR-REGION-ID>')
        vswitch = VSwitch (クライアント)
        route_table = RouteTable (クライアント)
        route_entry = RouteEntry (クライアント)
    
        params = {}
        params ['rout_table_name '] = "sdk_route_table"
        params['destination_cidr_block '] = "0.0.0.0/0"
        params [nexthop_id'] = "i-xxx"
        params['nexthop_type'] = "インスタンス"
    
        params['vpc_id'] = "vpc-xxx"
        params['vswitch_id'] = "vsw-xxx"
    
        # ルートテーブルを作成します。
        route_table_json = route_table.create_route_table(params)
        CommonUtil.log("create_route_table", route_table_json)
    
        # vSwitchを照会します。
        vswitch_json = vswitch.de scribe_vswitch_attribute(params)
        CommonUtil.log("describe_vswitch_attribute", vswitch_json)
    
        # ルートテーブルを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)
    
        # vSwitchからルートテーブルの関連付けを解除します。
        unassociate_json = route_table.unassociate_route_table(params)
        CommonUtil.log("unassociate_route_table", unassociate_json)
    
        # ルートテーブルを削除します。
        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())
    
  3. vpc_route_entry.pyファイルが保存されているディレクトリに移動し、次のコマンドを実行してルートを作成します。

    python vpc_route_entry.py

結果

次の出力が返されます。

--------------------------- create_route_table ---------------------------
{
  "RouteTableId": "vtb-8vbn7px9zxwr2mh1q ****" 、
  "RequestId": "8B351EE1-614F-44E4-93AF-1CADA4BF02E8"
}

--------------------------- describe_vswitch_attribute ---------------------------

{
  "ステータス": "" 、
  "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"
}