본 포스팅은 IBM Cloud API를 사용하는 방법에 대한 연재글로 다음의 순서로 진행합니다.

IBM Cloud API를 이용하여 IBM Cloud 에서 생성된 리소스 정보 연계하기

이전 글에서 생성한 토큰 정보를 이용하여 내 계정으로 생성한 리소스 정보를 가져오는 프로그램을 작성 하겠습니다. 가져온 리소스 정보는 json 파일로 특정 디렉토리에 저장합니다. 이 과정을 진행하기 위해서는 이전 글의 ‘엑세스 토큰 생성하는 과정’을 성공적으로 완료 하여야 합니다.

Prerequisites

  • 이전 과정 완료 (엑세스 토큰 생성하기)

Estimated time

  • 약 10분 정도

Steps

  1. 공통 모듈 추가하기
  2. 리소스 가져오는 모듈 작성하기
  3. 모듈 실행 코드 작성하기
  4. 결과 확인하기

1. 공통 모듈 추가하기

  • 리소스 정보를 특정 디렉토리에 생성하고 그 안에 json파일로 저장할 계획입니다. 디렉토리를 생성하기 위해 os 모듈을 이용 합니다. os는 Operating System의 약자로 운영체제에서 사용하는 여러가지 기능을 이용할 수 있도록 python에서 제공하는 기본 모듈입니다. 프로그램 맨 상단에 아래의 코드를 추가 합니다.
import os
  • 디렉토리를 생성하고 json파일을 만드는 python 함수(comm_write_json_file)를 작성 합니다. 입력 매개변수로 파일명(file_name)과 파일에 기록할 컨텐츠(contents)를 변수로 정의 합니다. 디렉토리를 생성할 때 이미 존재하는 디렉토리가 있는지 확인 해야 합니다. 존재하지 않으면 신규 디렉토리를 생성하고 이미 디렉토리가 생성된 경우에는 다음 작업을 진행 합니다. 디렉토리 생성 로직은 EAFP(Easier to ask for forgiveness than permission)방식을 사용하도록 하겠습니다.
  • 생성된 디렉토리 안에 json파일로 기록하는 로직을 작성 합니다. Json 모듈을 이용하면 단 몇 줄의 코드로 파일을 생성할 수 있습니다.
def comm_write_json_file(file_name, contents):
    # 디렉토리 생성
    dir_name = 'json_file'
    try:
        os.makedirs('json_file')
        print("{0} directory created".format(dir_name))
    except FileExistsError:
        print("{0} directory already exists".format(dir_name))
    
    # 파일 생성
    file_name = './json_file/'+file_name
    with open(file_name, 'w') as outfile:
        json.dump(contents, outfile)
        print("{0} file created".format(file_name))

2. 리소스 가져오는 모듈 작성하기

본 연재의 하이라이트인 리소스 정보를 가져오는 함수(get_resource_list_all)를 작성 하도록 하겠습니다. 사용할 API는 IBM Cloud Resource Controller API입니다.
IBM Cloud Resources API

  • 제일 먼저 변수를 정의합니다. API 엔드포인트(base_url_resources) 와 상세 서비스 주소(path) 입니다.
 def get_resource_list_all():
   # 변수 정의하기
    base_url_resources = 'https://resource-controller.cloud.ibm.com/v2'
    path = '/resource_instances'  # 리소스 정보를 제공하는 상세 서비스
  • 이전 과정에서 생성한 함수(get_ibm_token)를 호출하여 토큰을 가져오는 코드를 작성합니다. 호출 결과 전달 받는 객체는 json객체로 다음과 같은 구조를 갖습니다.
{
    "access_token": "eyJraWQiOi ... daae",
    "refresh_token": "KDeVP3He ... NSd",
    "token_type": "Bearer",
    "expires_in": 3600,
    "expiration": 1589945033,
    "scope": "ibm openid"
}

  • 응답받은 json객체의 전문내용은 access_token, refresh_token, token_type, expires_in, expiration, scop 총 5개의 항목으로 구성되어 있습니다. 여기서 access_token정보를 읽어서 ibm_token 변수에 저장 합니다.
  • 다음에는 헤더를 정의합니다. 토큰 타입이 bearer 방식입니다. Authorization에 Bearer값으로 읽은 엑세스 토큰 정보(access_token)를 할당 합니다. 이때, content-type은 ‘application/x-www-form-urlencoded’로 정의해야 합니다.
    # 토큰 생성하기
    ibm_token = get_ibm_token()
    access_token = ibm_token['access_token']
    # 헤더 정의하기
    headers = {'Content-Type': 'application/x-www-form-urlencoded',
               'Accept': 'application/json', 'Authorization': 'Bearer {0}'.format(access_token)
               }

  • 공통 메소드를 호출 합니다. 인자 값으로 엔드포인트 주소, 상세 서비스 정보, 그리고 헤더 정보를 사용합니다. 사용하지 않는 정보는 공백 또는 빈 객체로 값을 전달 합니다.
  • 호출 결과를 처리합니다. 응답 받은 코드가 200인 경우 json 객체로 변환하여 결과 값을 반환 합니다. json.load 함수를 사용합니다. 함수에 인코딩을 ‘UTF-8’로 선언해 주어야 한글이 정상적으로 파싱됩니다. 그 외의 경우는 정상적인 작업이 수행되지 않은 경우로 에러 로그를 기록 합니다. 이때, 반환객체는 ‘None’ 타입으로 선언해 줍니다.
    # 공통 메소드 호출하기
    result = comm_call_api(base_url_resources, path, '', 'GET',
                           headers, data={})
    # 결과 처리하기
    if result.status_code == 200:
        return json.loads(result.content.decode('UTF-8'))
    else:
        print('[?] Unexpected Error: [HTTP {0}]: Content: {1}'.format(
            result.status_code, result.content))
        return None

