注解

    这项服务,之前是由CloudBridge独立软件实现的。现在已经完全集成到CloudStack管理服务中。

    警告

    EC2 Query API和S3 API兼容接口的支持工作正在进行中。S3的兼容API提供了一种在管理服务器的文件系统中存储数据的方法,它不是S3 后端实现的。

    局限性

    • 只支持使用基本网络的zone。

    • 仅对全新安装的CloudStack可用。通过旧版本升级的不可用。

    • 如弹性IP(EIP)和弹性负载均衡(ELB)这些特性,仅对有Citrix NetScaler设备的架构可用。用户接入有NetScaler设备的zone时,需要使用NetScaler-enabled网络方案(DefaultSharedNetscalerEIP和ELBNetworkOffering)。

    支持的API版本

    注解

    支持更新版本的EC2 API的工作正在进行

    提供AWS API兼容性的软件随CloudStack一起安装。在使用之前,你必须使能服务并操作一些安装步骤。

    1. 将全局配置参数中的每项服务设置为true。详看 *Setting Global Configuration Parameters*.

    2. 创建一组匹配亚马逊服务方案的名称。这个可以按照管理员操作手册在CloudStack界面上进行操作。

      警告

      除了可能使用的EC2实例类型,确保已包含亚马逊默认服务方案,m1.small。

    3. 如果按照步骤1设置了配置参数后,没有重启,那么重启管理服务器。

    以下内容提供了这些步骤的细节

    开启服务

    为了使能EC2和S3兼容服务,你需要将 enable.ec2.api \和 *enable.s3.api 的值设置为true。以使能你所需要的服务。这个可以在CloudStack的界面上的\Global Settings*或者API来实现。

    下面的截图展示如何通过GUI使能这些服务。

    使用CloudStack API最简单的方法是使用集成接口,这个接口可以使用无验证调用。在全局设置中将这个接口设置为8096,然后调用 updateConfiguration 。下面的URL展示如何使用。

    1. http://localhost:8096/client/api?command=updateConfiguration&name=enable.ec2.api&value=true
    2. http://localhost:8096/client/api?command=updateConfiguration&name=enable.ec2.api&value=true

    一旦使能这些服务,重启服务器。

    创建EC2兼容服务方案

    可以定义兼容 Amazon EC2实例类型 API名称的计算服务方案。(例如m1.small,m1.large),这个可以通过CloudStack界面进行操作。在 Service Offerings 中选择 Compute offering ,创建一个新的计算方案或者修改已存在的皆可。确保名称与EC2实例类型API名称匹配。下面的截图将展示如何操作。

    Use the GUI to set the name of a compute service offering to an EC2 instance type API name.

    修改AWS API端口

    注解

    (可选)AWS API在端口7080监听请求。如果你希望监听另外的端口,可通过如下步骤修改:

    1. 编辑文件 , /etc/cloudstack/management/server-nonssl.xml , /etc/cloudstack/management/server-ssl.xml` `.

    2. 在每个文件中找出的标签,在这个标签下,定位到<Connector executor=”tomcatThreadPool-internal” port= ….<

    3. 将这个端口改为你想用的任何端口,并保存文件。

    如果你重装CloudStack,你需要重新使能服务并更新端口。

    AWS API用户安装

    总的来说,用户不需要察觉CloudStack所提供的翻译服务。只需将AWS API调用发送到CloudStack端,然后被转换为CloudStack API。Amazon EC2兼容接口用户可继续使用已有的EC2工具和脚本,并通过指定管理服务器的端及合适的用户证书,将它们用于CloudStack部署。为此,用户需要进行如下步骤的操作:

    • 生成用户证书

    • 向服务注册。

    为了使用EC2命令行工具,用户需要操作以下步骤:

    1. 确定你具有正确版本的EC2工具。所支持的版本可以在 ` [http://s3.amazonaws.com/ec2-downloads/ec2-api-tools-1.3-62308.zip](http://s3.amazonaws.com/ec2-downloads/ec2-api-tools-1.3-62308.zip)\`_获取。

    2. 设置EC2环境变量。可在每次使用服务时设置或者写入合适的shell profile文件中。将端(如EC2_URL)替换为合适的CloudStack管理服务器地址和端口。可在bash文件中做如下操作。

    使用超时设定确保AWS API命令完成

    Amazon EC2命令行工具有默认的连接超时。在CloudStack中使用时,某些命令可能需要更长的超时。如果你发现命令在超时的时间内未完成,你可以指定用户定制超时。你可以将下面的可选命令行参数添加到任何支持CloudStack的EC2命令。

    指定连接超时(秒)

    1. --connection-timeout TIMEOUT

    指定请求超时(秒)

    例如:

    1. ec2-run-instances 2 z us-test1 n 1-3 --connection-timeout 120 --request-timeout 120

    注解

    CloudStack中的超时可选参数并非特定

    AWS API接口被使能后,CloudStack可支持下面的Amazon EC2命令。对于少数命令,CloudStack与Amazon EC2版本间有一些差异,差异已被标识。对于使用SOAP调用建立工具的用户,与之相关的命令也已给出。

    表 1.弹性IP API对应表

    表 2.可用Zone API对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-describe-availability-zonesDescribeAvailabilityZoneslistZones

    表 3.镜像API对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-create-imageCreateImagecreateTemplate
    ec2-deregisterDeregisterImageDeleteTemplate
    ec2-describe-imagesDescribeImageslistTemplates
    ec2-registerRegisterImageregisterTemplate

    表 4.镜像属性API对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-describe-instancesDescribeInstanceslistVirtualMachines
    ec2-run-instancesRunInstancesdeployVirtualMachine
    ec2-reboot-instancesRebootInstancesrebootVirtualMachine
    ec2-start-instancesStartInstancesstartVirtualMachine
    ec2-stop-instancesStopInstancesstopVirtualMachine
    ec2-terminate-instancesTerminateInstancesdestroyVirtualMachine

    表 6 实例属性对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-describe-instance-attributeDescribeInstanceAttributelistVirtualMachines

    表 7 密钥对应表

    表 8.密码API对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-get-passwordGetPasswordDatagetVMPassword

    表 9.安全组API对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-authorizeAuthorizeSecurityGroupIngressauthorizeSecurityGroupIngress
    ec2-add-groupCreateSecurityGroupcreateSecurityGroup
    ec2-delete-groupDeleteSecurityGroupdeleteSecurityGroup
    ec2-describe-groupDescribeSecurityGroupslistSecurityGroups
    ec2-revokeRevokeSecurityGroupIngressrevokeSecurityGroupIngress

    表 10.快照API对应表

    表 11.卷API对应表

    EC2命令

    SOAP调用

    CloudStack API调用

    ec2-attach-volumeAttachVolumeattachVolume
    ec2-create-volumeCreateVolumecreateVolume
    ec2-delete-volumeDeleteVolumedeleteVolume
    ec2-describe-volumeDescribeVolumelistVolumes
    ec2-detach-volumeDetachVolumedetachVolume

    示例

    有很多工具可以提供接入AWS兼容API。本节中将提供CloudStack用户一些使用用例。

    Boto示例

    Boto是其中一个。Python包可以在 https://github.com/boto/boto 获取。本节中提供两个使用Boto并已被CloudStack AWS API接口测试过的Python脚本示例。

    第一个是EC2示例,将访问和加密密钥改成你自己的,并更新端。

    示例1.EC2 Boto示例

    示例2.S3 Boto示例

    1. #!/usr/bin/env python
    2.  
    3. import sys
    4. import os
    5. from boto.s3.key import Key
    6. from boto.s3.connection import S3Connection
    7. from boto.s3.connection import OrdinaryCallingFormat
    8.  
    9. apikey='ChOw-pwdcCFy6fpeyv6kUaR0NnhzmG3tE7HLN2z3OB_s-ogF5HjZtN4rnzKnq2UjtnHeg_yLA5gOw'
    10. secretkey='IMY8R7CJQiSGFk4cHwfXXN3DUFXz07cCiU80eM3MCmfLs7kusgyOfm0g9qzXRXhoAPCH-IRxXc3w'
    11.  
    12. cf=OrdinaryCallingFormat()
    13.  
    14. def main():
    15. '''Establish connection to S3 service'''
    16. conn =S3Connection(aws_access_key_id=apikey,aws_secret_access_key=secretkey, \
    17. is_secure=False, \
    18. host='localhost', \
    19. port=7080, \
    20. calling_format=cf, \
    21. path="/awsapi/rest/AmazonS3")
    22.  
    23. try:
    24. bucket=conn.create_bucket('cloudstack')
    25. k.key = 'test'
    26. try:
    27. k.set_contents_from_filename('/Users/runseb/Desktop/s3cs.py')
    28. except:
    29. print 'could not write file'
    30. pass
    31. except:
    32. bucket = conn.get_bucket('cloudstack')
    33. k = Key(bucket)
    34. k.key = 'test'
    35. try:
    36. k.get_contents_to_filename('/Users/runseb/Desktop/foobar')
    37. except:
    38. print 'Could not get file'
    39. pass
    40.  
    41. try:
    42. bucket1=conn.create_bucket('teststring')
    43. k=Key(bucket1)
    44. k.key('foobar')
    45. k.set_contents_from_string('This is my silly test')
    46. except:
    47. bucket1=conn.get_bucket('teststring')
    48. k = Key(bucket1)
    49. k.key='foobar'
    50. k.get_contents_as_string()
    51.  
    52. if __name__ == '__main__':