Typically, when documenting how to use the Python interface boto with Eucalyptus clouds, the function connect_<service> is always leveraged (<service> being ec2, s3, iam, sts, elb, cloudformation, cloudwatch, or autoscale). The focus of this blog entry is to demonstrate how to use the connect_to_region function associated with each AWS service supported by Eucalyptus. This will be very important when using boto with federated Eucalyptus clouds, which will be available in the release of HP Helion Eucalyptus 4.2.0.
Prerequisites
To get started, the following requirements need to be met:
- Python 2.6 or Higher
- boto 2.34.0 or higher (latest version at the time of this blog entry was 2.38.0)
- Eucalyptus 4.1.0 or Higher Cloud with Eucalyptus DNS enabled
- Access Key ID and Secret Access Key for a user under a Eucalyptus IAM account
- eucarc file containing Eucalyptus service API endpoints
- Eucalyptus IAM policy that provides access to given Eucalyptus service API resources applied to the user account
The Setup
Once the prerequisites are met, now we can focus on setting up the configuration file for boto. Below is an example of a boto configuration file:
[Credentials] aws_access_key_id = <Eucalyptus Access Key ID> aws_secret_access_key = <Eucalyptus Secret Access Key> [Boto] is_secure = False endpoints_path = /root/boto-qa-setup1-endpoints.json
Notice the file boto-qa-setup1-endpoints.json. This is a JSON file that contains the Eucalyptus service API endpoints correlating to the Eucalyptus cloud that would like to be accessed. Here are the contents of the boto-qa-setup1-endpoints.json file:
{ "autoscaling": { "eucalyptus": "autoscaling.h-01.autoqa.qa1.eucalyptus-systems.com" }, "cloudformation": { "eucalyptus": "cloudformation.h-01.autoqa.qa1.eucalyptus-systems.com" }, "cloudwatch": { "eucalyptus": "cloudwatch.h-01.autoqa.qa1.eucalyptus-systems.com" }, "ec2": { "eucalyptus": "compute.h-01.autoqa.qa1.eucalyptus-systems.com" }, "elasticloadbalancing": { "eucalyptus": "loadbalancing.h-01.autoqa.qa1.eucalyptus-systems.com" }, "iam": { "eucalyptus": "euare.h-01.autoqa.qa1.eucalyptus-systems.com" }, "s3": { "eucalyptus": "objectstorage.h-01.autoqa.qa1.eucalyptus-systems.com" }, "sts": { "eucalyptus": "tokens.h-01.autoqa.qa1.eucalyptus-systems.com" }, "swf": { "eucalyptus": "simpleworkflow.h-01.autoqa.qa1.eucalyptus-systems.com" } }
As you can see, each AWS service implemented by Eucalyptus is defined in this file. With the boto configuration file and endpoints json file defined, the connect_to_region function in boto can be easily utilized.
Example
To show how this setup works, ipython will be used as the demonstration environment. Below is an example that shows how to use the connect_to_region function with the Compute service (EC2) against a Eucalyptus 4.1 cloud.
# ipython Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36) Type "copyright", "credits" or "license" for more information.
IPython 0.13.2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details.
In [1]: import boto.ec2
In [2]: ec2_connection = boto.ec2.connect_to_region('eucalyptus', port=8773)
In [3]: ec2_connection.get_all_instance_types() Out[3]: [InstanceType:m1.small-1,256,5, InstanceType:t1.micro-1,256,5, InstanceType:m1.medium-1,512,10, InstanceType:c1.medium-2,512,10, InstanceType:m1.large-2,512,10, InstanceType:m1.xlarge-2,1024,10, InstanceType:c1.xlarge-2,2048,10, InstanceType:m2.xlarge-2,2048,10, InstanceType:m3.xlarge-4,2048,15, InstanceType:m2.2xlarge-2,4096,30, InstanceType:m3.2xlarge-4,4096,30, InstanceType:cc1.4xlarge-8,3072,60, InstanceType:m2.4xlarge-8,4096,60, InstanceType:hi1.4xlarge-8,6144,120, InstanceType:cc2.8xlarge-16,6144,120, InstanceType:cg1.4xlarge-16,12288,200, InstanceType:cr1.8xlarge-16,16384,240, InstanceType:hs1.8xlarge-48,119808,24000]
Here is an example of describing the volumes and snapshots on a given Eucalyptus cloud:
In [3]: ec2_connection.get_all_volumes() Out[3]: [Volume:vol-563802cd, Volume:vol-274c3628, Volume:vol-7074a3a8, Volume:vol-172cdb42, Volume:vol-d00e53e9, Volume:vol-4f370899]
In [4]: ec2_connection.get_all_snapshots() Out[4]: [Snapshot:snap-6d874d5a, Snapshot:snap-e41c6adc, Snapshot:snap-63700417, Snapshot:snap-6055a378, Snapshot:snap-91d70d6b, Snapshot:snap-7b39eca8, Snapshot:snap-80a4f3e2]
Just like the EC2 tutorial by boto demonstrates how to use connect_to_region with AWS EC2, this function can also be used against Eucalyptus 4.1 clouds as well. As mentioned earlier, when region support (multiple Eucalyptus clouds) becomes available in Eucalyptus 4.2, this function will be very useful.
Enjoy!