仕事で Microsoft Azure 上に作成された仮想マシンを複製する方法について調べたので、その記録として記事を投稿します。なおこの記事では ARM(Azure Resource Manager)の仮想マシンを対象としています。クラシックモデルの仮想マシンの場合はこれと異なりますので、ご注意ください。
またこの記事は執筆時点(2019/8/3)の Microsoft Azure の機能と動作に基づいて記述しています。今後機能や動作、画面の変更が行われる可能性がありますので、実際に記事を参考にした操作を行われる場合は最新の情報をご確認ください。
操作手順で示したほとんどの作業は PowerShell でも行えます。またPowerShell での作業は Azure ポータルの Cloud Shell で実行できます。PowerShell での操作については参考資料を参照してください。
複製を作る4つの方法
Azure 上で仮想マシンの複製を作ための機能として公式にサポートされるものとしては、以下の4つが考えられます
- 仮想マシンの「キャプチャ」
- 仮想ディスクの「スナップショット」
- Azure Backup
- Virtual Machine Scale Set
それぞれ一長一短なのですが、この記事では汎用性の高い「1.」と「2.」の方法についてまとめています。
実際に複製を行うために、まず実験用の仮想マシンを用意しました。複製対象となるデータ量を小さくするため、CentOS の仮想マシンを作成し、Apache と PHP をインストールしました。
仮想マシンのキャプチャから複製する
仮想マシンのキャプチャを行うと「イメージ」リソースが作成されます。イメージには作成元の仮想マシンに接続されていた OS ディスクと(存在すれば)データディスクが含まれています。そのため作成されたイメージから仮想マシンを作成すると、データディスクも含めて元の仮想マシンと同じディスク構成とすることができます。
ただしイメージから新規の仮想マシンを作成するには、キャプチャした仮想マシンの OS が「一般化」されている必要があります。「一般化」とは、Windows でいえば sysprep.exe /generalize を実行することで、デバイスにインストールされたオペレーティングシステムの固有情報(Windows で言えば SID やホスト名などの情報)を消去し、インストール初期でこれらの固有情報が設定される前の状態に戻すことです。これにより、イメージから仮想マシンを作成する際に固有情報の設定の処理が行われ、作成された仮想マシンのオペレーティングシステムはキャプチャ元の仮想マシンのオペレーティングシステムとは別の固有情報を持った別の環境となります。
※上記のように複製を目的としたキャプチャを行うためには一般化が必要となるため、キャプチャ後の(元の)仮想マシンを起動してもキャプチャ前と同様に動作させることができません。そのためキャプチャの操作ではキャプチャ後に元の仮想マシンを自動的に削除することも可能です。また元の仮想マシンをキャプチャ後も稼働させたい場合は、次に示すスナップショットから複製する方法で一般化前の仮想マシンのすべてのディスクのスナップショットを作成しておき、元の仮想マシンの一般化とそれに伴うシャットダウンが完了した後で、スナップショットから仮想マシンを復元することができます。
キャプチャを利用した仮想マシンの複製の手順は以下の通りです。
- 複製する仮想マシンの OS を一般化します。
Windows の場合はリモートデスクトップ接続し、以下のコマンドを管理者権限で実行します。実行後、仮想マシンがシャットダウンされるまで待ちます。
sysprep.exe /generalize /shutdown /oobe
Linux の場合は SSH 接続したコンソールで以下のコマンドを実行します。
sudo waagent -deprovision+user
確認メッセージが表示されるので注意事項を確認のうえ、「y」 と入力して続行します。 - Azure ポータルで複製する仮想マシンを停止(割り当て解除)します。
- Azure ポータルで複製する仮想マシンのブレードの[概要] タブの [キャプチャ] をクリックします。
- 「イメージの作成」が表示されます。
必要であれば [名前] [リソースグループ] を変更します。またキャプチャのために一般化した仮想マシンは起動して利用できないので、再度キャプチャすることがなければ [イメージの作成後、この仮想マシンを自動的に削除します] のチェックを付けます。
最後に確認のため仮想マシン名を入力し、[作成] をクリックします。
- 作成が完了したら、イメージを作成したリソースグループを開いてイメージが表示されることを確認します。
- イメージ名をクリックしてブレードを開きます。
- [+VM の作成] をクリックして、イメージから新しい仮想マシンを作成します。
[イメージ] の欄に作成したイメージ名がが設定されています。
- Market Place から仮想マシンを作成するのと同様に、仮想マシン名、仮想マシンのサイズ、管理者アカウント、受信ポート規則を指定します。
- 通常通り仮想マシンの作成を進め、デプロイが完了するのを待ちます。
- デプロイが完了したら、[リソースに移動] をクリックして新しく作成した仮想マシンのブレードを開きます。
オペレーティングシステムは複製元の仮想マシンと同じですが、コンピューター名は新しい仮想マシンの作成時に指定した名前になっています。
管理者アカウントも同様に新しいものになっています。
- 複製した仮想マシンで Apache と PHP が稼働していることを確認できます。
仮想ディスクのスナップショットから複製する
仮想ディスクのスナップショットを行うと「スナップショット」リソースが作成されます。スナップショットは採取元の仮想ディスクの内容の読み取り専用の完全なコピーです。スナップショットから(読み書き可能な)仮想ディスクを作成することができ、その仮想ディスクから仮想マシンを作成することができます。ただしスナップショットには採取元の単一のディスクの情報しか含まれていないので、データディスクが接続されていた仮想マシンの場合、複製を行うにはすべてのディスクについて個別にスナップショットの作成と仮想ディスクの作成を行い、OS ディスクから仮想マシンを作成する際にデータディスクを元通りに接続する必要があります。
※スナップショットはディスクが仮想マシンに接続されており、かつ仮想マシンが起動している状態でも採取することは可能です。しかし上に述べた理由から、データディスクが接続されている仮想マシンをスナップショットを使って複製する場合は、仮想マシンを停止した状態でスナップショットを採取する必要があります。そうしないと、OS ディスクを含む複数のディスク間で整合性が取れなくなり、複製した仮想マシン(のオペレーティングシステムやアプリケーション)が正常に動作しなくなる可能性があります。
またスナップショットから仮想マシンを複製する場合は、複製元の仮想マシンのオペレーティングシステムの一般化は必要ありません。ただし一般化を行わず複製した場合は元の仮想マシンの完全なクローンとなるため、同一のネットワーク上で同時に起動した場合、予期せぬ問題が発生する場合があります。一般化後に OS ディスクのスナップショットを採取し複製した場合は、複製後の仮想マシンのオペレーティングシステムはキャプチャ元の仮想マシンのオペレーティングシステムとは別の固有情報を持った別の環境となります。一般化するかどうかは複製後の利用目的に合わせて判断してください。
スナップショットを使った仮想マシンの複製の手順は以下の通りです。
- 仮想マシンをシャットダウンします。シャットダウンしていなくてもスナップショットを採取することは可能ですが、仮想マシンの複製に利用する場合はシャットダウン状態の方が無難でしょう。
- Azure Portal 複製をで作成したい仮想マシンのブレードを開き、[ディスク] をクリックします
- スナップショットを採取するディスクをクリックします
- [+スナップショットの作成] をクリックします
- スナップショットに名前を付けて、[作成] をクリックします。
- スナップショットを作成したリソース グループを開くと、スナップショットが作成されています。
- クリックしてブレードを開くと、[エクスポート] という項目があります。これをクリックすると、スナップショットを VHD としてローカルにダウンロードできます。
ダウンロードした VHD はローカルの Hyper-V で利用する、別サブスクリプションの Azure にアップロードして利用するなどが可能です(OS ディスクであれば VHD を元に仮想マシンを作成することも可能です)。
- スナップショットから管理ディスクを作成します。Azure ポータルで [+リソースの作成] をクリックし、検索ボックスに “Managed Disks” と入力して管理ディスクの作成画面を呼び出します。
- [作成] をクリックし、管理ディスクを作成します。「リソース グループ」と「地域」をスナップショットを作成したときと同じにしてください。
[ソースの種類] で「スナップショット」を選択し、採取したスナップショットを選択します。
※[サイズ] でディスクのサイズが変更できます。元のディスクより小さいサイズに変更できますが、実際のデータ サイズよりディスクのサイズが小さいとディスクの作成に失敗しますので、注意してください。元のディスクと同じサイズを選択するのが無難でしょう。
- [確認および作成] をクリックし、[作成] をクリックするとデプロイが開始されます。
- デプロイが完了したら、[リソースに移動] をクリックして新しく作成した管理ディスクのブレードを開きます。
- [+仮想マシンの作成] をクリックして、管理ディスクから仮想マシンを作成します。
[イメージ] の欄に作成元の管理ディスクが設定されています。
管理ディスクから直接仮想マシンを作成しているので、Market Place やイメージから仮想ディスクを作成する場合と異なり管理者アカウントを指定する欄がありません。
- [確認および作成] をクリックし、[作成] をクリックするとデプロイが開始されます。
- デプロイが完了したら、[リソースに移動] をクリックして新しく作成した仮想マシンのブレードを開きます。
コンピューター名や OS の種類が複製元の仮想マシンと同一になっています。管理者アカウントも元の仮想マシンと同じです。
- 複製した仮想マシンで Apache と PHP が稼働していることを確認できます。
まとめ
Azure の仮想マシンを複製する方法として、以下の2つについて手順を検証・紹介しました。
- 仮想マシン一般化した上でキャプチャしてイメージを作成し、イメージから新しい仮想マシンを作成する
- 仮想ディスクのスナップショットを作成し、スナップショットから管理ディスクを作成し、管理ディスクから新しい仮想マシンを作成する
それぞれ次のような特徴があります。
キャプチャを使う
- オペレーティングシステムが一般化されるので、元の仮想マシンとは別の環境となる
- Market Place から仮想マシンを作成する場合と同様に新しいコンピューター名や管理者アカウントを構成できる
- 一般化が必要なので元の仮想マシンは利用できなくなる
スナップショットを使う
- オペレーティングシステムの一般化が必要ないので、元の仮想マシンの完全なクローンが作成できる(一般化しても良い)
- クローンなので新しい仮想マシンのコンピューター名や管理者は元の仮想マシンと同じになる
- 一般化しなければ元の仮想マシンも利用可能だが、同時利用には注意が必要
参考資料
- Azure Resource Manager (ARM) 仮想マシンの複製方法のご紹介 (Part.1)
<https://blogs.technet.microsoft.com/jpaztech/2018/09/21/arm-vm-replication-part-1/> - Azure Resource Manager (ARM) 仮想マシンの複製方法のご紹介 (Part.2)
<https://blogs.technet.microsoft.com/jpaztech/2018/09/25/arm-vm-replication-part-2/> - スナップショットの作成
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/snapshot-copy-managed-disk> - 管理ディスク (Managed Disks) スナップショットより VM をデプロイする
<https://blogs.technet.microsoft.com/jpaztech/2017/05/02/deployvmfromsnapshot/> - PowerShell でスナップショットから仮想マシンを作成する
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/scripts/virtual-machines-windows-powershell-sample-create-vm-from-snapshot> - Azure で一般化された VM の管理対象イメージを作成する
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/capture-image-resource> - 管理ディスク (Managed Disks) の “イメージ” リソースを使用し、仮想マシンを複数台展開する
<https://blogs.technet.microsoft.com/jpaztech/2017/05/10/deployvmsfrommanagedimage/> - 管理イメージから VM を作成する
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/create-vm-generalized-managed> - Export an Azure Managed Snapshot to Storage Account – PowerShell
<https://arlanblogs.alvarnet.com/export-an-azure-managed-snapshot-to-storage-account-powershell/> - Export/Copy managed snapshots as VHD to a storage account in different region with PowerShell
<https://docs.microsoft.com/en-us/azure/virtual-machines/scripts/virtual-machines-windows-powershell-sample-copy-snapshot-to-storage-account> - 汎用化した VHD をアップロードして Azure で新しい VM を作成する
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/upload-generalized-managed?toc=%2fazure%2fvirtual-machines%2fwindows%2ftoc.json> - Create a managed disk from a VHD file in a storage account in same or different subscription with PowerShell
<https://docs.microsoft.com/en-us/azure/virtual-machines/scripts/virtual-machines-windows-powershell-sample-create-managed-disk-from-vhd?toc=%2fpowershell%2fmodule%2ftoc.json> - Azure から Windows VHD をダウンロードする
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/download-vhd> - Azure 対応 VHD の Azure へのアップロードおよび Azure イメージの作成
<https://www.ibm.com/support/knowledgecenter/ja/SSPREK_9.0.3/com.ibm.isam.doc/admin/task/tsk_upload_vhd_azure.html>