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

IBM Cloud API용 엑세스 토큰 생성하기

이 글에서는 이전 글에서 설명 드렸던 IBM Cloud에서 제공하는 API Key를 활용하여 토큰을 생성하는 방법에 대해 소개 드리겠습니다. 토큰은 서비스들 간에 인증/인가를 위하여 사용합니다. 토큰이 없는 경우 보안을 요청하는 일부 서비스를 이용할 수 없습니다. IBM Cloud API는 대부분 이러한 토큰 또는 인증 키를 요구하고 있습니다.

Prerequisites

  • IBM Cloud 계정이 있어야 함
  • JWT에 대한 이해
  • python3이 로컬 PC에 설치 되어야 함
  • python3에 대해 기초적인 지식이 있어야 함
  • VSCode 또는 Eclipse와 같은 개발 툴이 설치 되어야 함

Estimated time

  • 약 10분 정도

Steps

  1. 주요 컴포넌트 import 하기
  2. 공통 모듈 작성하기
  3. 인증 토큰을 생성하는 모듈 작성하기
  4. 모듈 실행 코드 추가하기
  5. 결과 확인하기

1. 주요 컴포넌트 import 하기

  • 토큰을 생성하기 위해 사용할 python 모듈은 request 와 json 2개 입니다. Requests는 API를 요청하기 위해 필요한 모듈입니다. json객체는 응답 받은 데이터를 json 객체로 변환하기 위해 사용합니다.
    제일 먼저 해야할 일은 작업 디렉토리를 생성하고 그 디렉토리에 python 파일을 생성하는 작업 입니다. python 파일의 확장자는 ‘~.py’ 로 명명 합니다. 생성된 파일을 열고 맨 상단에 두 객체를 import 합니다.
import requests
import json

Tip) 일반 텍스트 편집기로도 프로그래밍이 가능 합니다. 그러나 문법, 텍스트 하이라이트, 문법 자동완성 등 막강한 기능을 제공하는 개발툴(이클립스, VSCode 등)을 사용하는 것을 추천 드립니다.

2. 공통 모듈 작성하기

  • Python에서 requests 모듈을 이용하여 API 를 호출하는 방법은 간단 합니다.
requests.get('http://cloud.ibm.com')
  • 매우 간단해서 API를 호출하는 모듈에서 바로 사용할 수 있겠지만 공통 모듈로 작성하면 로깅 등 향후 프로그램이 확장될 때 많은 장점이 있습니다. 본 예제에는 Get 과 Post 메소드가 사용 됩니다. 또한 header 와 post 에서 사용할 data가 필요한데 이를 고려하여 공통 모듈을 만들겠습니다.
  • 공통 모듈(comm_call_api) 파라미터 정보는 API 엔드포인트 정보(url_base), API 상세 주소(path), 쿼리 스트링(query), http메소드(method), http 헤더 정보(hearders), 그리고 post 전송 시 사용할 data입니다.
  • 제일 먼저 값을 잘 전달 받았는지 확인하기 위해 매개변수를 콘솔로 출력 합니다. 다음에는 API 엔드포인트 정보와 서비스의 상세 주소, 그리고 사용되는 쿼리 스트링을 조합하여 하나의 url 호출 정보를 구성합니다. Get, Post메소드에 따라 전달할 매개변수가 다르기 때문에 분기 처리를 합니다. 마지막으로 처리 결과를 호출한 곳으로 리턴 합니다.
# 공통 모듈
def comm_call_api(url_base, path, query, method, headers, data):  
    # 로깅 하기
    print('HTTP url_base: {0}'.format(url_base))
    print('HTTP path: {0}'.format(path))
    print('HTTP query: {0}'.format(query))
    print('HTTP method: {0}'.format(method))
  
    # url에 정보 구성하기 : 기본 주소 + 하위 주소 정보 + 쿼리 스트링
    url = url_base + path + '?' + query
     
    # 메소드에 따른 분기 처리
    if method == 'GET':
        return requests.get(url, headers=headers)
    else:
        return requests.post(url, headers=headers, data=data)

3. 인증 토큰을 생성하는 모듈 작성하기

  • 인증 토큰을 생성하는 모듈(get_ibm_token)을 작성 하겠습니다. 토큰 생성을 위해 사용할 API는 IAM Identify Service API 입니다.
    IAM Indentify Service API
  • 제일 먼저 모듈 내에서 사용할 변수를 정의 합니다. 발급받은 IBM API KEY를 변수(apikey_ibm_cloud)에 할당 합니다. 사용할 엔드포인트 주소(base_url_iam)도 정의 합니다. 마지막으로 토큰 생성을 제공(path)하는 상세 주소를 정의 합니다.
