このトピックでは、Alibaba Cloud SDK for Pythonを使用してelastic IPアドレス (EIP) をElastic Compute Service (ECS) インスタンスに関連付ける方法について説明します。
前提条件
Alibaba Cloud SDK for Pythonを使用する前に、次の要件が満たされていることを確認してください。
- Alibaba CloudアカウントとAccessKeyペアが取得されます。 Alibaba Cloud管理コンソールの [セキュリティ管理] ページで、AccessKeyペアを作成して表示できます。
- Alibaba Cloud SDK for Pythonがインストールされています。
- VPC Pythonサンプルライブラリがダウンロードされます。 setup.pyファイルが保存されているディレクトリに移動し、次のコマンドを実行して環境を初期化します。
python setup.py install
背景情報
このトピックのサンプルコードには、次の操作が含まれます。- 中国 (杭州) リージョンでEIPを作成します。
- EIPをECSインスタンスに関連付けます。
- ECSインスタンスに関連付けられているEIPを照会します。
- EIPの最大帯域幅と名前を変更します。
- 変更されたEIPを照会します。
- ECSインスタンスからEIPの関連付けを解除します。
- EIPをリリースします。
手順
- ダウンロードしたSDKファイルのディレクトリで、aliyun-openapi-python-sdk-examples\sdk_examples\examples\eipフォルダーを開きます。
- テキストエディターでeip_quick_start.pyファイルを開きます。 必要なパラメーターを設定し、設定を保存してから、エディターを終了します。 次のサンプルコードが表示されます。
#encoding=utf-8 インポートsys jsonのインポート alibabacloud_credentials.clientからCredClientとしてのインポートクライアント からaliyunsdkcore.acs_exception.exceptions import ServerException, ClientException aliyunsdkvpc.request.v20160428からAllocateEipAddressRequestをインポート aliyunsdkvpc.request.v20160428からAssociateEipAddressRequestをインポート aliyunsdkvpc.request.v20160428からDescribeEipAddressesRequestをインポート aliyunsdkvpc.request.v20160428からUnassociateEipAddressRequestをインポート aliyunsdkvpc.request.v20160428からModifyEipAddressAttributeRequestをインポート aliyunsdkvpc.request.v20160428からReleaseEipAddressRequestをインポート sdk_lib.exception import ExceptionHandlerから sdk_lib.check_statusからCheckStatusをインポートする sdk_lib.consts import * から sdk_lib.common_utilインポートからCommonUtil """ 1. EIP を作成します。 2. EIPをECSインスタンスに関連付けます。 3. EIPを照会します。 4. EIPの設定と名前を変更します。 5. EIPを照会します。 6. EIPの関連付けを解除します。 7. EIPをリリースします。 """ クラスEip (オブジェクト): def __init__(self, client): self.client=クライアント def allocate_eip_address(self, params): """ allocate_eip_address: EIPを作成します。 """ 試してみてください。 request = AllocateEipAddressRequest。AllocateEipAddressRequest() response = self.client.do_action_with_exception(request) response_json = json.loads (レスポンス) CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME, self.de scribe_eip_status、 利用可能、response_json["AllocationId"]): response_jsonを返します except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def associate_eip_address(self, params): """ associate_eip_address: 同じリージョンにデプロイされているクラウドリソースにEIPを関連付けます。 """ 試してみてください。 request = AssociateEipAddressRequest。AssociateEipAddressRequest() # EIPのID。 request.set_AllocationId(params['allocation_id']) # EIPを関連付けるクラウドリソースのタイプ。 request.set_InstanceType(params['instance_type']) # EIPを関連付けるクラウドリソースのID。 request.set_InstanceId(params['instance_id']) response = self.client.do_action_with_exception(request) response_json = json.loads (レスポンス) CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME, self.de scribe_eip_status、 InUse、params['allocation_id']): response_jsonを返します except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def describe_eip_address(self, allocation_id): """ describe_eip_address: 特定のリージョンのEIPを照会します。 """ 試してみてください。 request = DescribeEipAddressesRequest.DescribeEipAddressesRequest() # EIPのID。 request.set_AllocationId(allocation_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_eip_status(self, allocation_id): """ describe_eip_status: リージョン内のEIPのステータスを照会します。 """ # EIPのID。 response = self.de scribe_eip_address(allocation_id) リターンレスポンス ["EipAddresses"]["EipAddress"][0]["Status"] def unassociate_eip_address(self, params): """ unassociate_eip_address: 関連するクラウドリソースからEIPの関連付けを解除します。 """ 試してみてください。 request = UnassociateEipAddressRequest。UnassociateEipAddressRequest() # EIPのID。 request.set_AllocationId(params['allocation_id']) # EIPの関連付けを解除するクラウドリソースのタイプ。 request.set_InstanceType(params['instance_type']) # EIPの関連付けを解除するクラウドリソースのID。 request.set_InstanceId(params['instance_id']) response = self.client.do_action_with_exception(request) response_json = json.loads (レスポンス) CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME, self.de scribe_eip_status、 利用可能、params['allocation_id']): response_jsonを返します response_jsonを返します except ServerException as e: ExceptionHandler.server_exception(e) except ClientException as e: ExceptionHandler.client_exception(e) def modify_eip_address(self, params): """ modify_eip_address: EIPの名前、説明、および最大帯域幅値を変更します。 """ 試してみてください。 request = ModifyEipAddressAttributeRequest。ModifyEipAddressAttributeRequest() # EIPのID。 request.set_AllocationId(params['allocation_id']) # EIPの最大帯域幅値。 単位:Mbit/秒。 request.set_Bandwidth(params['bandwidth']) # EIPの名前。 request.set_Name(params['name']) 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 release_eip_address(self、params): """ release_eip_address: 特定のEIPをリリースします。 """ 試してみてください。 request = ReleaseEipAddressRequest。ReleaseEipAddressRequest() # リリースするEIPのID。 request.set_AllocationId(params['allocation_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 main(): # 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() # Create an AcsClient instance. client = AcsClient(access_key_id, access_key_secret, '<your-region-id>') eip = Eip (クライアント) params = {} # EIPを作成します。 eip_response_json = eip.allocate_eip_address(params) CommonUtil.log("allocate_eip_address", eip_response_json) # EIPをECSインスタンスに関連付けます。 params['allocation_id'] = eip_response_json["AllocationId"] params['instance_id'] = ECS_INSTANCE_ID params['instance_type'] = 'EcsInstance' eip_response_json = eip.associate_eip_address(params) CommonUtil.log("associate_eip_address", eip_response_json) # EIPを照会します。 eip_response_json = eip.de scribe_eip_address(params['allocation_id']) CommonUtil.log("describe_eip_address", eip_response_json) # EIPの設定と名前を変更します。 params['bandwidth'] = BANDWIDTH_50 params['name'] = EIP_NEW_NAME eip_response_json = eip.mo dify_eip_address(params) CommonUtil.log("modify_eip_address", eip_response_json) # EIPを照会します。 eip_response_json = eip.de scribe_eip_address(params['allocation_id']) CommonUtil.log("describe_eip_address", eip_response_json) # EIPとNATゲートウェイの関連付けを解除します。 eip_response_json = eip.unassociate_eip_address(params) CommonUtil.log("unassociate_eip_address", eip_response_json) # EIPをリリースします。 eip_response_json = eip.release_eip_address(params) CommonUtil.log("release_eip_address", eip_response_json) if __name__ ='__main__': sys.exit(main())
- eip_quick_start.pyファイルが保存されているディレクトリに移動し、次のコマンドを実行してEIPをECSインスタンスに関連付けます。
python eip_quick_start.py
結果
次の出力が返されます。
--------------------------- allocate_eip_address ---------------------------
{
"EipAddress": "47.XX. XX.23" 、
"ResourceGroupId": "rg-acfm4od ****" 、
"RequestId": "C438312E-F7A4-4A04-901F-D22FE23EDB4D" 、
"AllocationId": "eip-bp1wybucvhhx5 ****"
}
--------------------------- associate_eip_address
{
"RequestId": "6EC6605E-3D2B-4EE8-BD13-F1964CD1EAB1"
}
--------------------------- describe_eip_address
{
"TotalCount":1、
"PageNumber":1、
"PageSize":10、
"EipAddresses": {
"EipAddress": [
{
"ISP": "BGP" 、
"ExpiredTime": "",
"InternetChargeType": "PayByBandwidth",
"IpAddress": "47.XX. XX.23" 、
"AllocationId": "eip-bp1wybucvhhx5 ****" 、
"PrivateIpAddress": "" 、
"ステータス": "InUse" 、
"BandwidthPackageId": "" 、
"InstanceId": "i-bp1e82xlhob2 ****" 、
"InstanceRegionId": "cn-hangzhou" 、
"RegionId": "cn-hangzhou"、
"AvailableRegions": {
"AvailableRegion": [
"cn-hangzhou"
]
},
"ResourceGroupId": "rg-acfm4od ****" 、
"HasReservationData": false、
"InstanceType": "EcsInstance",
"AllocationTime": "2019-04-17T11:57:43Z" 、
"名前": "" 、
"OperationLocks": {
"LockReason": []
},
"モード": "NAT" 、
"BandwidthPackageType": "" 、
"BandwidthPackageBandwidth": "" 、
"Bandwidth": "5",
"HDMonitorStatus": "OFF" 、
"ChargeType": "PostPaid" 、
"SecondLimited": false、
"Descritpion": "
}
]
},
"RequestId": "8715A878-A808-4CC4-AAD5-E414FDAB5B0E"
}
--------------------------- modify_eip_address
{
"RequestId": "2108AE1C-94FB-475D-BFEE-EC88598BF6A6"
}
--------------------------- describe_eip_address
{
"TotalCount":1、
"PageNumber":1、
"PageSize":10、
"EipAddresses": {
"EipAddress": [
{
"ISP": "BGP" 、
"ExpiredTime": "",
"InternetChargeType": "PayByBandwidth",
"IpAddress": "47.XX. XX.23" 、
"AllocationId": "eip-bp1wybucvhhx5 ****" 、
"PrivateIpAddress": "" 、
"ステータス": "InUse" 、
"BandwidthPackageId": "" 、
"InstanceId": "i-bp1e82xlhob2 ****" 、
"InstanceRegionId": "cn-hangzhou" 、
"RegionId": "cn-hangzhou"、
"AvailableRegions": {
"AvailableRegion": [
"cn-hangzhou"
]
},
"ResourceGroupId": "rg-acfm4od ****" 、
"HasReservationData": false、
"InstanceType": "EcsInstance",
"AllocationTime": "2019-04-17T11:57:43Z" 、
"名前": "EIP_NEW_NAME" 、
"OperationLocks": {
"LockReason": []
},
"モード": "NAT" 、
"BandwidthPackageType": "" 、
"BandwidthPackageBandwidth": "" 、
"帯域幅": "50" 、
"HDMonitorStatus": "OFF" 、
"ChargeType": "PostPaid" 、
"SecondLimited": false、
"Descritpion": "
}
]
},
"RequestId": "6694D35B-B5DD-4506-8AB1-2D16477646DE"
}
--------------------------- unassociate_eip_address ---------------------------
{
"RequestId": "EDE86CF6-EE68-4922-B919-85A4F11BF668"
}
--------------------------- release_eip_address
{
"RequestId": "53FEE062-B595-4D64-AB47-834015D32888"
}