본문 바로가기

오라클 클라우드

오라클 클라우드 Out of host capacity 오류, 그리고 스크립트로 뚫기

결론

1. 프리 티어로 줄만한 용량이 남아있지 않아서 생기는 오류이다.

2. 계속 자원이 추가되기에 기다리면 언젠가 해결되긴 하겠지만

3. 스크립트화해서 API 가지고 계속 시도가 가능하다

스크립트화해서 계속 시도하는 방법을 보고싶다면 밑으로

 

내용

솔직히 애초에 오라클에서 이렇게 하라고 API를 제공하지만 직접 찾아보려하니 상당히 안으로 들어가야 합니다.

바로 시작합시다.

 

이 글에서는 REST api를 파이썬으로 접근하는 방법을 사용하도록 하겠습니다.

 

  • 준비물 : oci 설치
python3 -m pip install oci

https://pypi.org/project/oci/

오라클에서 제공해주는 OCI의 파이썬 SDK입니다.

 

  • 준비물 : API key 받기

1

오라클 클라우드에 로그인하고 우측 상단 버튼을 눌러서 User Details로 들어갑니다.

2

하단의 API Keys 클릭 후 Add API Keys를 클릭합니다.

3

Private Key를 받아서 어디 잘 저장해놓고 Add 버튼을 누릅니다. 바로 끄지 마세요. 다음 단계에서 할게 하나 더 있습니다.

 

  • 준비물 : Configuration File 받기

1

View Configuration file을 클릭합니다.

2

Configuration File Preview 안의 내용을 모두 복사해 아까 API key를 저장한 폴더에 메모장 하나 열어서 붙여넣기하고,

마지막 줄에 key_file=<path to your private keyfile> # TODO 를 API key 경로로 바꿉니다.

 

  • 준비물 : 인스턴스 생성 시도로 Parameters 훔쳐(?)오기

OCI 웹에서 인스턴스 생성 시도를 하더라도 결국엔 API와 똑같은 형식의 Parameter를 사용합니다. 따라서 먼저 Shape 등의 틀은 웹으로 만들고 parameter만 훔쳐옵시다.

 

우선 새로운 컴퓨트 인스턴스를 만드는 페이지로 들어가서 원하는 옵션으로 구성한 후, 개발자 도구를 켭니다.

1

네트워크 란으로 들어간 후에 인스턴스 생성 창에서 Create를 눌러주세요.

 

여기서 생성이 된다면 더이상 이 글을 보실 필요가 없습니다. 축하드립니다.

생성이 안 되는 경우가 문제죠. 대충 몇 초 있다가 Out of capacity ... 하는 오류가 뜰 것입니다.

2

제일 위의 초록 동그라미에 instances를 치면 밑의 란에 instances/가 나옵니다.

우클릭 후 복사 > cURL (bash)로 복사 하시고 대충 아무 메모장에나 복사해주세요.

그리고 별도의 메모장에

curl 'https://iaas.(region).oraclecloud.com/20160918/instances/' <- 이 친구와

  -H ...

  -H ...

  -H ...

  ...

  -H ...

  --data-raw '{"metadata":{}, ...}' <- 이 친구를

  --compressed

복사해두세요.

첫번째가 API 엔드포인트고 두번째가 파라미터들입니다.

 

이렇게 하면 준비물은 끝납니다.

현재까지 API key, Configuration file, Endpoint, Parameters를 준비했습니다.


이제 파이썬 코딩으로 들어갑니다.

오라클 클라우드의 REST API를 사용하려면 endpoint, param, auth가 필요합니다.

 

수많은 API중 단 두개를 사용할건데,

하나는 인스턴스 나열 API,

나머지 하나는 인스턴스 생성 API입니다.

 

그리고 방식은 나열 API 호출 -> 생성되지 않았으면 인스턴스 생성 API 호출 로 합니다.

 

인스턴스 나열 API 사용법:

# 이 블럭은 인스턴스 나열 API를 사용하는 부분입니다.
import requests
from oci.config import from_file
from oci.signer import Signer

# configuration file 불러오기
config = from_file("<configuration_file_경로>", "DEFAULT")

# request의 auth 부분 생성
auth = Signer(
	tenancy=config['tenancy'],
    user=config['user'],
    fingerprint=config['fingerprint'],
    private_key_file_location=config['key_file']
)

# endpoint
endpoint = 'https://iaas.<region>.oraclecloud.com/20160918/instances/'

# body
body = {
	"compartmentId":"<나열하기를 원하는 compartment의 OCID>"
}

# request 보내기, 해당 API는 get method를 요구합니다.
response = requests.get(endpoint, params=body, auth=auth)

# 이후는 response를 원하는 방식으로 가공해서 사용하시면 됩니다.
print(response.text)

 

인스턴스 생성 API 사용법:

import requests
from oci.config import from_file
from oci.signer import Signer

# configuration file 불러오기
config = from_file("<configuration_file_경로>", "DEFAULT")

# request의 auth 부분 생성
auth = Signer(
	tenancy=config['tenancy'],
    user=config['user'],
    fingerprint=config['fingerprint'],
    private_key_file_location=config['key_file']
)

# endpoint
endpoint = 'https://iaas.<region>.oraclecloud.com/20160918/instances/'

# body
body = <훔쳐온 parameter(--data-raw 이후) 부분을 양 옆의 작은따옴표만 빼고 그대로 사용>

# request 보내기, 해당 API는 post method를 요구합니다.
response = requests.post(endpoint, json=body, auth=auth)

# 이후는 response를 원하는 방식으로 가공해서 사용하시면 됩니다.
# 인스턴스 생성에 성공하면 200을, 실패하면 다른 코드를 보내줍니다.
print(response.text)

 

보시다시피 그냥 주어진거 거의 그대로 쓰는거라 딱히 어려운 부분 없습니다.

저 두 코드를 예시로 적당히 가공해 나열해보고 없으면 생성하게 만들면 됩니다.

 

대충 만들어봤습니다. 작동하는지 안하는지도 모르겠지만 최소한으로 다듬어서 작동시킬 수 있을겁니다.

https://github.com/jaehwan1912/oci_instance_creation_script

 

GitHub - jaehwan1912/oci_instance_creation_script: Just a simple script to repeatedly try creating new oci instance

Just a simple script to repeatedly try creating new oci instance - GitHub - jaehwan1912/oci_instance_creation_script: Just a simple script to repeatedly try creating new oci instance

github.com


여담

이후는 뭐...

대충 집 컴퓨터 하나 켜놓거나 가지고 있는 다른 VM에 crontab 등록해서 매분 시도하시면 됩니다.

너무 자주하면 한도초과되는경우도 있을거같으니 너무 자주로 해놓지는 마세요.

저는 분당 1회로 저녁쯤에 시작해서 다음날 새벽에 생성됐습니다.

 

참고

OCI API reference : ListInstance

https://docs.oracle.com/en-us/iaas/api/#/en/iaas/20160918/Instance/ListInstances

OCI API reference : LaunchInstance

https://docs.oracle.com/en-us/iaas/api/#/en/iaas/20160918/Instance/LaunchInstance