C# で Azure 仮想マシンのプロパティを取得する

Azure ポータルの仮想マシンの概要ページに表示されているような情報を、C#SDK 使って取得してみた。

www.nuget.org

www.nuget.org

といっても全部取得するのは調査に時間がかかるので、ひとまず必要なやつだけ。ズバッと1回の呼び出しで取得できなかったので、思っていたよりかなり面倒だった。気が利いてなさすぎてイマイチ。

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Compute.Models;
using Azure.ResourceManager.Network;

const string ClientId = "クライアントID";
const string ClientSecret = "クライアントシークレット";
const string TenantId = "テナントID";
const string SubscriptionId = "サブスクリプションID";
const string ResourceGroupName = "リソースグループ名";
const string VmName = "仮想マシン名";

var credential = new ClientSecretCredential(
    tenantId: TenantId,
    clientId: ClientId,
    clientSecret: ClientSecret);
var client = new ArmClient(credential);

var id = VirtualMachineResource.CreateResourceIdentifier(
    subscriptionId: SubscriptionId,
    resourceGroupName: ResourceGroupName,
    vmName: VmName);
var vm = client.GetVirtualMachineResource(id);
var response = await vm.GetAsync(expand: InstanceViewType.InstanceView);

// 状態は InstanceView の Statuses を見るしかなさそう。
// 実行中の場合、Statuses には ProvisioningState/succeeded と PowerState/running が入っているので、
// 最後だけ取り出す一工夫が必要。
Console.WriteLine($"状態:{response.Value.Data.InstanceView.Statuses.LastOrDefault()?.DisplayStatus}");

foreach (var niRef in response.Value.Data.NetworkProfile.NetworkInterfaces)
{
    // IPアドレスを見るには、ネットワークインターフェースを取得するしかなさそう。
    var ni = client.GetNetworkInterfaceResource(niRef.Id);
    var nicResponse = await ni.GetAsync();
    foreach (var ip in nicResponse.Value.Data.IPConfigurations)
    {
        Console.WriteLine($"プライベートIPアドレス:{ip.PrivateIPAddress}");
        if (ip.PublicIPAddress != null)
        {
            // パブリックIPアドレスはさらに別リソースなので、IPアドレスの値を見るためには、
            // パブリックIPアドレスリソースを取得するしかない。
            var pip = client.GetPublicIPAddressResource(ip.PublicIPAddress.Id);
            var pipResponse = await pip.GetAsync();
            Console.WriteLine($"パブリックIPアドレス:{pipResponse.Value.Data.IPAddress}");
        }
    }
}

Console.WriteLine($"OSディスク:{response.Value.Data.StorageProfile.OSDisk.Name}");
foreach (var dataDisk in response.Value.Data.StorageProfile.DataDisks)
{
    Console.WriteLine($"データディスク:{dataDisk.Name}");
}

Console.ReadLine();