Cloudstack API

변재한·2023년 4월 22일
0
post-thumbnail

Cloudstack API 실습

Openstack의 API를 사용할 때는 공식문서에 잘 정리되어 있어서, 나름 접근성이 높았다. 반면에, Cloudstack에서 API를 사용하기 위한 공식문서가 Openstack에 비해 관련 문서가 주관적으로 잘 안되어 있어 관련해서 실습한 내용을 적어보았다.

Cloudstack API Ref

Cloudstack API Prerequisite

Cloudstack API 사용을 시작하려면 다음과 같은 항목이 필요하다.

  1. Cloudstack Server Url
  2. 계정의 API Key와 Secret Key
    1. 해당 키의 위치는 Users - admin 아래에 위치

Cloudstack API 예시

1. http://192.168.0.3: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. 명령을 수행하기 위한 Parameter
  3. 계정을 식별하게 하는 사용자 API Key(위 사진의 API Key)
  4. API 명령을 실행하는 사용자 계정을 인증하기 위해 생성된 서명해시(signature)

서명해시

API 요청을 인증받고 수행하기 위해서는 앞서 봤던 사용자의 SecretKey를 HMAC SHA-1 해싱 알고리즘을 이용하여 만든 서명해시 signature 를 생성하여야 한다.

Python으로 signature 생성하고 listusers 요청

import urllib.parse
import hmac
import hashlib
import base64
import requests as re
import json

baseurl = "http://192.168.0.3:8080/client/api?"

def make_request(requests, secretKey):
  # (a, b) 형식으로 a 기준 정렬
  request = sorted(zip(requests.keys(), requests.values()),key=lambda x: str.lower(x[0]))
  # URL에 사용 가능한 문자열로 반환
  requestUrl = "&".join(["=".join([r[0], urllib.parse.quote(str(r[1]))]) for r in request])
  hashStr = "&".join(["=".join([str.lower(r[0]), str.lower(urllib.parse.quote(str(r[1]))).replace("+","%20")]) for r in request])
  secretKey = bytes(secretKey, 'utf-8')
  sig = urllib.parse.quote(base64.encodebytes(hmac.new(secretKey, hashStr.encode('utf-8'), hashlib.sha1).digest()).strip())
  requestUrl =  baseurl + requestUrl + "&signature=" + sig
  response = re.get(requestUrl)

if __name__ == '__main__':
  requests = {
    "apiKey": "yevaOA_CNLzd8hJvTsPrkevX7opkpk6pdX0DtoKgqidyXopSC5P5ib4iti0vVZSL1JajzKTmOnOawMuy3uz85w",
    "response" : "json",
    "command" : "listUsers"
  }
  secretKey = "0Ie2os9WuVAFXtjmNvTV_ugX8OEeyGVW1aLK18Smp-FVIr65c-i21Ssb4ZTB9tYRTnVnJBmhLNemU5Ox9jgeaQ"
  make_request(requests, secretKey)

만들어진 url

1. http://192.168.0.3:8080/client/api
2. ?apiKey=yevaOA_CNLzd8hJvTsPrkevX7opkpk6pdX0DtoKgqidyXopSC5P5ib4iti0vVZSL1JajzKTmOnOawMuy3uz85w
3. &command=listUsers
4. &response=json
5. &signature=XrBUx0z/librIW79fiPGlUbG/9k%3D`
  1. Cloudstack API URL
  2. User 목록 조회(parameter가 없는 명령)
  3. 계정을 식별하게 하는 사용자 API Key
  4. Response 포맷을 json으로
  5. API 명령을 실행하는 사용자 계정을 인증하기 위해 생성된 서명해시(signature)

결과

{
  "listusersresponse": {
    "count": 1,
    "user": [
      {
        "id": "2dff1745-b26b-11ed-839b-080027be30c0",
        "username": "admin",
        "firstname": "admin",
        "lastname": "cloud",
        "created": "2023-02-21T18:41:32-0500",
        "state": "enabled",
        "account": "admin",
        "accounttype": 1,
        "usersource": "native",
        "roleid": "27e6b70a-b26b-11ed-839b-080027be30c0",
        "roletype": "Admin",
        "rolename": "Root Admin",
        "domainid": "15c13fc3-b26b-11ed-839b-080027be30c0",
        "domain": "ROOT",
        "apikey": "yevaOA_CNLzd8hJvTsPrkevX7opkpk6pdX0DtoKgqidyXopSC5P5ib4iti0vVZSL1JajzKTmOnOawMuy3uz85w",
        "accountid": "2dfe2ab5-b26b-11ed-839b-080027be30c0",
        "iscallerchilddomain": false,
        "isdefault": true
      }
    ]
  }
}

profile
Infra and Devops 엔지니어가 되고 싶어용

0개의 댓글