新しくなった ConoHa の API を PowerShell 7.4 の Invoke-RestMethod で使ってみる


この投稿は下記のアドベントカレンダーに参加しています。

ConoHa 新バージョンリリース

本ブログでは、これまでから PowerShell で ConoHa の API を使用する記事を公開してきました。

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 を作成するのではなく、

  1. ボリュームを作成
  2. それを使用して 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}}

コントロールパネルで確認

コントロールパネルで確認してみます。

ConoHa コントロールパネル VM 作成直後

API で VM 作成した直後は、ネームタグがクリックできないのですが、しばらくするとクリックできるようになります。

最後に

本記事では、とりあえず VM を作成するまでとなりましたが、

ConoHa ではここで紹介した API 以上に多くの API が公開されています。

詳細については、公式ドキュメントやAdvent Calenderに参加された skworks33 さんの記事から Postman をチェックしてみてください。

余談・・・

本記事では下記の公式サイトを元に書きましたが・・・

正しくは・・・

Documentation

Documentation のようです


Comments

comments

コメントを残す

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)