通过 ec2-api / boto 调用 OpenStack 功能
OpenStack 支持 amazon ec2 的 api,并能通过 python 库 boto 来进行调用。目前,社区在把 ec2-api 从 nova-api 中脱离出来,独立作为一个项目,放到 stackforge 中。项目的源代码地址为 https://github.com/stackforge/ec2-api
创建验证信息
ec2-api 有自己的验证方式,并转换到 keystone 上进行最终的验证。在使用前,需要先创建 ec2 的凭据信息:
keystone --tenant-id <tenant-id> --user-id <user-id> ec2-credentials-create
可通过下面的命令查看所有的 ec2 凭据信息:
keystone ec2-credentials-list
输出的结果如下:
+--------+----------------------------------+----------------------------------+
| tenant | access | secret |
+--------+----------------------------------+----------------------------------+
| admin | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+--------+----------------------------------+----------------------------------+
然后,可使用 boto 来调用 ec2-api。
使用 boto 调用 ec2-api
首先安装 boto,安装 2.25.0 之前的版本
pip install boto<2.35.0
由于 boto 2.35.0 以后的版本,在签名上与 OpenStack 采用的流程有点不同(在 IceHouse 版本上还存在此问题),因此会导致兼容性问题,在 nova-api 中会有错误信息:
AuthFailure: Signature not provided
如果遇到这种情况,更换为 2.34.0 即可。
然后,使用 ec2 凭据信息的 access 和 secret 来连接 OpenStack:
import boto
from boto.ec2.connection import EC2Connection
region = boto.ec2.RegionInfo(name='nova', endpoint='<OpenStack IP>')
conn = EC2Connection(aws_access_key_id="<access>",
aws_secret_access_key="<secret>",
is_secure=False,
port=8773,
path='/services/Cloud',
region=region)
regions = conn.get_all_regions()
print('--regions--')
print(str(regions))
boto / ec2-api 还支持很多其它的操作,均通过 EC2Connection 来进行。
在 stackforge 上, ThoughtWorks 贡献了 ec2-driver,实现 nova 调用 ec2。通过适当的修改,可以通过 ec2-api 来集成其它的 OpenStack(即 OpenStack on OpenStack )。