CloudStack API 在雲端管理中扮演著至關重要的角色,它提供了一種程式化的方式與雲端資源互動。對於熟悉圖形介面的使用者來說,API 看似複雜,但實際上它提供了更高的彈性與效率。透過 API,繁瑣的資源組態、監控任務可以自動化,還能整合其他系統,開發更完善的雲端生態。CloudStack API 本身並非標準的 OGF OCCI 或 DMTF CIMI,但它與 AWS API 存在對映關係,易於上手。它主要透過 HTTP GET 請求與雲端端點互動,透過 command
引數指定 API 名稱,並以鍵值對傳遞其他引數。每個請求都需要使用 API 金鑰進行簽名,確保安全性。部分 API 呼叫是非同步的,會傳回 jobid
,方便追蹤任務狀態。
要使用 CloudStack API,首先需要取得 API 金鑰,包含存取金鑰和私密金鑰。可以透過 CloudStack 儀錶板或雲端供應商取得。取得金鑰後,便可開始建構 API 請求。以 Python 為例,需要使用 urllib2
、urllib
、hashlib
、hmac
和 base64
等模組。首先,定義 CloudStack 端點、API 命令、回應格式和金鑰。接著,將請求引陣列合成字串,並使用 HMAC-SHA1 演算法和私密金鑰進行簽名,最後將簽名附加到請求 URL 中。實際應用中,可以使用 CloudMonkey 這個互動式 Shell 工具,簡化 API 操作。CloudMonkey 提供了完整的 API 覆寫率,並且支援自動完成、歷史記錄和說明功能,方便探索和使用 API。安裝 CloudMonkey 後,需要設定 API 金鑰和雲端端點,可以透過 set
命令或編輯設定檔完成。
雲端互動的鑰匙:解鎖 CloudStack API 的無限可能
在雲端運算的領域中,API(應用程式介面)就像一把鑰匙,讓我們能夠以程式化的方式與雲端服務互動。CloudStack 作為一個成熟的開源雲端管理平台,其 API 的重要性不言而喻。本文中,身為玄貓(BlackCat)的我將帶領大家深入探索 CloudStack API,從基礎概念到實際應用,讓你也能輕鬆駕馭雲端資源。
為何要了解 CloudStack API?玄貓的經驗分享
在過去參與多個雲端專案的經驗中,玄貓(BlackCat)我發現,直接操作 API 往往比使用圖形介面更具彈性與效率。透過 API,我們可以:
- 自動化佈署與管理: 將重複性的雲端資源組態、監控等任務自動化,大幅提升效率。
- 整合多個系統: 將 CloudStack 與其他內部系統(如監控系統、計費系統)整合,開發更完善的雲端生態。
- 客製化雲端服務: 根據自身需求,開發客製化的雲端服務或工具,滿足特定業務場景。
CloudStack API 的運作原理:玄貓的深入剖析
CloudStack API 並非標準的 OGF OCCI 或 DMTF CIMI,但它相當容易上手。它與 AWS API 之間存在對映,這點我們將在後面的章節中探討。近年來,甚至出現了 Google Compute Engine 介面,將 GCE REST API 對映到此處描述的 CloudStack API。
CloudStack API 主要透過 HTTP GET 請求來呼叫,目標是你的雲端端點(例如 http://localhost:8080/client/api
)。API 的名稱透過 command
引數傳遞,而其他引數則以鍵/值對的形式傳遞。每個請求都需要使用使用者的金鑰進行簽名。
有些 API 呼叫是同步的,有些則是非同步的。對於非同步呼叫,API 會回傳一個 jobid
,你可以使用 queryAsyncJobResult
呼叫來查詢任務的狀態和結果。
取得你的 API 金鑰:玄貓的實戰
要開始使用 CloudStack API,首先需要一組 API 金鑰。每個雲端服務都有類別似的概念,允許你簽署 API 請求。你有兩把金鑰:一個存取金鑰(access key)和一個私密金鑰(secret key)。
在 CloudStack 中,你可以從預設的儀錶板中的「帳戶和使用者」面板產生金鑰。如果你使用的是根據 CloudStack 的公有雲,他們可能會在註冊時或透過他們自己的儀錶板給你金鑰。取得 API 金鑰的步驟如下:
- 登入 CloudStack 儀錶板。
- 前往「帳戶」>「使用者」。
- 選擇你的帳戶,然後點選「顯示使用者」。
- 選擇目標使用者,然後點選「產生金鑰」圖示。
- 你會看到產生的 API 金鑰和私密金鑰。
取得 API 金鑰對於使用本文中描述的任何工具都至關重要。有一個 API 呼叫 registerUserKeys
可以用來以程式化的方式取得金鑰。但是,這個呼叫只允許在不安全的整合埠上使用,並且只允許雲端的管理員使用。
簽署 API 請求:玄貓的程式碼範例
有了 API 金鑰後,就可以建立並簽署 API 請求了。以下是一個使用 Python 簽署 CloudStack API 請求的範例:
import urllib2
import urllib
import hashlib
import hmac
import base64
# 定義 CloudStack 端點、API 命令、回應格式和金鑰
baseurl = 'http://localhost:8080/client/api?'
request = {}
request['command'] = 'listUsers'
request['response'] = 'json'
request['apikey'] = 'plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg'
secretkey = 'VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX_FcHRj87ZKiy0z0ty0ZsYBkoXkY9b7EhwJaw7FF3akA3KBQ'
# 建立請求字串
request_str = '&'.join(['='.join([k, urllib.quote_plus(request[k])]) for k in request.keys()])
# 使用 HMAC 簽署請求
hash_str = hmac.new(secretkey, request_str, hashlib.sha1).digest()
sig_str = base64.b64encode(hash_str)
sig_str = urllib.quote_plus(sig_str)
# 建立完整的 API 請求 URL
url = baseurl + request_str + '&signature=' + sig_str
# 傳送 API 請求
try:
response = urllib2.urlopen(url).read()
print response
except urllib2.URLError, e:
print e.code
內容解密
引入必要的 Python 模組:
urllib2
和urllib
用於傳送 HTTP 請求和 URL 編碼。hashlib
提供 SHA1 雜湊函式。hmac
用於產生 HMAC(Keyed-Hashing for Message Authentication)。base64
用於 Base64 編碼。
定義 API 請求的引數:
baseurl
: CloudStack API 的端點 URL。request
: 包含 API 命令、回應格式和 API 金鑰的字典。secretkey
: 你的私密金鑰,用於簽署請求。
建立請求字串:
- 使用 Python 的
join
函式和字典的keys()
方法,將請求引陣列合成一個字串。 - 使用
urllib.quote_plus()
對每個值進行 URL 編碼。 - 使用
&
將所有鍵/值對連線起來。
- 使用 Python 的
使用 HMAC 簽署請求:
- 使用
hmac.new()
函式,以私密金鑰和請求字串為輸入,產生一個 SHA1 HMAC。 - 使用
base64.b64encode()
將 HMAC 編碼為 Base64 字串。 - 使用
urllib.quote_plus()
對簽名字串進行 URL 編碼。
- 使用
建立完整的 API 請求 URL:
- 將
baseurl
、request_str
和簽名字串連線起來,建立完整的 URL。
- 將
傳送 API 請求:
- 使用
urllib2.urlopen()
傳送 HTTP GET 請求到 API 端點。 - 讀取回應並列印出來。
- 處理可能發生的
urllib2.URLError
異常。
- 使用
### 簽名運算:保障API請求的安全
在完成API請求的建構後,為了確保安全性,需要計算簽名。簽名是根據使用SHA1雜湊函式對帶有`secretkey`的簽名字串進行HMAC運算而產生的。最終的HMAC結果會經過Base64編碼和URL編碼。
簽名字串與先前的基本請求字串相似,但鍵/值需轉換為小寫,並以排序後的順序連線。此外,加號(+)會被替換為`%20`。以下是如何在Python中實作的範例:
```python
import urllib
import hmac
import hashlib
import base64
from collections import OrderedDict
secretkey = "VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX_FcHRj87ZKiy0z0ty0ZshwJaw7FF3akA3KBQ"
request = OrderedDict()
request['apikey'] = "plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg"
request['command'] = "listUsers"
request['response'] = "json"
sig_str='&'.join(['='.join([k.lower(),urllib.parse.quote_plus(request[k].lower().replace('+','%20'))])for k in sorted(request.keys())])
print(sig_str)
sig = base64.encodestring(hmac.new(secretkey.encode('utf-8'), sig_str.encode('utf-8'), hashlib.sha1).digest()).strip()
sig = urllib.parse.quote_plus(sig)
print(sig)
這段程式碼首先匯入必要的Python模組,如urllib
、hmac
、hashlib
和base64
。接著,定義了secretkey
和包含API金鑰、指令和回應格式的請求引數。然後,使用排序後的鍵和URL編碼的值來建構簽名字串。最後,使用secretkey
對簽名字串進行HMAC-SHA1雜湊運算,進行Base64編碼,並對結果進行URL編碼。
現在,透過連線baseurl
、請求字串和簽名來建構完整的API請求字串。可以使用HTTP GET來取得回應(某些API呼叫也支援HTTP POST)。在Python中,可以將所有內容相加並使用urllib.request.urlopen()
:
import urllib.request
baseurl = 'http://localhost:8080/client/api?'
request_str = '&'.join(['='.join([k, request[k]]) for k in request.keys()])
req = baseurl + request_str + '&signature=' + sig
print(req)
res = urllib.request.urlopen(req)
print(res.read().decode('utf-8'))
這段程式碼首先定義了API的基本URL,然後使用請求引數建立請求字串。接著,將基本URL、請求字串和簽名連線起來,形成完整的API請求。最後,使用urllib.request.urlopen()
傳送請求並讀取回應。
GitHub上的所有客戶端都會實作這種簽名技術,因此通常不需要手動操作。然而,熟悉API並理解如何以程式化的方式向雲端發出請求是一個很好的練習。
CloudMonkey:互動式CloudStack Shell
CloudMonkey是Apache CloudStack的一個子專案,讓操作員/開發人員可以使用任何API方法。從CloudStack 4.2開始,它具有良好的自動完成、歷史記錄和說明功能,以及API探索機制。
CloudMonkey既可以用作互動式Shell,也可以用作簡化CloudStack組態和管理的命令列工具。它可以與CloudStack 4.0及更高版本一起使用。
玄貓認為CloudMonkey非常棒,因為它提供了對CloudStack API的100%覆寫。但是,由於您是直接使用每個呼叫,因此可能會有些不知所措,並且某些命令可能會顯得有些冗長。
問題
您想要使用互動式Shell來組態、管理或使用您的CloudStack雲。您還在尋找一個具有100% API覆寫的CloudStack客戶端,您可以使用它來編寫Shell指令碼。
解決方案
從社群維護的套件發行版或使用Apache儲存函式庫從原始碼安裝CloudMonkey。
討論
CloudMonkey依賴於readline
、pygments
和prettytable
。從原始碼安裝時,您需要解決這些依賴關係。使用PyPI儲存函式庫,將自動安裝這些依賴關係。
有兩種方法可以取得CloudMonkey:透過官方CloudStack原始碼發行版或透過PyPI中社群維護的發行版。
使用者將希望使用PyPI上社群維護的套件,並使用單個命令安裝CloudMonkey:
$ sudo pip install cloudmonkey
想要檢視程式碼的開發人員應使用官方Apache CloudStack CloudMonkey Git儲存函式庫,複製儲存函式庫並安裝它:
$ git clone https://git-wip-us.apache.org/repos/asf/cloudstack-cloudmonkey.git
$ sudo python setup.py install
如果安裝成功,您應該可以透過在命令列中鍵入cloudmonkey
來開啟cloudmonkey_ interac‐tive
Shell。應顯示以下輸出:
$ cloudmonkey
☁ Apache CloudStack cloudmonkey 5.0.0. Type help or ? to list commands.
>
您可以使用CloudMonkey作為互動式Shell,但它可以用作直接的CLI,將命令傳遞給cloudmonkey
命令,如下所示:
$ cloudmonkey list users
因此,它可以用於Shell指令碼中,它可以透過stdin
接收命令,並且可以像任何其他Unix命令一樣透過grep
或awk
或您需要用來處理它的任何命令來解析其輸出。
CloudMonkey組態:設定API金鑰與雲端端點
問題
安裝CloudMonkey後,您想要使用您的API金鑰和您的雲端端點來組態它。
解決方案
啟動CloudMonkey互動式Shell,並使用set
命令來定義您的端點和您的金鑰。您也可以編輯~/.cloudmonkey/config
中的設定檔並直接輸入這些值。
討論
要從CloudMonkey提示符互動式地設定這些值,請使用set
命令。API金鑰和金鑰是透過CloudStack UI或透過您的雲端供應商獲得的。您可以使用CloudMonkey與本機雲甚至遠端公有雲互動。您只需要正確設定主機、連線埠、協定和金鑰。
例如,如果CloudStack在本機執行,請執行以下操作:
$ cloudmonkey
☁ Apache CloudStack cloudmonkey 4.1.0-snapshot. Type help or ? to list commands.
總結來說,本文介紹瞭如何透過簽名運算來保障API請求的安全性,並詳細說明瞭CloudMonkey這個互動式CloudStack Shell的安裝、組態與使用方式。CloudMonkey不僅提供100%的API覆寫,還能簡化CloudStack的組態與管理,讓開發者和管理員能更輕鬆地與CloudStack雲端平台互動。