C# で Azure 仮想マシンのデータディスクを入れ替える

Azure.ResourceManager.Compute を使って、Azure 仮想マシンのデータディスクもアタッチやデタッチができる。

www.nuget.org

OSディスクのときと違って、データディスクは ID の変更ができないので、データディスクのアタッチとでタッチを行うことで、データディスクを入れ替えた状態にしてみた。

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);

// データディスクをデタッチ
var lun = vm.Data.StorageProfile.DataDisks.Select(x => x.Lun).FirstOrDefault();
var detachPatch = new VirtualMachinePatch
{
    StorageProfile = vm.Data.StorageProfile,
};
detachPatch.StorageProfile.DataDisks.Clear();
var detachOperation = await vm.UpdateAsync(WaitUntil.Completed, detachPatch);
vm = await detachOperation.WaitForCompletionAsync();

// データディスクをアタッチ
var diskId = ManagedDiskResource.CreateResourceIdentifier(
    subscriptionId: SubscriptionId,
    resourceGroupName: ResourceGroupName,
    diskName: DiskName);
var attachPatch = new VirtualMachinePatch
{
    StorageProfile = vm.Data.StorageProfile,
};
attachPatch.StorageProfile.DataDisks.Add(new VirtualMachineDataDisk(lun, DiskCreateOptionType.Attach)
{
    Caching = CachingType.ReadWrite,
    ManagedDisk = new VirtualMachineManagedDisk
    {
        Id = diskId,
    },
});
var attachOperation = await vm.UpdateAsync(WaitUntil.Completed, attachPatch);
vm = await attachOperation.WaitForCompletionAsync();

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