인스턴스 관리를 위해 IBM Cloud Resource Controller API를 사용하세요
IBM Cloud® ( Resource Controller ) REST API를 사용하여 프로그래밍 방식으로 인스턴스를 조회, 생성 및 업데이트할 수 있습니다.
모든 Resource Controller 엔드포인트에서는 베어러 토큰이 포함된 Authorization 헤더를 전달하여 인증해야 합니다. REST API 설정 가이드를 참조하십시오.
인스턴스 생성하기
특정 인스턴스에 대한 정보를 가져오려면 해당 GET /v2/resource_instances/{crn} 엔드포인트를 사용하십시오. CRN 는 경로에서 URL -encoded 형식으로 지정되어야 합니다.
extensions표준 Resource Controller 필드 외에도, 응답에는 및 모두에 parameters 양자 관련 필드가 포함되어 있습니다. extensions 인스턴스의 정규화된 메타데이터를 저장하는 반면 parameters , 는 인스턴스를 수정하기 위한 가장 최근의 요청만 저장합니다. parameters따라서 에서 읽어야 하며, 에서 extensions 읽으면 안 됩니다.
이 extensions 객체에는 다음과 같은 필드가 포함되어 있습니다:
instance_limit_seconds— 정수, 또는null. 인스턴스의 사용 시간 제한. “인스턴스 할당 한도 설정”을 참조하십시오.usage_allocation_seconds— 정수, 또는null. 이 인스턴스에 할당된 시간으로, 페어-셰어 스케줄러가 큐 우선순위를 결정하는 데 사용됩니다. “인스턴스 할당 한도 설정”을 참조하십시오.backends— 문자열 배열. 이 인스턴스에서 사용할 수 있는 백엔드 이름의 허용 목록입니다.["ANY"]이는 해당 요금제에 포함된 모든 백엔드를 사용할 수 있음을 의미합니다(기본 설정).[]이는 사용 가능한 백엔드가 없다는 뜻입니다.
객체의 extensions 해당 backends 필드가 오래된 정보일 수 있습니다. IBM Quantum 지원팀이 인스턴스에 영향을 미치는 방식으로 귀하의 계정을 변경할 때 이러한 현상이 발생할 수 있습니다. 예를 들어, 계정에서 백엔드가 제거되면 해당 인스턴스에 대한 정보가 backends 업데이트되지만, 현재 그 변경 사항은 Resource Controller API에는 아직 반영되지 않았습니다.
대신, 현재로서는 IBM Quantum GET /v1/backends 엔드포인트를 사용하여 Compute Service REST API를 호출하는 것이 임시 해결책입니다. ( Service-CRN 헤더를 해당 인스턴스의 CRN 으로 설정했는지 확인하십시오.)
CRN 는 경로에서 URL -encoded 형식으로 지정되어야 합니다. %2F각 : 을 로 %3A , 각 / 을 로 바꾸십시오. crn%3Av1%3Abluemix%3A...예를 들어, crn:v1:bluemix:... 는 가 됩니다.
curl \
--request GET \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>'import urllib.parse
import requests
crn = "<YOUR_INSTANCE_CRN>"
# We use urllib.parse.quote to URL-encode the CRN.
url = (
"https://resource-controller.cloud.ibm.com/v2/resource_instances/"
+ urllib.parse.quote(crn, safe="")
)
resp = requests.get(
url,
headers={"Authorization": f"Bearer {token}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())모든 인스턴스 목록 가져오기
이 GET /v2/resource_instances 엔드포인트를 사용하여 모든 인스턴스 목록을 가져오세요. 쿼리 매개변수를 resource_id 로 b6049020-80f4-11eb-a0f7-e35ec9b4054f 설정하여 IBM Quantum® 인스턴스로 필터링하십시오.
계정에 여러 요금제가 있고 요금제별로 필터링하려면 쿼리 resource_plan_id 매개변수를 다음 값 중 하나로 설정하세요:
계획 | resource_plan_id |
|---|---|
| 프리미엄 | 7f666d17-7893-47d8-bf9d-2b2389fc4dfc |
| 플렉스 | 53bde9d3-cdbb-46f5-a98f-60ebcadf7260 |
| 종량과금제 | 5304b575-3cff-4455-90dc-ae4367762093 |
| 열기 | 850b21a7-71de-4e53-9441-1abdd202f35d |
각 결과에는 ‘인스턴스 가져오기’ 섹션에 설명된 것과 동일한 extensions 필드가 포함됩니다.
curl \
--request GET \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances?resource_id=b6049020-80f4-11eb-a0f7-e35ec9b4054f' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>'import requests
resp = requests.get(
"https://resource-controller.cloud.ibm.com/v2/resource_instances?resource_id=b6049020-80f4-11eb-a0f7-e35ec9b4054f",
headers={"Authorization": f"Bearer {token}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())인스턴스 업데이트
이 PATCH /v2/resource_instances/{crn} 엔드포인트를 사용하여 인스턴스의 제한, 할당량 및 허용된 백엔드를 업데이트하십시오. CRN 는 경로에서 URL -encoded 형식으로 지정되어야 합니다.
"Content-Type: application/json"변경하려는 필드가 포함된 JSON 객체를 parameters 헤더와 함께 요청 본문에 전달하십시오. 생략된 필드는 변경되지 않은 상태로 유지됩니다.
instance_limit_seconds— 정수, 또는null. 인스턴스의 사용 시간 제한. “인스턴스 할당 한도 설정”을 참조하십시오.usage_allocation_seconds— 정수, 또는null. 이 인스턴스에 할당된 시간으로, 페어-셰어 스케줄러가 큐 우선순위를 결정하는 데 사용됩니다. “인스턴스 할당 한도 설정”을 참조하십시오. Pay-As-You-Go 인스턴스에는 적용되지 않습니다.backends— 문자열 배열. 이 인스턴스에서 사용할 수 있는 백엔드 이름의 허용 목록입니다.["ANY"]이는 해당 요금제에 포함된 모든 백엔드를 이용할 수 있음을 의미합니다.[]이는 사용 가능한 백엔드가 없다는 뜻입니다.
이 요청이 이전 요청과 동일할 경우 parameters , API는 아무런 오류 메시지 없이 해당 요청을 무시합니다. 객체에는 parameters 각 요청이 고유한 것으로 처리될 수 있도록 항상 현재 시각으로 설정된 필드를 timestamp 포함시켜야 합니다.
엔드포인트의 응답은 인스턴스를 가져오는 것과 유사하며, 객체를 extensions 처리하는 방식도 마찬가지입니다.
CRN 는 경로에서 URL -encoded 형식으로 지정되어야 합니다. %2F각 : 을 로 %3A , 각 / 을 로 바꾸십시오. crn%3Av1%3Abluemix%3A...예를 들어, crn:v1:bluemix:... 는 가 됩니다.
curl \
--request PATCH \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
--header 'Content-Type: application/json' \
--data "{
\"parameters\": {
\"timestamp\": \"$(date -u +"%Y-%m-%dT%H:%M:%SZ")\",
\"usage_allocation_seconds\": 220
}
}"import urllib.parse
import datetime
import requests
crn = "<YOUR_INSTANCE_CRN>"
# We use urllib.parse.quote to URL-encode the CRN.
url = (
"https://resource-controller.cloud.ibm.com/v2/resource_instances/"
+ urllib.parse.quote(crn, safe="")
)
timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
body = {
"parameters": {
"timestamp": timestamp,
"usage_allocation_seconds": 220,
}
}
resp = requests.patch(
url,
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json=body,
timeout=30,
)
resp.raise_for_status()
print(resp.json())새 인스턴스 작성
이 POST /v2/resource_instances 엔드포인트를 사용하여 새 인스턴스를 생성(프로비저닝)하십시오. "Content-Type: application/json"헤더와 함께 JSON 본문을 전달합니다.
필수 필드:
name— 인스턴스에 대한 사람이 읽기 쉬운 이름.eu-de``target— 나 와us-east같은 지역.resource_plan_id— 이번 사례에 대한 계획. 계획 ID 표 를 참조하십시오.resource_group— 사용할 리소스 그룹.
또한 객체를 parameters 포함하여 quantum에 특화된 값을 설정할 수도 있습니다:
instance_limit_seconds— 정수, 또는null. 인스턴스의 사용 시간 제한. “인스턴스 할당 한도 설정”을 참조하십시오.usage_allocation_seconds— 정수, 또는null. 이 인스턴스에 할당된 시간으로, 페어-셰어 스케줄러가 큐 우선순위를 결정하는 데 사용됩니다. “인스턴스 할당 한도 설정”을 참조하십시오. Pay-As-You-Go 인스턴스에는 적용되지 않습니다.backends— 문자열 배열. 이 인스턴스에서 사용할 수 있는 백엔드 이름의 허용 목록입니다.["ANY"]이는 해당 요금제에 포함된 모든 백엔드를 이용할 수 있음을 의미합니다.[]이는 사용 가능한 백엔드가 없다는 뜻입니다.
curl \
--request POST \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"name": "my-new-instance",
"target": "us-east",
"resource_plan_id": "7f666d17-7893-47d8-bf9d-2b2389fc4dfc",
"resource_group": "<YOUR_RESOURCE_GROUP_ID>",
"parameters": {
"instance_limit_seconds": 300,
"usage_allocation_seconds": 220
}
}'import requests
body = {
"name": "my-new-instance",
"target": "us-east",
"resource_plan_id": "7f666d17-7893-47d8-bf9d-2b2389fc4dfc",
"resource_group": "<YOUR_RESOURCE_GROUP_ID>",
"parameters": {
"instance_limit_seconds": 300,
"usage_allocation_seconds": 220,
},
}
resp = requests.post(
"https://resource-controller.cloud.ibm.com/v2/resource_instances",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json=body,
timeout=30,
)
resp.raise_for_status()
print(resp.json())인스턴스에서 Qiskit Functions 액세스 구성하기
이 지침을 따라 IBM Cloud Resource Controller API를 사용하여 기존 ‘ IBM Quantum Compute ’ 서비스 인스턴스에서 ‘ Qiskit Functions ’에 대한 액세스 권한을 구성하십시오. 명령어들은 서로 연결되어 있으므로, 순서대로 지침을 따르십시오. 예를 들어, ‘token’이나 ‘ URL ’과 같은 변수는 한 단계에서 설정된 후 이후 단계에서 재사용됩니다.
전제조건
- IBM Cloud API 키(토큰이라고도 함). 필요한 경우 대시보드 에서 API 키를 생성하세요.
- 구성하려는 인스턴스의
CRN. 인스턴스의 CRN 는 ‘인스턴스’ 페이지에 표시됩니다.
1단계: 베어러 토큰 획득하기
API 키를 베어러 토큰으로 교환하세요. 이 토큰을 모든 리소스 컨트롤러 요청의 인증 헤더에 포함시켜야 합니다. 베어러 토큰을 생성하려면 다음 코드를 실행하세요:
curl --request POST \
--url 'https://iam.cloud.ibm.com/identity/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'apikey=<YOUR_API_KEY>&grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey'
--silent | jq .import requests
api_key = "<YOUR_API_KEY>"
resp = requests.post(
"https://iam.cloud.ibm.com/identity/token",
headers={"Content-Type": "application/x-www-form-urlencoded"},
params={
"apikey": api_key,
"grant_type": "urn:ibm:params:oauth:grant-type:apikey",
},
timeout=30,
)
resp.raise_for_status()
token = resp.json()["access_token"]
print(token) 이 응답에는 베어러 토큰인 access_token 필드가 포함되어 있습니다. 이 값을 복사하세요.
2단계: 액세스 확인
변경 사항을 적용하기 전에 토큰이 정상적으로 작동하는지 확인하고 현재 인스턴스 구성을 점검하십시오.
CRN 는 경로에 수동으로 URL 형식으로 인코딩되어야 합니다. 각 을 로 :``%3A , 각 을 / 로 바꾸십시오 %2F. 예를 들어, 는 가 됩니다 crn:v1:bluemix:...``crn%3Av1%3Abluemix%3A... .
curl --request GET \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>'
import urllib.parse
crn = "<YOUR_INSTANCE_CRN>"
# The CRN will be URL-encoded into the path.
instance_url = (
"https://resource-controller.cloud.ibm.com/v2/resource_instances/"
+ urllib.parse.quote(crn, safe="")
)
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
resp = requests.get(instance_url, headers=headers, timeout=30)
resp.raise_for_status()
print(resp.json()["extensions"])
200 OK 응답을 통해 귀하의 토큰이 유효한 것으로 확인됩니다. 현재 인스턴스 구성은 응답의 ‘extensions’ 필드에 포함되어 있습니다. 오래되어 정확하지 않을 수 있는 매개변수 대신 이것을 사용하세요.
3단계: 계정 수준 함수 구성을 확인합니다
인스턴스에는 해당 계정이 권한을 가진 항목에 대해서만 액세스 권한이 부여될 수 있습니다. 인스턴스를 구성하기 전에, 해당 계정의 구성 정보를 확인하여 어떤 기능, 비즈니스 모델 및 권한을 부여할 수 있는지 파악하십시오. 이것이 4단계에서 전송하게 될 값에 대한 신뢰할 수 있는 정보원입니다.
API 키를 사용하여 Qiskit Runtime API를 GET /accounts/{id} 호출하세요. 는 a/ 접두사 를 제외한 귀하의 계정 ID입니다 {id} . CRN (crn:v1:bluemix:public:quantum-computing:...:a/<ACCOUNT_ID>:...) 인스턴스에서 이를 확인할 수 있습니다.
curl --request GET \
--url 'https://quantum.cloud.ibm.com/api/v1/accounts/<ACCOUNT_ID>' \
--header 'Authorization: apikey <YOUR_API_KEY>'
account_id = "<ACCOUNT_ID>" # from the CRN: crn:...:a/<ACCOUNT_ID>:...
resp = requests.get(
f"https://quantum.cloud.ibm.com/api/v1/accounts/{account_id}",
headers={"Authorization": f"apikey {api_key}"},
timeout=30,
)
resp.raise_for_status()
for plan in resp.json()["plans"]:
print(plan["plan_id"], plan.get("functions"), plan.get("custom_functions"))
응답의 각 플랜에는 함수 배열과, 구성되어 있는 경우 custom_functions 객체가 포함됩니다. 여기에는 해당 요금제 하에서 인스턴스에 부여할 수 있는 정확한 이름, 제공업체, 비즈니스 모델 및 권한 값이 나열되어 있습니다.
GET /accounts/{id} 계정 단위로 부여할 수 있는 항목을 보여줍니다. GET /functions ( ‘결과 확인’ 참조)에서는 특정 인스턴스에 이미 부여된 권한을 보여줍니다. 계정 엔드포인트를 사용하여 유효한 값을 확인하고, 함수 엔드포인트를 사용하여 결과를 확인하십시오.
4단계: 함수 액세스 구성
인스턴스를 업데이트하여 카탈로그 함수 및 사용자 정의 함수에 대한 액세스 권한을 부여하십시오.
- 함수 내의
name,provider, 및business_model값은 계정 수준에서 구성된 항목과 정확히 일치해야 합니다( 이전 단계 참조). 권한은 해당 기능에 대해 계정이 가진 권한 중 비어 있지 않은 부분집합이어야 합니다. 마찬가지로, 는 해당 계정의 권한custom_functions중 비어 있지 않은 부분집합이어야 합니다custom_functions.permissions. - 모든 PATCH 요청의 매개변수에 타임스탬프를 포함하십시오. Resource Controller 는 수신된 매개변수를 마지막으로 저장된 값과 비교하여 PATCH 요청의 중복을 제거합니다. 일치할 경우, 요청은 서비스에 도달하지
200 OK못한 채 아무런 알림 없이 무시됩니다. 이를 방지하려면 변경되는 타임스탬프 값을 포함시키세요.
curl --request PATCH \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"parameters": {
"timestamp": "2026-06-30T00:00:00Z",
"functions": [
{
"name": "<FUNCTION_NAME>",
"provider": "<PROVIDER>",
"business_model": "<BUSINESS_MODEL>",
"permissions": [
"function.read",
"function.run",
"function-files.read",
"function-files.write"
]
}
],
"custom_functions": {
"permissions": [
"function-custom.write",
"function-custom.run"
]
}
}
}'
from datetime import datetime, timezone
# A changing timestamp keeps the Resource Controller from de-duplicating the request.
_now = datetime.now(timezone.utc)
timestamp = _now.strftime("%Y-%m-%dT%H:%M:%S.") + f"{_now.microsecond:06d}000Z"
body = {
"parameters": {
"timestamp": timestamp,
"functions": [
{
"name": "<FUNCTION_NAME>",
"provider": "<PROVIDER>",
"business_model": "<BUSINESS_MODEL>",
"permissions": [
"function.read",
"function.run",
"function-files.read",
"function-files.write",
],
}
],
"custom_functions": {
"permissions": ["function-custom.write", "function-custom.run"],
},
}
}
resp = requests.patch(instance_url, headers=headers, json=body, timeout=30)
resp.raise_for_status()
print(resp.json()["extensions"])200 OK 응답이 표시되면 성공한 것입니다. 업데이트된 구성은 응답의 ‘extensions’ 필드에 표시됩니다.
함수 액세스 제거
카탈로그 함수
인스턴스에서 카탈로그 함수를 제거하려면 다음 내용을 포함하여 PATCH 요청을 전송하십시오 "functions": null:
--data '{
"parameters": {
"timestamp": "2026-06-30T00:00:01Z",
"functions": null
}
}'body = {"parameters": {"timestamp": timestamp, "functions": None}}
resp = requests.patch(instance_url, headers=headers, json=body, timeout=30)
resp.raise_for_status()Setting( "functions": [] 빈 배열)을 설정하면 Catalog Functions가 지워집니다. null 이것이 표준형입니다.
사용자 정의 기능
인스턴스에서 사용자 정의 함수를 제거하려면 다음 내용을 포함하여 PATCH 요청을 전송하십시오 "custom_functions": null:
--data '{
"parameters": {
"timestamp": "2026-06-30T00:00:02Z",
"custom_functions": null
}
}'body = {"parameters": {"timestamp": timestamp, "custom_functions": None}}
resp = requests.patch(instance_url, headers=headers, json=body, timeout=30)
resp.raise_for_status()이 설정을 "custom_functions": {"permissions": []} 적용하면 사용자 정의 함수도 함께 초기화됩니다. null 이것이 표준형입니다.
결과 확인
인스턴스의 Qiskit Functions 구성이 올바른지 확인하려면, Resource Controller 대신 Qiskit Runtime API의 ``를 GET /functions 사용하십시오. 계정 수준의 변경 사항으로 인해 Resource Controller 외부에서 인스턴스가 업데이트된 경우, Resource Controller 의 저장된 상태가 최신 상태가 아닐 수 있습니다.
curl --request GET \
--url 'https://quantum.cloud.ibm.com/api/v1/functions' \
--header 'Authorization: apikey <YOUR_API_KEY>' \
--header 'Service-CRN: <YOUR_INSTANCE_CRN>'# The Service-CRN header takes the raw CRN, not the URL-encoded form.
resp = requests.get(
"https://quantum.cloud.ibm.com/api/v1/functions",
headers={"Authorization": f"apikey {api_key}", "Service-CRN": crn},
timeout=30,
)
resp.raise_for_status()
print(resp.json())이 응답에는 해당 인스턴스가 현재 액세스할 수 있는 함수들이 나열되어 있습니다.