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雲端平台互動。