先日のConoHaでMCサーバの続きとして、ConoHa API等を用いてVPS契約〜MCサーバの起動までの自動化を試みる。

手順

参考: ConoHa ドキュメント: APIでVPSを作成する

APIユーザの作成

まずは、APIユーザをダッシュボードから作成しておく。これはマニュアルの操作が必要。 どうやら、1つのユーザしか作成できない模様。

APIユーザを作成すると、以下が表示される。

  • ユーザー名
  • ユーザーID
  • パスワード

また、後々必要になる「テナント名」「テナントID」も控えておく。

トークンの発行

参考: ConoHa ドキュメント: トークン発行

https://identity.c3j1.conoha.io/v3/auth/tokensにリクエストを送信する。

curl -i -X POST -H "Accept: application/json" -H "Content-Type: application/json" -d "{\"auth\": {\"identity\": {\"methods\": [\"password\"],\"password\": {\"user\": {\"id\": \"ユーザーID\",\"password\": \"パスワード\"}}},\"scope\": {\"project\": {\"id\": \"テナントID\"}}}}" https://identity.c3j1.conoha.io/v3/auth/tokens

実行すると、トークン情報が含まれたレスポンスが返ってくる。

HTTP/1.1 201 Created
server: nginx
date: Mon, 31 Mar 2025 02:25:57 GMT
content-type: application/json
content-length: 2769
x-subject-token: トークン情報
vary: X-Auth-Token
x-openstack-request-id: req-から始まるリクエストID
cache-control: no-store
x-frame-options: DENY
x-content-type-options: nosniff

ボリュームタイプ名の確認

参考: ConoHa ドキュメント: ボリュームタイプ一覧取得

参考: APIでVPSを作成するによると、ボリュームタイプの一覧を取得しているので、それに従う。既知の場合はスキップしていいのだろうか…

curl -X GET \
    -H "Accept: application/json" \
    -H "X-Auth-Token: \"トークン情報\"" \
    https://block-storage.c3j1.conoha.io/v3/テナントID/types

成功すると、以下のレスポンスが返される(整形した)。

{
  "volume_types": [
    {
	  "description": "..." or null,
	  "id": ボリュームタイプID,
	  "is_public": true,
	  "name": ...,
	  "os-volume-type-access:is_public": true
    }, ...
  ]
}

必要なのはnamec3j1-ds02-bootのものなので、そのidを控えておく。

(ちなみに、初回実行時はトークンの有効期限が切れていたため、以下のレスポンスが得られた。)

{"code": 401, "error": "Failed to validate token"}

イメージIDの確認

参考: ConoHa ドキュメント: イメージ一覧取得

ここではUbuntuを使いたいため、nameで指定する。指定しなければ、全てのimageの情報が返される。 Ubuntuには現在バージョンが24.04, 22.04, 20.04(すべてx86_64)があるが、24.04を指定する。

一度リストアップした後、欲しい情報のnameがvmi-ubuntu-24.04-amd64だと判明したので、イメージ情報を取得する。

curl -X GET \
    -H "Accept: application/json" \
    -H "X-Auth-Token: \"トークン情報\"" \
    https://image-service.c3j1.conoha.io/v2/images?name=vmi-ubuntu-24.04-amd64&status=active

レスポンスは以下の通り(整形済み、一部...に置換)。

{
  "images": [
    {
      "status": "active",
      "name": "vmi-ubuntu-24.04-amd64",
      "tags": [
        "display_order=140",
        "service_type=vps",
        "dst_name=Ubuntu",
        "dst_version=24.04"
      ],
      "container_format": "ovf",
      "created_at": "2024-07-10T03:17:53Z",
      "disk_format": "qcow2",
      "updated_at": "2024-07-10T03:20:59Z",
      "visibility": "public",
      "self": "/v2/images/イメージID",
      "min_disk": 30,
      "protected": false,
      "id": イメージID,
      "file": "/v2/images/イメージID/file",
      "checksum": ...,
      "os_type": "linux",
      "os_hash_algo": "sha512",
      "os_hash_value": ...,
      "os_hidden": false,
      "owner": ...,
      "size": 3260874752,
      "min_ram": 1024,
      "schema": "/v2/schemas/image",
      "virtual_size": null,
      "architecture": "x86_64"
    }
  ],
  "schema": "/v2/schemas/images",
  "first": "/v2/images?name=vmi-ubuntu-24.04-amd64"
}

ブートストレージの作成

curl -X POST \
    -H "Accept: application/json" \
    -H "X-Auth-Token: \"トークン情報\"" \
    -d "{\"volume\": {\"size\": 100,\"description\": null,\"name\": \"boot-volume-nametag\",\"volume_type\": \"c3j1-ds02-boot\",\"imageRef\": \"イメージID\"}}" \
    https://block-storage.c3j1.conoha.io/v3/テナントID/volumes

