C# で Azure 仮想マシンの OS ディスクをスワップする

Azure.ResourceManager.Compute を使って、Azure 仮想マシンの OS ディスクをスワップできた。

www.nuget.org

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

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

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

var vmId = VirtualMachineResource.CreateResourceIdentifier(
    subscriptionId: SubscriptionId,
    resourceGroupName: ResourceGroupName,
    vmName: VmName);
var vm = client.GetVirtualMachineResource(vmId);
vm = await vm.GetAsync();

// 仮想マシンを停止
await vm.DeallocateAsync(WaitUntil.Completed);

// OS ディスクをスワップ
var diskId = ManagedDiskResource.CreateResourceIdentifier(
    subscriptionId: SubscriptionId,
    resourceGroupName: ResourceGroupName,
    diskName: DiskName);
var update = new VirtualMachinePatch
{
    StorageProfile = new()
    {
        // Attach ではなく FromImage にしないと 409 になる
        OSDisk = new VirtualMachineOSDisk(DiskCreateOptionType.FromImage)
        {
            OSType = SupportedOperatingSystemType.Windows,
            Caching = CachingType.ReadWrite,
            ManagedDisk = new VirtualMachineManagedDisk
            {
                Id = diskId,
            },
        },
    }
};
var operation = await vm.UpdateAsync(WaitUntil.Completed, update);
vm = await operation.WaitForCompletionAsync();

// 仮想マシンを開始
await vm.PowerOnAsync(WaitUntil.Completed);

VirtualMachineResource.UpdateAsync に渡した VirtualMachinePatch の内容がこれで良いのか自信がない。一応期待通り動いたっぽいけど。