Azure.ResourceManager.Compute を使って、Azure 仮想マシンの OS ディスクをスワップできた。
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 の内容がこれで良いのか自信がない。一応期待通り動いたっぽいけど。