角色

CloudStack API支持三种角色访问:

  1. 根域管理员
  2. 域管理员
  3. 普通用户

提交API请求

所有CloudStack API请求都是以HTTP GET/POST的形式提交,一个请求包含下面三部分:

  • API的URL地址:即web服务API的入口地址(如: http://www.example.com:8080/client/api)
  • 命令:你想要执行的web服务命令,如启动一个虚拟机
  • 参数:该命令所需要的必要或可选参数

一个API请求的例子如下:

http://localhost:8080/client/api?command=deployVirtualMachine&serviceOfferingId=1&diskOfferingId=1&templateId=2&zoneId=4&apiKey=miVr6X7u6bN_sdahOBpjNejPgEsT35eXq-jB8CG20YI3yaxXcgpyuaIRmFI_EJTVwZ0nUkkJbPmY3y2bciKwFQ&signature=Lxx1DM40AjcXU%2FcaiK8RAP0O1hU%3D

用可读性更强的表示方式如下:

1. http://localhost:8080/client/api
2. ?command=deployVirtualMachine
3. &serviceOfferingId=1
4. &diskOfferingId=1
5. &templateId=2
6. &zoneId=4
7. &apiKey=miVr6X7u6bN_sdahOBpjNejPgEsT35eXqjB8CG20YI3yaxXcgpyuaIRmFI_EJTVwZ0nUkkJbPmY3y2bciKwFQ
8. &signature=Lxx1DM40AjcXU%2FcaiK8RAP0O1hU%3D

第1行就是CloudStack API的URL;
第2行表示我们想要执行的命令;
第3-6行是该命令所需的参数,命令和参数的详情具体可以参考API文档;
第7行是唯一标识用户的账户的API Key;
第8行是用来认证用户账户执行API命令权限的签名的哈希值

API请求的签名

不管你是通过HTTP还是HTTPS的方式访问CloudStack API,都必须对请求进行签名从而让CloudStack能确认调用者已经被认证和授权执行该命令。在进行签名之前先确认你拥有API Key和管理员提供给你的账户的私钥。
以上面的API请求为例子,每个API请求都包含以下几个部分:

  • 基本的URL:http://localhost:8080
  • API的路径,处理请求的API Servlet的路径:/client/api?
  • 命令字符串:包括命令,命令的参数以及标志用户账户的API Key,需要注意的是,参数的键是不区分大小写的,而参数的值是区分大小写的
  • 签名:使用用户的私钥和HMAC SHA-1哈希算法生成的签名

生成签名的步骤:

  1. 命令字符串中的每个键值对(以&分隔开),URL对每个值进行编码从而使其能通过HTTP GET安全地发送
  2. 将命令字符串的字母全部转换成小写,并且对键值对按字母顺序进行排序,结果类似下面的形式:
    apikey=mivr6x7u6bn_sdahobpjnejpgest35exq-jb8cg20yi3yaxxcgpyuairmfi_ejtvwz0nukkjbpmy3y2bcikwfq&command=deployvirtualmachine&diskofferingid=1&serviceofferingid=1&templateid=2&zoneid=4
  3. 将排序好的命令字符串和用户的私钥使用HMAC SHA-1哈希算法进行编码,在使用Base64将结果字节数组编码成UTF-8形式,最终得到的签名为:Lxx1DM40AjcXU%2FcaiK8RAP0O1hU%3D

设置API调用失效时间

在不安全的通道如HTTP上,我们可以设置一个API调用逾期时间戳来防止重播攻击(replay attacks),服务器会追踪这个时间戳,并拒绝超过这个期限的后续的所有API调用。
在API请求中加入以下参数可实现这个特性:

  • signatureVersion=3
  • expires=YYYY-MM-DDThh:mm:ssZ

限制API调用频率

避免对管理服务器的恶意攻击,防止性能下降以及对所有账户提供一致性,当API调用超过一定阈值后会向这些调用返回错误信息。调用者需要等待一段时间后重试一下。可以通过一下全局参数来设置API的调用频率限制:

  1. api.throttling.enabled:默认为false,即不限制API调用频率
  2. api.throttling.interval :以秒为单位,
  3. api.throttling.max:每个间隔周期接受的最大请求数
  4. api.throttling.cachesize:存放API调用计数器的缓存,每个账户需要一个cache来存放该账户运行的API总数

API调用频率限制的不足之处:

  • 存在多个管理服务器的时候,不同管理服务器的cache之间不是同步的,所以可能出现允许通过的请求数比设置的值要大的情况,最糟糕的情况下可能出现允许通过的请求数为:限制值*管理服务器数量
  • 尽管如此,CloudStack还是可以有效地避免恶意攻击导致的服务拒绝

API响应

CloudStack支持两种响应格式:XML和JSON,默认的响应是XML,可以在请求URL中使用&response=json来设置JSON格式的响应。使用JSON格式时,如果一个响应的键没有值,则该键不会出现在响应中,而XML仍会返回一个空的元素。

最大返回结果页

对于每个云,一个命令在一个页面中返回的结果数有一个默认的上限,以此来防止云服务器过载和防止DOS攻击。
每个云的默认上限值是不同的,通过全局参数default.page.size来配置。如果云上有许多用户运行了许多虚拟机的话,可以把这个值设置大一点,但要小心不要设置得太大了。

错误处理

如果在处理一个API请求的时候发生了错误,会返回特定格式的响应。每个错误信息响应包含一个错误代码和一个文本描述可能出错的原因。
如果用户的签名错误或没有权限导致请求被拒绝会返回一个HTTP 401错误

异步命令

异步命令可以隐式地执行那些耗时很长的任务,如创建一个快照。它和同步命令有以下几点不同:

  • API引用以一个a来区分
  • 提交后会马上返回一个任务ID
  • 如果是创建资源的命令,在返回任务ID的同时还会返回资源ID

使用异步命令的关键在于Job ID,它在命令被执行后马上返回。使用Job ID,通过queryAsyncJobResult命令我们可以周期性地检查任务的状态,这个命令返回3种可能的任务状态。

  • 0-Job表示程序还在进行
  • 1-Job表示成功地完成了
  • 2-Job表示执行失败

查询命令执行状态的命令:command=queryAsyncJobResult&jobId=1

CloudStack API编程指南相关推荐

  1. Flink入门——DataSet Api编程指南

    简介: Flink入门--DataSet Api编程指南 Apache Flink 是一个兼顾高吞吐.低延迟.高性能的分布式处理框架.在实时计算崛起的今天,Flink正在飞速发展.由于性能的优势和兼顾 ...

  2. flink fi java_Flink DataStream API编程指南

    Flink中的DataStream程序是实现数据流转换的常规程序(例如:filtering, updating state, defining windows, aggregating).数据流最初是 ...

  3. 11 编程指南_流数据

    Flink 的流数据 API 编程指南 Flink 的流数据处理程序是常规的程序 ,通过再流数据上,实现了各种转换 (比如 过滤, 更新中间状态, 定义窗口, 聚合).流数据可以来之多种数据源 (比如 ...

  4. libuv 中文编程指南(零)前言

    最近看了一些有关 libuv 的东西,另外复习了一些与同步.异步.阻塞.非阻塞,异步IO(aio)的东西, 算是技术积累吧,等有时间了整理出一个完整的文档出来,希望在今后的编程中用到. 不多说了,本文 ...

  5. hive编程指南电子版_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  6. OpenMP: OpenMP编程指南

    from: OpenMP: OpenMP编程指南 进入多核时代后,必须使用多线程编写程序才能让各个CPU核得到利用.在单核时代,通常使用操作系统提供的API来创建线程,然而,在多核系统中,情况发生了很 ...

  7. windows 3.x编程指南_18000 MHz 可编程衰减器

    RC8DAT-8G-95 Mini-Circuits的RC8DAT-8G-95是一款八信道可编程衰减器,广泛应用于信号电平控制应用中,工作频率范围为1 MHz至8GHz.八路通道独立控制,衰减动态范围 ...

  8. Java 7 并发编程指南

    原文是发表在并发编程网上翻译后的 <Java 7 并发编程指南>,这里对其中的目录做个更加详细的描述,并且写出了重点说明,方便日后快速查阅.建议仔细查看每节的代码实现,非常具有参考价值.可 ...

  9. Spark编程指南(Python版)

    Spark编程指南 译者说在前面:最近在学习Spark相关的知识,在网上没有找到比较详细的中文教程,只找到了官网的教程.出于自己学习同时也造福其他初学者的目的,把这篇指南翻译成了中文,笔者水平有限,文 ...

最新文章

  1. 30 段极简 Python 代码:这些小技巧你都 Get 了么?
  2. SQL反模式笔记7——多列属性
  3. 深度长文 | 复旦大学肖仰华:领域知识图谱落地实践中的问题与对策
  4. php数组交集 效率,PHP数组交集的优化
  5. 代理模式coding-静态代理
  6. B端产品设计——批量导入
  7. python数据结构-如何统计序列中元素的频度
  8. 云原生游戏《云联物语》揭开神秘面纱 云鹭科技温向东带你深度了解云原生游戏领域...
  9. 计算机二级c语言编译题评分,计算机二级C语言题型和评分标准
  10. go c 语言,c语言与go语言的区别有哪些
  11. 跨站脚本攻击原理、攻击过程及防御方法简介
  12. CSF2020大作业
  13. microsoft store 微软应用商店打不开?所有教程都尝试了一遍,居然是因为这个
  14. 如何将Word转PDF?来看这几个方法
  15. hdu3987 Harry Potter and the Forbidden Forest 最小割边数
  16. mindmanager2018优化
  17. APP开发多少钱多少人和哪些注意事项
  18. Android 使用三种方式缓存加载 倒影图片
  19. vue中PC端使用高德地图 -- 实现搜索定位、地址标记、弹窗显示定位详情
  20. matlab实现降低图片的分辨率

热门文章

  1. python从入门到精通怎么样-《Python编程从入门到精通》
  2. 学完了python能做什么-学完Python能做什么
  3. pycharm和python区别-python与pycharm有何区别
  4. 硬盘、移动硬盘、内存卡(SD卡、TF卡)、U盘修复,格式化
  5. LeetCode Flatten Nested List Iterator
  6. UVa1450 Airport(二分法)
  7. LeetCode Valid Perfect Square(是否是平方数)
  8. LeetCode Merge k Sorted Lists(有序单链表数组的合并)
  9. HDU2094 产生冠军
  10. iOS开发-NSArray