💨

クラウド基盤mdxのREST APIの使い方

に公開

この記事について

こんにちは、東京大学鈴村研究室で、インフラエンジニアとしてお手伝いさせていただいています、福田と申します。

https://sites.google.com/view/toyolab/鈴村研究室概要

これまで、クラウド基盤mdxの上でKubernetes環境を構築し、サーバレスWebアプリケーションを開発するための手順や、分散学習を行うための手順について説明してきました。

https://zenn.dev/suzumura_lab/articles/627b5063d6884d

はじめに

今回のこの記事では、クラウド基盤mdxのREST APIの中で代表的なコマンドについて紹介したいと思います。
クラウド基盤mdxのREST APIを使うと、仮想マシンの起動や停止などが、コマンドラインや、Pythonスクリプトなどから操作可能です。

前提環境

  • mdxの管理画面に入れる状態であること
  • 操作可能なmdx仮想マシンが作られていること

mdx管理画面でのトークン発行

  • mdx管理画面にログインし、右上にあるユーザー名のメニューから、トークン発行を選択します。

  • すると以下のようなダイアログが表示されるので、👁️のボタンをクリックし、トークンを見れる状態にして、トークンをコピーします。

取得したトークンでのmdx REST API実行

次に、取得したトークンを使って、mdx REST APIを実行してみます。
以下のスクリプトは、所属しているプロジェクト情報を取得するものです。
auth_tokenには、取得したトークンを入力します。

import requests


if __name__ == '__main__':
    base_url = 'https://oprpl.mdx.jp'
    
    # ここに取得したトークンを入力
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }

    response = requests.get(f"{base_url}/api/project/assigned/",
                             headers=headers)
    print(response.json())

このスクリプトを実行すると以下のような結果が得られます。
ここで得られた、projectsのuuidは、mdx仮想マシンの起動や停止のAPIを実行する際に使用するため、記録しておきます。

[
  {
    "uuid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "name": "東京大学情報基盤センター",
    "projects": [
      {
        "uuid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "name": "運用管理プロジェクト",
        "type": "通常",
        "expired": false,
        "suspended": false,
        "token": true
      }
    ]
  }
]

仮想マシンの一覧取得

取得したprojectsのuuidを使って、以下のようなコマンドで仮想マシンの一覧を取得することができます。

if __name__ == '__main__':
    import requests

    base_url = 'https://oprpl.mdx.jp'

    # ここに取得したトークンを入力
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }
    # ここにREST APIで得られたプロジェクトのuuidを入力
    project_uuid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    response = requests.get(f"{base_url}/api/vm/project/{project_uuid}?page_size=100",
                             headers=headers)

    vm_list = response.json()['results']

    for vm in vm_list:
        print(f"name: {vm['name']}, uuid: {vm['uuid']}")

すると以下のような仮想マシンの一覧が取得できます。
ここで表示されるuuidが、仮想マシンの起動や停止に必要な情報となります。

name: fukuda_gpu_instance, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: fukuda_k8s_cpu_bastion, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: fukuda_k8s_cpu_master, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: fukuda_k8s_cpu_worker1, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: fukuda_k8s_cpu_worker2, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: fukuda_k8s_cpu_worker3, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: fukuda_k8s_cpu_worker4, uuid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

仮想マシンの起動

仮想マシンのuuidを指定して、以下のようなスクリプトを実行することで、仮想マシンの起動ができます。

import requests

if __name__ == '__main__':
    base_url = 'https://oprpl.mdx.jp'

    # ここに取得したトークンを設定
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }
    # ここに対象の仮想マシンのuuidを設定
    vm_uuid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    response = requests.post(f"{base_url}/api/vm/{vm_uuid}/power_on/", headers=headers)

仮想マシンの状態確認

仮想マシンのuuidを指定して、以下のコマンドを実行すると、仮想マシンの状態を確認できます。

import requests


if __name__ == '__main__':
    base_url = 'https://oprpl.mdx.jp'

    # ここに取得したトークンを設定
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }
    # ここに対象の仮想マシンのuuidを設定
    vm_uuid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    response = requests.get(f"{base_url}/api/vm/{vm_uuid}/", headers=headers)
    print(response.json())

