この投稿は下記のアドベントカレンダーに参加しています。
ConoHa 新バージョンリリース
本ブログでは、これまでから PowerShell で ConoHa の API を使用する記事を公開してきました。
- CentOS 8 を ConoHa の ISO API を PowerShell で 叩いてインストールしてみる(2019/09 公開)
- PowerShell の Invoke-RestMethod を使って ConoHa の API を触ってみた(2015/07 公開)
2023年11月にConoHaの新バージョンがリリースされ、最近の OpenStack に準拠した API になりましたので改めて紹介します。
PowerShell v7.4 新バージョンリリース
ConoHa と同じく2023年11月に PowerShell v7.4 がリリースされました。
また、LTS 版を使っていた方としては、7.3 は利用したことが無い方も居ると思いますので、新機能のページをチェックしておくと良いでしょう。
この記事に関わる変更点として、7.4 において、Test-Json で Newtonsoft.Json.Schema の代わりに Json.Schema.Net が使用されるようになりました。
たとえば、
{"a":"b",}
のような , が入っている JSON はこれまでの Test-Json では True になっていましたが、ConoHa の API 的には利用できませんでした。
7.4 であれば Cannot parse the JSON. とエラーになるので、間違ったリクエストを送ることが防止できます。
PowerShell 7.2.17
Copyright (c) Microsoft Corporation.
PS /> Test-Json '{"a":"b",}'
True
PowerShell 7.4.0
PS /> Test-Json '{"a":"b",}'
Test-Json: Cannot parse the JSON.
False
API 利用情報の取得
skworks33 さんの記事が素晴らしいのでリンクします。
下記の情報が必要となります。
- テナントID
- テナント名
- エンドポイント
- ユーザー名
- パスワード
API 利用
ConoHa の API のリファレンスはこちらで公開されています。
また、Advent Calendar に参加した当時はまだ公開されていなかった、実際のユースケースについても公開されていますので参考になります。
API 利用情報の定義
まずは、API の情報を PowerShell の変数として定義します。
$OS_USERNAME = "ユーザー名"
$OS_PASSWORD = "パスワード"
$OS_TENANT_ID = "テナントID"
$IDENTITY = "https://identity.c3j1.conoha.io/v3"
$COMPUTE="https://compute.c3j1.conoha.io/v2.1"
$IMAGE="https://image-service.c3j1.conoha.io"
$STORAGE="https://block-storage.c3j1.conoha.io/v3/" + $OS_TENANT_ID
$NETWORK="https://networking.c3j1.conoha.io"
$SWIFT="https://object-storage.c3j1.conoha.io/v1/AUTH_" + $OS_TENANT_ID
$DNS="https://dns-service.c3j1.conoha.io"
URL についても環境により異なる可能性がありますが、tyo1, tyo2, tyo3 と書かれている場合、旧バージョンとなりますのでコンパネを確認してみてください。
トークン取得
最初に必要になるトークン取得から API の内容が変わってきます。
$body = '{"auth": {"identity": {"methods": ["password"],"password": {"user": {"name": "' + $OS_USERNAME + '","password": "'+ $OS_PASSWORD +'"}}},"scope": {"project": {"id": "' + $OS_TENANT_ID + '"}}}}'
$url = $IDENTITY+"/auth/tokens"
$tokenresponse = Invoke-WebRequest $url -Method POST -Body $body -Headers $headers
$token = $tokenresponse.Headers.'X-Subject-Token'
$tokenheaders = @{"X-Auth-Token" = $token[0]}
なお、本記事では PowerShell 7.4 をベースに解説していますが、Windows PowerShell 5.1 の場合、
$tokenheaders = @{"X-Auth-Token" = $token}
のようにしてなります。
ボリューム作成
今回から、直接 VM を作成するのではなく、
- ボリュームを作成
- それを使用して VM 作成
という流れになります。
コンパネでは一発で VM が作成できるようになるのですが、ストレージの画面を見るとちゃんと裏側でこの流れに沿って作成されていることが分かります。
ボリュームタイプ取得
こちらは API も提供されていますが、
説明があるので考えないようにするということで、”c3j1-ds02-boot” を使います。
- c3j1-ds02-boot:メモリ512MBプラン以外のブートストレージ用を作成する際に使うボリュームタイプです。
- c3j1-as01-boot:メモリ512MBプランのブートストレージ用を作成する際に使うボリュームタイプです。
- c3j1-ds02-add:追加ストレージ用を作成する際に使うボリュームタイプです。
イメージ一覧取得
下記の API を使います。
名前が分かっている場合は絞り込めますが、ConoHa では多くのイメージを提供しているため、一覧取得して確認します。
なお、引数をつけない場合一度に出力されず、maker などの引数をつけないと全体を取得できません。
$result = Invoke-RestMethod -method GET -Headers $tokenheaders -Uri "$IMAGE/v2/images"
$result.images.Count
18
今回は、Limit をつけることで一気に取得しました。
$result = Invoke-RestMethod -method GET -Headers $tokenheaders -Uri "$IMAGE/v2/images?limit=100"
$result.images
64
そのまま表示すると、不要な情報も出てくるので Sort-Object と Select-Object を使うと、下記のようにすると探しやすくなります。
$result.images | Sort-Object name | Select-Object id, name, status, visibility
id name status visibility
-- ---- ------ ----------
57e2a74f-c40d-4fb6-a2cc-a4748e73549c vmi-almalinux-8.8-amd64 active public
546924fb-9985-4301-9193-bafe5735790f vmi-almalinux-9.2-amd64 active public
f70d7d70-ddf4-49ab-8094-ee23d53c7b6f vmi-arch-20231108-amd64 active public
25ec660b-0252-4088-9761-8dd8e7ecc0b2 vmi-archivebox-0.2.4-ubuntu-20.04-amd64 active public
04bc5d41-9601-4ccf-995e-48dbb80c4c14 vmi-autogpt-v0.3.1-ubuntu-20.04-amd64 active public
以下略
もしくは、利用したいイメージが分かっている場合、Where-Object を使うこともできます。
$result.images | Where-Object{$_.name -like "*centos*"} | Select-Object id, name, status, visibility
id name status visibility
-- ---- ------ ----------
8be91b1a-0efd-4fd0-a3f7-56ebd393de72 vmi-kusanagimanager9-0.5.2-centos-stream9-amd64-100gb active public
16d4f571-9226-4e93-a468-a911f5ba29ea vmi-kusanagi9-9.4.2-centos-stream9-amd64 active public
d2ddeb80-bcbb-417e-bb96-3e87933437e1 vmi-centos-stream9-amd64 active public
56e1ca71-767e-4ee7-93df-fe37cbe4f065 vmi-centos-7.9-amd64 active public
今回は CentOS Stream 9 を使います。
ボリューム作成
下記の API を使います。
$imageref = "先ほど確認したイメージID"
$body = '{"volume": {"name": "centos-stream9","size": 100,"volume_type": "c3j1-ds02-boot","imageRef": "' + $imageref + '"}}'
$result = Invoke-RestMethod -method POST -Body $body -Headers $tokenheaders -Uri "$STORAGE/volumes"
$result.volume
id : ef184948-dd8b-47d9-8536-1e3cb566f93c
status : creating
最後に出力される、id がボリューム ID となりますので、メモします。
Flavor 確認
下記の API を使います。
$result = Invoke-RestMethod -method GET -Headers $tokenheaders -Uri "$COMPUTE/flavors/detail"
$result.flavors | Sort-Object name | Select-Object id, name, vcpus, ram
id name vcpus ram
-- ---- ----- ---
略
f2a77529-1815-43a2-bc14-1f3f6b09079c g2l-t-c2m1 2 1024
784f1ae8-0bc8-4d06-a06b-2afaa9580e0a g2l-t-c3m2 3 2048
略
VM 作成
準備ができましたので VM 作成します。
$flavor_id="先ほど確認した Flavor ID"
$volume_id="先ほど作成したボリューム ID"
$body = '{
"server": {
"flavorRef": "' + $flavor_id + '",
"block_device_mapping_v2": [
{
"uuid": "' + $volume_id + '"
}
],
"security_groups": [
{
"name": "IPv4v6-SSH"
}
],
"metadata": {
"instance_name_tag": "centos-api-test"
}
}
}'
API が長いので念のため Test-JSON で確認してから実行します。
$body
Test-Json $body
## True が出力されることを確認
$result = Invoke-RestMethod -method POST -Headers $tokenheaders -Uri "$COMPUTE/servers" -Body $body
$result.server
id : f1efff03-36e0-4615-b2f6-4c2d61ca0279
略
adminPass : (Adminパスワード)
今回のように、API でパスワードを指定しない場合、ConoHa 側でパスワードが生成され、API レスポンスの adminPass に記載されています。
VM 情報取得
作成のレスポンスでは、VM UUID とパスワードしか記載されて折らず、IP アドレスなど詳細は下記の API で確認します。
$vmuuid="先ほど確認した VM UUID"
$result = Invoke-RestMethod -method GET -Headers $tokenheaders -Uri "$COMPUTE/servers/$vmuuid"
$result.server
id : f1efff03-36e0-4615-b2f6-4c2d61ca0279
略
addresses : @{ext-v4v6-160-251-204-0-23=System.Object[]}
収容ホスト、ボリューム接続状況、セキュリティグループなどは確認できますが、IP アドレスは、/23 までしか分かりません。
IP アドレスは下記で確認できます。
$result.server.addresses
ext-v4v6-160-251-204-0-23
-------------------------
{@{version=6; addr=2400:8500:2002:3174:160:251:x.y; OS-EXT-IPS:type=fixed; OS-EXT-IPS-MAC:mac_addr=fa:16:3e:x:y:z}, @{version=4; addr=160.251.x.y; OS-EXT-IPS:type=fixed; OS-EXT-IPS-MAC:mac_addr=fa:16:3e:x:y:z}}
コントロールパネルで確認
コントロールパネルで確認してみます。

API で VM 作成した直後は、ネームタグがクリックできないのですが、しばらくするとクリックできるようになります。
最後に
本記事では、とりあえず VM を作成するまでとなりましたが、
ConoHa ではここで紹介した API 以上に多くの API が公開されています。
詳細については、公式ドキュメントやAdvent Calenderに参加された skworks33 さんの記事から Postman をチェックしてみてください。
余談・・・
本記事では下記の公式サイトを元に書きましたが・・・
正しくは・・・

Documentation のようです