このトピックでは、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
背景情報
このトピックのサンプルコードには、次の操作が含まれます。- 中国 (上海) リージョンに仮想プライベートクラウド (VPC) を作成します。
- VPCのvSwitchを作成します。
- VPCにNATゲートウェイを作成します。
- 中国 (上海) リージョンでelastic IPアドレス (EIP) を作成します。
- EIPをNATゲートウェイに関連付けます。
- SNATエントリを作成します。
- NATゲートウェイに関連付けられているEIPを照会します。
- NAT gatewayを照会します。
- SNATエントリを削除します。
- NATゲートウェイからEIPの関連付けを解除します。
- NAT gatewayを削除します。
- EIPをリリースします。
- vSwitchを削除します。
- VPCを削除します。
手順
- ダウンロードしたSDKファイルのディレクトリで、aliyun-openapi-python-sdk-examples\sdk_examples\examples\natgwフォルダーを開きます。
- テキストエディターで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())
- 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
{
"TotalCount":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
{
"TotalCount":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、
"InstanceChargeType": "後払い"、
"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"
}