This topic describes how to use the Alibaba Cloud SDK for Python to associate an elastic IP address (EIP) with an Elastic Compute Service (ECS) instance.

Prerequisites

Before you run the Alibaba Cloud SDK for Python, make sure that the following requirements are met:
  • An Alibaba Cloud account and an AccessKey pair (AccessKey ID and AccessKey secret) are required to use the Alibaba Cloud SDK for Python. You can create and view your AccessKey pair on the Console Logon Management page in the Resource Access Management (RAM) console.
  • Make sure that the Alibaba Cloud SDK for Python is installed. For more information, see aliyun-python-sdk-vpc 3.0.8.
  • The VPC Python example library is downloaded.
    Go to the directory wheresetup.py is located, and run the following command to initialize the environment:
    python setup.py install

Background information

The sample code includes the following operations:
  1. Create an EIP in the China (Hangzhou) region.
  2. Associate the created EIP with an ECS instance.
  3. Query the EIP that is associated with the ECS instance.
  4. Modify the maximum bandwidth and name of the EIP.
  5. Query the modified EIP.
  6. Disassociate the EIP from the ECS instance.
  7. Releases the EIP.

Procedure

  1. In the downloaded SDK directory, open the $aliyun-openapi-python-sdk-examples\sdk_examples\examples\eip folder.
  2. Open the eip_quick_start.py file in your text editor. Set the parameters as required, save the configurations, and exit the editor.
    The following sample code is displayed:
    #encoding=utf-8
    import sys
    import json
    from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
    from aliyunsdkvpc.request.v20160428 import AllocateEipAddressRequest
    from aliyunsdkvpc.request.v20160428 import AssociateEipAddressRequest
    from aliyunsdkvpc.request.v20160428 import DescribeEipAddressesRequest
    from aliyunsdkvpc.request.v20160428 import UnassociateEipAddressRequest
    from aliyunsdkvpc.request.v20160428 import ModifyEipAddressAttributeRequest
    from aliyunsdkvpc.request.v20160428 import ReleaseEipAddressRequest
    from sdk_lib.exception import ExceptionHandler
    from sdk_lib.check_status import CheckStatus
    from sdk_lib.consts import *
    from sdk_lib.common_util import CommonUtil
    
    """
    1. Create an EIP. 2. Associate the EIP to an ECS instance. 3. Query the EIP. 4. Modify the configuration and name of the EIP. 5. Query the EIP. 6. Disassociate the EIP. 7. Release the EIP.
    """
    class Eip(object):
        def __init__(self, client):
            self.client = client
    
        def allocate_eip_address(self, params):
            """
            allocate_eip_address: requests an elastic IP address (EIP).
    
            """
            try:
                request = AllocateEipAddressRequest.AllocateEipAddressRequest()
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
                                            self.describe_eip_status,
                                            AVAILABLE, response_json["AllocationId"]):
                    return 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: associates the EIP with a cloud resource that is deployed in the same region.
    
            """
            try:
                request = AssociateEipAddressRequest.AssociateEipAddressRequest()
                # The ID of the EIP.
                request.set_AllocationId(params['allocation_id'])
                # The type of the cloud resource with which the EIP is associated.
                request.set_InstanceType(params['instance_type'])
                # The ID of the cloud resource.
                request.set_InstanceId(params['instance_id'])
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
                                            self.describe_eip_status,
                                            InUse, params['allocation_id']):
                    return 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_status: queries the created EIPs in a specified region.
    
            """
            try:
                request = DescribeEipAddressesRequest.DescribeEipAddressesRequest()
                # The ID of the EIP.
                request.set_AllocationId(allocation_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_eip_status(self, allocation_id):
            """
            describe_eip_status: queries the status of the created EIP in a specified region.
    
            """
            # The ID of the EIP.
            response = self.describe_eip_address(allocation_id)
            return response["EipAddresses"]["EipAddress"][0]["Status"]
    
    
        def unassociate_eip_address(self, params):
            """
            unassociate_eip_address: disassociates the EIP from the cloud resource.
    
            """
            try:
                request = UnassociateEipAddressRequest.UnassociateEipAddressRequest()
                # The ID of the EIP.
                request.set_AllocationId(params['allocation_id'])
                # The type of the cloud resource type.
                request.set_InstanceType(params['instance_type'])
                # The ID of the cloud resource.
                request.set_InstanceId(params['instance_id'])
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
                                            self.describe_eip_status,
                                            AVAILABLE, params['allocation_id']):
                    return response_json
                return 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: modifies the name, description, and maximum bandwidth of the EIP.
    
            """
            try:
                request = ModifyEipAddressAttributeRequest.ModifyEipAddressAttributeRequest()
                # The ID of the EIP.
                request.set_AllocationId(params['allocation_id'])
                # The maximum bandwidth of the EIP. Unit: Mbit/s.
                request.set_Bandwidth(params['bandwidth'])
                # The name of the EIP.
                request.set_Name(params['name'])
                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 release_eip_address(self, params):
            """
            release_eip_address: releases the specified EIP.
    
            """
            try:
                request = ReleaseEipAddressRequest.ReleaseEipAddressRequest()
                # The ID of the EIP to be released.
                request.set_AllocationId(params['allocation_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 main():
    
        client = AcsClient(
                '<your-access-key-id>',     # Your AccessKey ID.
                '<your-access-key-secret>', # Your AccessKey secret.
                '<your-region-id>')         # Your region ID.
    
        params = {}
        # Create an EIP.
        eip_response_json = eip.allocate_eip_address(params)
        CommonUtil.log("allocate_eip_address", eip_response_json)
    
        # Associate the EIP to an ECS instance.
        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)
    
        # Query the EIP.
        eip_response_json = eip.describe_eip_address(params['allocation_id'])
        CommonUtil.log("describe_eip_address", eip_response_json)
    
        # Modify the configuration and name of the EIP.
        params['bandwidth'] = BANDWIDTH_50
        params['name'] = EIP_NEW_NAME
        eip_response_json = eip.modify_eip_address(params)
        CommonUtil.log("modify_eip_address", eip_response_json)
    
        # Query the EIP.
        eip_response_json = eip.describe_eip_address(params['allocation_id'])
        CommonUtil.log("describe_eip_address", eip_response_json)
    
        # Disassociate the EIP.
        eip_response_json = eip.unassociate_eip_address(params)
        CommonUtil.log("unassociate_eip_address", eip_response_json)
    
        # Release the EIP.
        eip_response_json = eip.release_eip_address(params)
        CommonUtil.log("release_eip_address", eip_response_json)
    
    if __name__ == '__main__':
        sys.exit(main())
    
    						
  3. Go to the directory where the eip_quick_start.py file is located, and run the following command to associate an EIP with an ECS instance:
    python eip_quick_start.py

Result

The following system output is displayed:
---------------------------allocate_eip_address---------------------------
{
  "EipAddress": "47.xx.xx.23",
  "ResourceGroupId": "rg-acfm4odxxxxxxxx",
  "RequestId": "C438312E-F7A4-4A04-901F-D22FE23EDB4D",
  "AllocationId": "eip-bp1wybucvhhx5xxxxxxxx"
}
---------------------------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-bp1wybucvhhx5xxxxxxxx",
        "PrivateIpAddress": "",
        "Status": "InUse",
        "BandwidthPackageId": "",
        "InstanceId": "i-bp1e82xlhob2xxxxxxxx",
        "InstanceRegionId": "cn-hangzhou",
        "RegionId": "cn-hangzhou",
        "AvailableRegions": {
          "AvailableRegion": [
            "cn-hangzhou"
          ]
        },
        "ResourceGroupId": "rg-acfm4odxxxxxxxx",
        "HasReservationData": false,
        "InstanceType": "EcsInstance",
        "AllocationTime": "2019-04-17T11:57:43Z",
        "Name": "",
        "OperationLocks": {
          "LockReason": []
        },
        "Mode": "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-bp1wybucvhhx5xxxxxxxx",
        "PrivateIpAddress": "",
        "Status": "InUse",
        "BandwidthPackageId": "",
        "InstanceId": "i-bp1e82xlhob2xxxxxxxx",
        "InstanceRegionId": "cn-hangzhou",
        "RegionId": "cn-hangzhou",
        "AvailableRegions": {
          "AvailableRegion": [
            "cn-hangzhou"
          ]
        },
        "ResourceGroupId": "rg-acfm4odxxxxxxxx",
        "HasReservationData": false,
        "InstanceType": "EcsInstance",
        "AllocationTime": "2019-04-17T11:57:43Z",
        "Name": "EIP_NEW_NAME",
        "OperationLocks": {
          "LockReason": []
        },
        "Mode": "NAT",
        "BandwidthPackageType": "",
        "BandwidthPackageBandwidth": "",
        "Bandwidth": "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"
}