3. 모듈 실행 코드 작성하기

  • 프로그램이 실행되면 함수를 호출할 실행 코드를 작성합니다. 리소스 정보를 가져와서 그 결과를 파일로 기록하는 순서로 진행 합니다. 맨 먼저 리소스 정보를 가져와 그 결과를 변수(re_contents)에 저장 합니다. 파일을 생성하는 공통 모듈에 파일명과 전달 받은 리소스 컨텐츠 객체를 전달 합니다.
re_contents = get_resource_list_all()
comm_write_json_file('get_resources_list.json',re_contents)
  • 최종으로 완성된 프로그램 구조는 다음과 같습니다.
import requests
import json
import os

def comm_call_api(url_base, path, query, method, headers, data):
  … 
def comm_write_json_file(file_name, contents):
  …
def get_ibm_token():
  …
def get_resource_list_all():   
  …

# 함수 호출
re_contents = get_resource_list_all()
comm_write_json_file('get_resources_list.json',re_contents)

4. 결과 확인하기

  • 터미널 또는 윈도우 커맨드 창을 열고 작성한 python 프로그램을 실행해 보도록 하겠습니다. 에러 없이 프로그램이 수행되면 디렉토리 생성 로깅 정보와 파일 생성 로깅 정보가 콘솔 창에 출력 됩니다. 에러가 발생하면 에러 메시지를 확인 하면서 코드를 수정 합니다.
$>python3 get_ibm_resources.py 
HTTP url_base: https://iam.cloud.ibm.com
HTTP path: /identity/token
HTTP query: 
HTTP method: POST
access_token: eyJraWQiOiIyMDIwMDQyNTE4MjkiLCJhbGciOiJSUzI1NiJ9.eyJpYW1faWQiOiJJQk1pZC01NTAwMDNGUlBFIiwiaWQiOiJJQk1pZC01NTA ….
json_file directory created
./json_file/get_resources_list.json file created
  • 디렉토리와 파일이 생성 되었습니다. 작업 디렉토리 하위에 json_file 디렉토리가 생성 되었고 내부에는 get_resources_list.json 파일이 신규로 생성 되었습니다.
    디렉토리 구조
  • 신규로 생성된 json 파일(get_resources_list.json)을 열어보면 IBM Public Cloud에서 이용중인 전체 리소스 정보를 확인할 수 있습니다.
{
    "rows_count": 11,
    "next_url": null,
    "resources": [
        {
            "id": "crn:v1:bluemix:public:container-registry:us-south:a/1::",
            "guid": "crn:v1:bluemix:public:container-registry:us-south:a/91::",
… 생략

Summary

지금까지 IBM Public Cloud에 생성된 리소스 정보를 연계하는 방법을 3개의 과정으로 소개 하였습니다. 첫번째는 IBM API Key를 발급 받는 방법이고, 두번째는 이 Key를 이용하여 토큰을 생성 하는 방법 이었습니다. 마지막으로 생성된 토큰을 이용하여 IBM Public Cloud에서 생성된 리소스 정보를 연계 하였습니다.
더 많은 서비스 정보에 대해 알기를 원하실 경우에는, IBM Cloud API 서비스에서 제공하는 API 목록인 API&SDK 참조 라이브러리 페이지를 참조 하시면 됩니다.