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

:SNAT エントリの作成

最終更新日:Jan 02, 2024

このトピックでは、Alibaba Cloud SDK for Pythonを使用してSNATエントリを作成する方法について説明します。

前提条件

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. 中国 (上海) リージョンに仮想プライベートクラウド (VPC) を作成します。
  2. VPCのvSwitchを作成します。
  3. VPCにNATゲートウェイを作成します。
  4. 中国 (上海) リージョンでelastic IPアドレス (EIP) を作成します。
  5. EIPをNATゲートウェイに関連付けます。
  6. SNATエントリを作成します。
  7. NATゲートウェイに関連付けられているEIPを照会します。
  8. NAT gatewayを照会します。
  9. SNATエントリを削除します。
  10. NATゲートウェイからEIPの関連付けを解除します。
  11. NAT gatewayを削除します。
  12. EIPをリリースします。
  13. vSwitchを削除します。
  14. VPCを削除します。

手順

  1. ダウンロードしたSDKファイルのディレクトリで、aliyun-openapi-python-sdk-examples\sdk_examples\examples\natgwフォルダーを開きます。
  2. テキストエディターでnatgw_snat.pyファイルを開きます。 必要なパラメーターを設定し、設定を保存してから、エディターを終了します。
    次のサンプルコードが表示されます。
    #encoding=utf-8
    インポートsys
    jsonのインポート
    インポート時間
    
    alibabacloud_credentials.clientからCredClientとしてのインポートクライアント
    からaliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
    aliyunsdkvpc.request.v20160428からCreateNatGatewayRequestをインポート
    aliyunsdkvpc.request.v20160428からDeleteNatGatewayRequestをインポート
    aliyunsdkvpc.request.v20160428からDescribeNatGatewaysRequestをインポート
    aliyunsdkvpc.request.v20160428からCreateSnatEntryRequestをインポート
    aliyunsdkvpc.request.v20160428からDescribeSnatTableEntriesRequestをインポート
    aliyunsdkvpc.request.v20160428からDeleteSnatEntryRequestをインポート
    sdk_lib.sdk_vpcからVpcをインポート
    sdk_lib.sdk_vswitchからVSwitchをインポート
    sdk_lib.sdk_eipからEipをインポート
    sdk_lib.sdk_cbwpインポートCommonBandwidthPackageから
    sdk_lib.common_utilインポートからCommonUtil
    sdk_lib.check_statusからCheckStatusをインポートする
    sdk_lib.exception import ExceptionHandlerから
    sdk_lib.consts import * から
    
    # Alibaba CloudアカウントのAccessKeyペアを使用すると、アカウントにすべてのAPI操作に対する権限があるため、セキュリティ上のリスクが発生する可能性があります。 RAMユーザーを使用してAPI操作を呼び出したり、ルーチンのO&Mを実行することを推奨します。# AccessKey IDとAccessKey secretをプロジェクトコードに保存することはお勧めしません。 そうしないと、AccessKeyペアが漏洩し、リソースのセキュリティが侵害される可能性があります。 
    # この例では、AccessKeyペアは、Alibaba Cloud Credentialsツールを使用してAPIアクセスを認証することによって取得されます。 変数の設定方法の詳細については、「https://help.aliyun.com/document_detail/378659.htmlhttps:// 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>')
    
    
    クラスNatGateway (オブジェクト):
        def __init__(self, client):
            self.client=クライアント
    
        def create_nat_gateway(self、params):
            """
            create_nat_gateway: NATゲートウェイを作成します。
            """
            試してみてください。
                request = CreateNatGatewayRequest.CreateNatGatewayRequest()
                request.set_VpcId(params['vpc_id'])
                response = client.do_action_with_exception(request)
                response_json = json.loads (レスポンス)
                # NATゲートウェイが使用可能状態かどうかを確認します。
                CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
                                            self.de scribe_nat_gateway_status,
                                            利用可能、response_json['NatGatewayId']):
                    response_jsonを返します
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def describe_nat_gateway(self, nat_gateway_id):
            """
            describe_nat_gateway: 指定されたリージョンのNATゲートウェイに関する情報を照会します。
            """
            試してみてください。
                request = DescribeNatGatewaysRequest.DescribeNatGatewaysRequest()
                request.set_NatGatewayId(nat_gateway_id)
                response = 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 delete_nat_gateway(self、params):
            """
            delete_nat_gateway: NATゲートウェイを削除します。
            """
            試してみてください。
                request = DeleteNatGatewayRequest。DeleteNatGatewayRequest()
                request.set_NatGatewayId(params['nat_gateway_id '])
                response = client.do_action_with_exception(request)
                response_json = json.loads (レスポンス)
                # NATゲートウェイが使用可能状態かどうかを確認します。
                CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME * 5,
                                            self.de scribe_nat_gateway_status,
                                            ''、params['nat_gateway_id ']):
                    response_jsonを返します
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def describe_nat_gateway_status(self, nat_gateway_id):
            """
            describe_nat_gateway_status: 指定されたリージョンのNATゲートウェイのステータスを照会します。
            """
            response = self.de scribe_nat_gateway(nat_gateway_id)
            len(response["NatGateways"]["NatGateway"]) == 0の場合:
                return''
            リターンレスポンス ["NatGateways"]["NatGateway"][0]['Status']
    
        def create_snat_entry(self, params):
            """
            describe_snat: SNATエントリを作成します。
            """
            試してみてください。
                request = CreateSnatEntryRequest.CreateSnatEntryRequest()
                request.set_SnatTableId(params['snat_table_id '])
                request.set_SourceVSwitchId(params['vswitch_id'])
                request.set_SnatIp(params['snat_ip'])
                response = client.do_action_with_exception(request)
                response_json = json.loads (レスポンス)
                # SNATエントリが使用可能状態かどうかを確認します。
                CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
                                            self.de scribe_snat_status,
                                            利用可能、params['snat_table_id ']):
                    response_jsonを返します
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def describe_snat(self, snat_table_id):
            """
            describe_snat: 指定したリージョンのSNATエントリを照会します。
            """
            試してみてください。
                request = DescribeSnatTableEntriesRequest.DescribeSnatTableEntriesRequest()
                request.set_SnatTableId(snat_table_id)
                response = 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_snat_status(self, snat_table_id):
            """
            describe_snat_status: 指定したリージョンのSNATエントリのステータスを照会します。
            """
            response = self.de scribe_snat(snat_table_id)
            if len(response["SnatTableEntry"]["SnatTableEntry"]) == 0:
                return''
            return response["SnatTableEntries"]["SnatTableEntry"][0]['Status']
    
        def delete_snat_entry(self, params):
            """
            delete_snat_entry: SNATエントリを削除します。
            """
            試してみてください。
                request = DeleteSnatEntryRequest.DeleteSnatEntryRequest()
                request.set_SnatTableId(params['snat_table_id '])
                request.set_SnatEntryId(params['snat_entry_id '])
                response = client.do_action_with_exception(request)
                response_json = json.loads (レスポンス)
                # SNATエントリが使用可能状態かどうかを確認します。
                CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME * 5,
                                            self.de scribe_snat_status,
                                            ''、params['snat_table_id ']):
                    response_jsonを返します
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
    
    def main():
        vpc = Vpc (クライアント)
        vswitch = VSwitch (クライアント)
        eip = Eip (クライアント)
        cbwp = CommonBandwidthPackage (クライアント)
        nat_gateway = NatGateway (クライアント)
    
        params = {}
    
        # VPCを作成します。
        vpc_json = vpc.create_vpc()
        CommonUtil.log("create_vpc", vpc_json)
    
        # vSwitchを作成します。
        params['vpc_id'] = vpc_json['VpcId']
        params['zone_id'] = "cn-hangzhou-d"
        params['cidr_block'] = "172.16.1.0/24"
        vswitch_json = vswitch.create_vswitch(params)
        CommonUtil.log("create_vswitch", vswitch_json)
        params['vswitch_id'] = vswitch_json['VSwitchId']
    
        # NATゲートウェイを作成します。
        nat_gateway_json = nat_gateway.create_nat_gateway(params)
        CommonUtil.log("create_nat_gateway", nat_gateway_json)
    
        # EIPを作成します。
        eip_response_json = eip.allocate_eip_address(params)
        CommonUtil.log("allocate_eip_address", eip_response_json)
        params['allocation_id'] = eip_response_json["AllocationId"]
        params['snat_ip'] = eip_response_json['EipAddress']
    
        # EIPをNATゲートウェイに関連付けます。
        params['instance_id'] = nat_gateway_json['NatGatewayId']
        params['allocation_id'] = eip_response_json["AllocationId"]
        params['instance_type'] = 'Nat'
        eip_response_json = eip.associate_eip_address(params)
        CommonUtil.log("associate_eip_address eip", eip_response_json)
    
        # SNATエントリを作成します。
        params['snat_table_id '] = nat_gateway_json ['SnatTableds']['SnatTableId'][0]
        snat_entry_json = nat_gateway.create_snat_entry(params)
        CommonUtil.log("create_snat_entry", snat_entry_json)
    
        # EIPを照会します。
        eip_response_json = eip.de scribe_eip_address(params['allocation_id'])
        CommonUtil.log("describe_eip_address", eip_response_json)
    
        # NAT Gatewayのクエリ
        params['nat_gateway_id '] = nat_gateway_json['NatGatewayId']
        nat_gateway_json = nat_gateway.describe_nat_gateway(params['nat_gateway_id])
        CommonUtil.log("describe_nat_gateway", nat_gateway_json)
    
        # SNATエントリを削除します。
        params['snat_entry_id '] = snat_entry_json['SnatEntryId']
        snat_entry_json = nat_gateway.delete_snat_entry(params)
        CommonUtil.log("delete_snat_entry", snat_entry_json)
    
        # EIPとNATゲートウェイの関連付けを解除します。
        eip_response_json = eip.unassociate_eip_address(params)
        CommonUtil.log("unassociate_eip_address nat", eip_response_json)
    
        # NATゲートウェイを削除します。
        nat_gateway_json = nat_gateway.delete_nat_gateway(params)
        CommonUtil.log("delete_nat_gateway", nat_gateway_json)
    
        # EIPをリリースします。
        eip_response_json = eip.release_eip_address(params)
        CommonUtil.log("release_eip_address", eip_response_json)
    
        # vSwitchを削除します。
        params['vswitch_id'] = vswitch_json['VSwitchId']
        vswitch_json = vswitch.de lete_vswitch(params)
        CommonUtil.log("delete_vswitch", vswitch_json)
    
        # VPCを削除します。
        vpc_json = vpc.de lete_vpc(params)
        CommonUtil.log("delete_vpc", vpc_json)
    
    
    if __name__ == "__main__":
        sys.exit(main()) 
  3. natgw_snat.pyファイルが保存されているディレクトリに移動し、次のコマンドを実行してSNATエントリを作成します。
    python natgw_snat.py

結果

次の出力が返されます。
--------------------------- create_vpc ---------------------------
{
  "ResourceGroupId": "rg-acfmxazxxxxxxxx" 、
  "RouteTableId": "vtb-uf6a8ccj9ne58xxxxxxxx" 、
  "VRouterId": "vrt-uf6qqqaf1o1ptxxxxxxxx" 、
  "VpcId": "vpc-uf6hxer3h07wgxxxxxxxx" 、
  "RequestId": "8F483A7B-8A38-47ED-85BD-1E83C075AEA4"
}

--------------------------- create_vswitch ---------------------------
{
  "VSwitchId": "vsw-uf6lbov9tyetqxxxxxxxx" 、
  "RequestId": "2EE2E11B-EF60-4C88-BE2A-F45517290B31"
}

--------------------------- create_nat_gateway
{
  "NatGatewayId": "ngw-uf6l3c3rswubuxxxxxxxx" 、
  "BandwidthPackageIds": {
    "BandwidthPackageId": []
  },
  "ForwardTableIds": {
    "ForwardTableId": [
      「ftb-uf6086r1hyecbxxxxxxxx」
    ]
  },
  "RequestId": "9037D769-24C8-46AD-83F3-4C0538FA5970" 、
  "SnatTableIds": {
    "SnatTableId": [
      「stb-uf6ppo11rsecmxxxxxxxx」
    ]
  }
}

--------------------------- allocate_eip_address
{
  "EipAddress": "101.xx. xx.110" 、
  "ResourceGroupId": "rg-acfmxazxxxxxxxx" 、
  "RequestId": "0DE621B4-6BDE-4E17-A294-8F71FBB9F710" 、
  "AllocationId": "eip-uf6d311cpmr0nxxxxxxxx"
}

--------------------------- associate_eip_address eip ---------------------------
{
  "RequestId": "C95B2EDC-F081-4784-B60B-2600F60E684D"
}

--------------------------- create_snat_entry ---------------------------
{
  "SnatEntryId": "snat-uf6ppbwshdu40xxxxxxxx" 、
  "RequestId": "BB9F8FD2-3CB5-4F84-8006-FE64BF3BEA06"
}

--------------------------- describe_eip_address
{
  &quot;TotalCount&quot;:1、
  "PageNumber":1、
  "PageSize":10、
  "EipAddresses": {
    "EipAddress": [
      {
        "ISP": "BGP" 、
        "ExpiredTime": "",
        "InternetChargeType": "PayByBandwidth",
        "IpAddress": "101.xx. xx.110" 、
        "AllocationId": "eip-uf6d311cpmr0nxxxxxxxx" 、
        "PrivateIpAddress": "" 、
        "ステータス": "InUse" 、
        "BandwidthPackageId": "" 、
        "InstanceId": "ngw-uf6l3c3rswubuxxxxxxxx" 、
        "InstanceRegionId": "cn-shanghai" 、
        "RegionId": "cn-shanghai",
        "AvailableRegions": {
          "AvailableRegion": [
            "cn-shanghai"
          ]
        },
        "ResourceGroupId": "rg-acfmxazxxxxxxxx" 、
        "HasReservationData": false、
        "InstanceType": "Nat" 、
        "AllocationTime": "2019-04-24T11:20:09Z" 、
        "名前": "" 、
        "OperationLocks": {
          "LockReason": []
        },
        "モード": "NAT" 、
        "BandwidthPackageType": "" 、
        "BandwidthPackageBandwidth": "" 、
        "Bandwidth": "5",
        "HDMonitorStatus": "OFF" 、
        "ChargeType": "PostPaid" 、
        "SecondLimited": false、
        "Descritpion": "
      }
    ]
  },
  "RequestId": "19052237-6E84-4258-89B9-05772C33C0DC"
}

--------------------------- describe_nat_gateway
{
  &quot;TotalCount&quot;:1、
  "PageNumber":1、
  "RequestId": "26CAA3FE-B400-4522-9582-2DAAF69129AE" 、
  "PageSize":10、
  "NatGateways": {
    "NatGateway": [
      {
        "ステータス": "利用可能" 、
        "BandwidthPackageIds": {
          "BandwidthPackageId": []
        },
        "VpcId": "vpc-uf6hxer3h07wgxxxxxxxx" 、
        "Description": "",
        "ForwardTableIds": {
          "ForwardTableId": [
            「ftb-uf6086r1hyecbxxxxxxxx」
          ]
        },
        "IpLists": {
          "IpList": [
            {
              "UsingStatus": "UsedBySnatTable" 、
              "IpAddress": "101.xx. xx.110" 、
              "AllocationId": "eip-uf6d311cpmr0nxxxxxxxx"
            }
          ]
        },
        "BusinessStatus": "Normal" 、
        "RegionId": "cn-shanghai",
        "CreationTime": "2019-04-24T11:20:06Z" 、
        "NatGatewayId": "ngw-uf6l3c3rswubuxxxxxxxx" 、
        "SnatTableIds": {
          "SnatTableId": [
            「stb-uf6ppo11rsecmxxxxxxxx」
          ]
        },
        "AutoPay": false、
        &quot;InstanceChargeType&quot;: &quot;後払い&quot;、
        "ExpiredTime": "",
        "スペック": "小さい" 、
        "名前": ""
      }
    ]
  }
}

--------------------------- delete_snat_entry ---------------------------
{
  "RequestId": "CDA82881-ACF0-4DD1-887B-A764F56F180D"
}

--------------------------- unassociate_eip_address nat --------------------------
-
{
  "RequestId": "140C46FF-0DB0-47F9-B0F4-3459DF117EAF"
}

--------------------------- delete_nat_gateway
{
  "RequestId": "8709747C-6786-443C-8AEA-51647AA49769"
}

--------------------------- release_eip_address
{
  "RequestId": "0BC21C23-0FB3-4594-8B14-6552DF788C93"
}

--------------------------- delete_vswitch ---------------------------
{
  "RequestId": "16E840EC-E058-40C1-A5BF-8CDF672EA139"
}

--------------------------- delete_vpc ---------------------------
{
  "RequestId": "B5F18126-FF2A-4005-9973-3984034DF0F4"
}