得られる結果のサンプルは以下の通りです。
ここで、statusなどで、サーバの状態が分かります。
PowerONとなっているので、電源がONになっていることが分かります。

{
  "name": "cpu_bastion",
  "os_type": "Ubuntu Linux (64-bit)",
  "host_name": "bastion",
  "service_level": "スポット仮想マシン",
  "status": "PowerON",
  "vmware_tools": {
    "status": "最新バージョンが実行されています",
    "version": "12389"
  },
  "cpu": 8,
  "memory": "12.09 GB",
  "gpu": 0,
  "service_networks": [
    {
      "adapter_number": 1,
      "ipv4_address": [
        "xxx.xxx.xxx.xxx"
      ],
      "ipv6_address": [
        "xxxx:xxxx:xxxx:xxxx",
        "xxxx:xxxx:xxxx:xxxx:xxxx"
      ],
      "segment": "運用管理プロジェクト",
      "global_ip": "xxx.xxx.xxx.xxx"
    }
  ],
  "storage_networks": [
    {
      "adapter_number": 1,
      "ipv4_address": [
        "xxx.xxx.xxx.xxx"
      ],
      "ipv6_address": [
        "xxxx:xxxx:xxxx:xxxx:xxxx"
      ],
      "type": "PortGroup",
      "storage_network_type": "portgroup"
    }
  ],
  "hard_disks": [
    {
      "disk_number": 1,
      "device_key": 2000,
      "capacity": "100 GB",
      "datastore": "ds-nfs-04"
    }
  ],
  "dvd_media": "",
  "vcenter": "xxx.xxx.xxx.xxx",
  "esxi": "xxxx.mdx.local",
  "pack_type": "cpu",
  "pack_num": 8
}

仮想マシンの停止

仮想マシンのuuidを指定して、以下のようなスクリプトを実行することで、仮想マシンの停止ができます。

import requests

if __name__ == '__main__':
    base_url = 'https://oprpl.mdx.jp'

    # ここに取得したトークンを設定
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }
    # ここに対象の仮想マシンのuuidを設定
    vm_uuid = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    response = requests.post(f"{base_url}/api/vm/{vm_uuid}/shutdown/", headers=headers)

仮想マシンの再起動

仮想マシンのuuidを指定して、以下のようなスクリプトを実行することで、仮想マシンの再起動ができます。

import requests

if __name__ == '__main__':
    base_url = 'https://oprpl.mdx.jp'

    # ここに取得したトークンを設定
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }
    # ここに対象の仮想マシンのuuidを設定
    vm_uuid = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    response = requests.post(f"{base_url}/api/vm/{vm_uuid}/reboot/", headers=headers)

トークンの更新

取得したトークンは一定時間を過ぎると、無効になります。
よって、例えば時刻に応じて自動的に仮想マシンを開始・停止するといったユースケースなど、サーバ上で継続的にmdx REST APIを実行させたい場合は、cronなどで定期的にこのコマンドを実行して、トークンを更新すると良いでしょう。

if __name__ == '__main__':
    import requests
    base_url = 'https://oprpl.mdx.jp'

    # ここに取得したトークンを設定
    auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    headers = {
        "Authorization": f"JWT {auth_token}",
        "Content-Type": "application/json"
    }

    response = requests.post(f"{base_url}/api/refresh/",
                             headers=headers, json={"token": auth_token})

    token = response.json()['token']

    # 更新したトークンを表示する
    print(token)

まとめ

本記事では、mdx REST APIの中で、代表的なコマンドを紹介しました。
REST APIには他にも色々なコマンドがあり、GUIで操作するのとほぼ同等の機能を備えていますが、今回の記事で紹介した、トークンの更新と、サーバーの起動、状態確認、停止、再起動などができれば、夜間や休日に自動停止したり、トラフィックが増える時間帯にサーバを追加で起動させるなど、サーバの運用に最低限のことはできると思います。

東京大学鈴村研究室について

https://sites.google.com/view/toyolab/鈴村研究室概要

Discussion