# IBM API token 정보 얻기
def get_ibm_token():
    # 변수 정의
    apikey_ibm_cloud = '발급받은 API KEY 정보'  # IBM Cloud API KEY
    base_url_iam = 'https://iam.cloud.ibm.com' # 토큰값을 생성하기 위해 사용할 IBM 엔드포인트 주소
    path = '/identity/token' # 토큰 생성을 제공하는 상세 서비스 정보


Tip) 실제 서비스 개발 시에는, API KEY는 시스템 환경 변수로 등록하여 개발, 운영 환경에 따라 다르게 동작 하도록 합니다. 위 코드에서 키 정보를 환경 변수에서 읽어오는 코드로 변경하면 됩니다.

  • 인증서비스를 이용하기 위한 헤더 정보 데이터를 정의 합니다. 헤더에는 Content-Type과 Accept 값을 정의 합니다. 헤더 값은 제공하는 서비스에 따라 다를 수 있습니다. 토큰 값을 생성하기 위해서는 아래에 제시한 값을 사용해야 합니다. 제공하는 서비스는 Post 메소드를 이용합니다.
  • 여기에 사용할 파라미터(data)를 정의 합니다. apikey와 grant_type 입니다. Apikey는 발급받은 API Key값을 사용 합니다. Grant_type 은 고정된 값으로 ‘urn:ibm:params:oauth:grant-type:apikey’를 사용 합니다.
    # headers 값 정의
    headers = {'Content-Type': 'application/x-www-form-urlencoded',
                         'Accept': 'application/json'
                         }
    
    # data 값 정의
    data = "apikey=" + apikey_ibm_cloud + \
        "&grant_type=urn:ibm:params:oauth:grant-type:apikey"

  • 공통 메소드를 호출 합니다. 사용하지 않는 경우 빈 값을 가진 변수로 전달 합니다. 메소드는 POST를 사용 합니다.
    # 공통 메소드 호출
    result = comm_call_api(base_url_iam, path, '', 'POST',
                 headers, data)
  • 응답 받은 결과를 처리 합니다. 결과값이 200인 경우는 호출한 서비스에 대해 정상적인 처리를 진행한 경우 입니다. 처리 결과를 확인하기 위해 응답 전문에서 컨텐츠를 확인 합니다. 이때 json 모듈을 사용하여 컨텐츠를 json 타입으로 변경 합니다. 변경된 객체에서 access_token을 출력하여 확인 합니다. 이 값은 향후 API 서비스 이용 시 사용할 엑세스 토큰 값입니다. 실패한 경우는 에러 메시지를 출력하도록 합니다.
    # 처리 결과 
    if result.status_code == 200:
        json_token = json.loads(result.content.decode('UTF-8'))

        token_ibm_cloud = json_token['access_token']
        print('json_token: {0}'.format(token_ibm_cloud))
        return json_token
    else:
        print('[?] Unexpected Error: [HTTP {0}]: Content: {1}'.format(
            result.status_code, result.content))
        return None

4. 모듈 실행 코드 추가하기

  • python은 인터프리터 언어이므로 프로그램 호출 시 제일먼저 실행되는 main() 함수 개념이 없습니다. python 코드를 한 줄씩 읽어서 실행합니다. 따라서 작성한 함수를 호출하기 위해 프로그램 맨 아래에 get_ibm_token() 코드 한 줄을 추가 합니다. 프로그램 실행 시 get_ibm_token() 코드를 만나면 토큰을 생성하는 함수를 호출하게 됩니다.
# 함수 호출
get_ibm_token()

  • 지금까지 작성한 python 프로그램 전체 구조 입니다.
import requests
import json

def comm_call_api(url_base, path, query, method, headers, data):
… 
def get_ibm_token():
  …

# 함수 호출
get_ibm_token()

5. 결과 확인하기

  • 터미널 또는 윈도우 커맨드 창을 열고 작성한 python 프로그램을 실행해 보도록 하겠습니다. 명령 프롬프트에서 Python3 + python 파일명 입력하면 작성한 프로그램이 실행 됩니다. 본 예제에서 사용한 파일명은 ‘get_ibm_resources.py’ 입니다. 명령을 타이핑한 후 엔터 값을 입력하면 프로그램 실행하면 콘솔 창에 로그가 출력 됩니다. 콘솔 출력 창에 access_token값이 아래 예와 같이 출력되면 성공입니다.
$>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 ….

Summary and Next Step

지금까지 python3 프로그램을 이용하여 IBM 엑세스 토큰을 생성하는 코드를 작성 하였습니다. 예제 프로그램의 구조는 맨 위에서부터 차례로 사용할 모듈을 import, 공통 API Call 함수, 토큰 생성 함수, 그리고 호출하는 명령 순으로 작성 하였습니다.
다음에는 이 값을 이용하여 IBM에서 제공하는 리소스 API를 이용하여 IBM Public Cloud에서 생성한 전체 리소스 목록을 가져오는 모듈을 작성 하도록 하겠습니다.