はじめに
私はゲームのサーバーをAzureVMで実行して、日々ゲーミングライフを楽しんでいます。
DiscordからAzureVMを起動するために、Python側から起動と停止を調べたので書き記します。
準備
この後のコードで使用するためのSUBSCRIPTION_ID
、CLIENT_ID
、CLIENT_SECRET
、TENANT_ID
はそれぞればれたらまずい(SUBSCRIPTION_ID
は問題ないかもしれない)ので、環境変数にしてあげます。
それぞれの取得方法は以下の通りです。
AzureVMは作成済みの状態で、「Microsoft Entra ID>アプリの登録>新規登録」に進みます。
設定は特に変えずに名前を変えて登録します。
こちらの画像の赤文字が対応しています。それぞれコピーしましょう。
CLIENT_SECRET
は「証明書またはシークレットの追加」を押せばシークレットキーが作成できるページに飛ぶので、「新しいクライアントシークレット」から追加してください。
次に自分のAzureVMの管理ページを開き、それぞれコピーします。
起動
まず、AzureVM起動のプログラムを書きます。
azure-identity
とazure-mgmt-compute
の2つをインストールする必要があります。
pip install azure-identity azure-mgmt-compute
それぞれazure-identity
は認証用に、azure-mgmt-compute
はAzureVMの起動などの操作に使用します。
from azure.identity import ClientSecretCredential
from azure.mgmt.compute import ComputeManagementClient
import os
subscription_id = os.environ["SUBSCRIPTION_ID"]
resource_group_name = "MyVM_group"
vm_name = "MyVM"
client_id = os.environ["CLIENT_ID"]
client_secret = os.environ["CLIENT_SECRET"]
tenant_id = os.environ["TENANT_ID"]
credentials = ClientSecretCredential(tenant_id, client_id, client_secret)
compute_client = ComputeManagementClient(credentials, subscription_id)
vm = compute_client.virtual_machines.get(resource_group_name, vm_name)
operation = compute_client.virtual_machines.begin_start(resource_group_name, vm_name)
print("AzureVMを起動します。")
SUBSCRIPTION_ID
、CLIENT_ID
、CLIENT_SECRET
、TENANT_ID
には先ほど控えたものを入れればOKです。
待機
起動といっても、現在のコードでは「起動しろ」という命令を送っただけなので、実際に起動するのはもう少し先になります。
operation = compute_client.virtual_machines.begin_start(resource_group_name, vm_name)
print("AzureVMを起動します。")
operation.wait()
print("AzureVMが起動しました。")
operation.wait()
を使用することでAzureVMが完全に起動するまでの待機が可能です。
停止
停止はするときも似たような書き方でbegin_deallocate
を使用します。
operation = compute_client.virtual_machines.begin_deallocate(resource_group_name, vm_name)
私が実際に使用するときには停止完了を検知していませんが、上のoperation.wait()
で待機できるはずです(確か)。
おわりに
私は全部読めていませんが、こちらのサンプルコードがまとまっています。
Azure-Samples/azure-samples-python-management
実際にDiscordBotと連携して、AzureVMを制御できるとAzureにログインしていない鯖の人でもAzureVMの起動をすることができるので重宝させてもらっています。