インスタンス管理には、 IBM Cloud の Resource Controller APIを使用してください
IBM Cloud® ( Resource Controller )のREST APIを使用すると、プログラムによってインスタンスの取得、作成、更新を行うことができます。
すべての Resource Controller エンドポイントでは、ベアラートークンを含むという Authorization ヘッダーを渡して認証を行う必要があります。 REST APIの設定ガイドを参照してください。
インスタンスを取得する
特定の実体に関する情報を取得するには、この GET /v2/resource_instances/{crn} エンドポイントを使用してください。 CRN は、パス内で URL エンコードされている必要があります。
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 Compute Service REST API を、このエンド GET /v1/backends ポイントとともに使用します。 (ヘッダー Service-CRN を、ご自身のインスタンスの CRN に設定してください。)
CRN は、パス内で URL エンコードされている必要があります。 %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 エンコードされている必要があります。
"Content-Type: application/json"変更したいフィールドを含むJSONオブジェクトを parameters 、ヘッダーとともにリクエスト本文として渡してください。 省略されたフィールドは変更されません。
instance_limit_seconds— 整数、またはnull. インスタンスの使用時間制限。 「インスタンスの割り当て制限の設定」 を参照してください。usage_allocation_seconds— 整数、またはnull. このインスタンスに割り当てられた時間。 フェアシェア・スケジューラがキューの優先順位を決定するために使用する。 「インスタンスの割り当て制限の設定」 を参照してください。 従量課金型インスタンスには適用されません。backends— 文字列の配列。 このインスタンスで使用可能なバックエンド名の許可リスト。["ANY"]つまり、そのプランに含まれるすべてのバックエンドが利用可能であることを意味します。[]これは、利用可能なバックエンドがないことを意味します。
が前回のリクエストと同一の場合 parameters 、APIはそのリクエストを黙って無視します。 timestamp オブジェクト parameters には、各リクエストが一意のものとして扱われるよう、常に現在時刻が設定されたフィールドを含めてください。
このエンドポイントの応答は、 インスタンスを取得する場合と似ており、オブジェクトの extensions 扱い方も同様です。
CRN は、パス内で URL エンコードされている必要があります。 %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— 使用するリソースグループ。
また、quantum固有の値を設定するために、 parameters objectを含めることもできます:
instance_limit_seconds— 整数、またはnull. インスタンスの使用時間制限。 「インスタンスの割り当て制限の設定」 を参照してください。usage_allocation_seconds— 整数、またはnull. このインスタンスに割り当てられた時間。 フェアシェア・スケジューラがキューの優先順位を決定するために使用する。 「インスタンスの割り当て制限の設定」 を参照してください。 従量課金型インスタンスには適用されません。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 Serviceインスタンスで 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()( "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())この応答には、そのインスタンスが現在アクセス可能な関数が一覧表示されます。