セキュリティグループの確認

事前にダッシュボードで作成した(ConoHaでMCサーバ)セキュリティグループを適用する。その名前を控えておく。

curl -X GET \
    -H "Accept: application/json" \
    -H "X-Auth-Token: トークン情報" \
    https://networking.c3j1.conoha.io/v2.0/security-groups?name=セキュリティグループ名

レスポンス(整形済み、一部...に置換)

{
  "security_groups": [
    {
      "id": セキュリティグループID,
      "name": セキュリティグループ名,
      "tenant_id": テナントID,
      "description": セキュリティグループの説明,
      "shared": false,
      "security_group_rules": [
        {
          "id": "26078b8b-6097-46e6-ba86-c89578022c73",
          "tenant_id": テナントID,
          "security_group_id": セキュリティグループID,
          "ethertype": "IPv4",
          "direction": "ingress",
          "protocol": "tcp",
          "port_range_min": 22,
          "port_range_max": 22,
          "remote_ip_prefix": ...,
          "remote_group_id": null,
          "project_id": テナントID
        },...
      ],
      "project_id": テナントID
    }
  ]
}

プランのフレーバーIDの確認

今回はメモリ2GBのプランを選択する。

参考記事によると、2GBのプランのflavor名は「g2l-t-c3m2」なので、一覧の中から当てはまるものを探す。

curl -X GET \
    -H "Accept: application/json" \
    -H "X-Auth-Token: トークン情報" \
    https://compute.c3j1.conoha.io/v2.1/flavors

レスポンス(整形済み、一部...に置換)

{
  "flavors": [
    {
      "id": フレーバーID,
      "name": フレーバー名,
      "links": [
        {
          "rel": "self",
          "href": ...
        },
        {
          "rel": "bookmark",
          "href": ...
        }
      ]
    },...
}

ちなみに、名前で指定するやり方はなく、IDが分かればエンドポイントの末尾に/v2.1/flavors/フレーバーIDのように指定すれば詳細な情報が見える。

curl -X GET \
	-H "Accept: application/json" \
	-H "X-Auth-Token: $AUTH_TOKEN" \
	https://compute.c3j1.conoha.io/v2.1/flavors/フレーバーID
{
  "flavor": {
    "id": フレーバーID,
    "name": フレーバー名,
    "ram": ...,
    "disk": 0,
    "swap": "",
    "OS-FLV-EXT-DATA:ephemeral": 0,
    "OS-FLV-DISABLED:disabled": false,
    "vcpus": ...,
    "os-flavor-access:is_public": true,
    "rxtx_factor": 1.0,
    "links": [
      {
        "rel": "self",
        "href": ...
      },
      {
        "rel": "bookmark",
        "href": ...
      }
    ]
  }
}

どのプランがどのフレーバー名を示しているかの情報は見つからなかった。 g2l-t-c3m2c3m2はCPUが3つとメモリが2GBだと推測できるが、他のg2ltは何を指しているんだろうか。

追記: 記事によると、lはLinuxでwはWindowsみたい。

ちなみに、c3m2

  • g2l-t-c3m2
  • g2l-p-c3m2
  • g2w-t-c3m2
  • g2w-p-c3m2

の4種類が見つかった。

VPSの作成

これまで得た情報でVPSを作成します。この操作は料金が発生するので注意。

必要な情報を以下に示します。

  • トークン情報
  • フレーバーID(料金プラン)
  • サーバーのrootのパスワード(自由に設定して良い)
  • 作成したブートストレージのID
  • セキュリティグループ名
  • 公開鍵の名前(ダッシュボードに登録済みのもの、optional)
curl -X POST \
	-H "Accept: application/json" \
	-H "X-Auth-Token: トークン情報" \
	-d "{\"server\": {\"flavorRef\": \"フレーバーID\",\"adminPass\": \"サーバーのrootのパスワード\",\"block_device_mapping_v2\": [{\"uuid\": \"ブートストレージのID\"}],\"metadata\": {\"instance_name_tag\": \"test-vps\"},\"security_groups\": [{\"name\": \"セキュリティグループ名\"}],\"key_name\": \"公開鍵の登録名\"}}" \
	https://compute.c3j1.conoha.io/v2.1/servers

成功したレスポンス(一部...に置換)

{
  "server": {
    "id": サーバのID,
    "links": [
      {
        "rel": "self",
        "href": ...
      },
      {
        "rel": "bookmark",
        "href": ...
      }
    ],
    "OS-DCF:diskConfig": "MANUAL",
    "security_groups": [],
    "adminPass": rootのパスワード
  }
}

前回のイメージを適用したい

力尽きたので、また今度。