こんにちは!クラウド環境を扱っていると、仮想マシン(VM)をバックアップしたり、特定の時点のVMをそのまま複製してテスト環境を作成したりする必要があることが本当に多いですよね。
多くの方が利用する一般的な方法は、おそらくこうでしょう。
- VMディスクのスナップショットを作成する。📸
- スナップショットをVHDファイルとしてローカルコンピューターにダウンロードする。(⏳ 永遠に続く…)
- ダウンロードしたVHDファイルを再度Blobストレージにアップロードする。(😩 また永遠に続く…)
- アップロードしたVHDから新しいディスクを作成し、そのディスクで新しいVMを生成する。
このプロセス、何かおかしいと思いませんか?AzureにあるデータをAzureの別の場所に移動するだけなのに、なぜわざわざ自分のコンピューターを経由する必要があるのでしょうか?この方法は時間がかかり、私のコンピューターのネットワーク帯域幅とストレージスペースを浪費し、途中でエラーが発生する可能性も高くなります。
そこで今日は!この非効率的なプロセスを完全にスキップし、Azure内部で直接スナップショットをBlobにコピーしてVMを複製する非常にスマートな方法を、Azure CLIスクリプトと共にご紹介します。

🤔 核心原理:ローカル経由 vs Azure直通
既存の方法が、ソウルから釜山に行くのにわざわざ済州島(私のコンピューター)を経由する飛行機だとすれば、今日ご紹介する方法はKTXに乗って一気に目的地へ向かうようなものです。🚅
核心は、`az storage blob copy start`というAzure CLIコマンドです。このコマンドは、「Azureよ、Aの位置(スナップショット)にあるデータをBの位置(Blobストレージ)にお前が直接コピーしてくれ!」と指示する役割を果たします。データは私たちのコンピューターを全く経由せず、高速で安定したAzureの内部ネットワークを通じて直接移動します。
これはサーバーサイドコピーと呼ばれ、次のような計り知れない利点があります。
- ⚡️ 速度: ローカルネットワークの速度とは比較にならないほど高速です。
- 👍 効率性: 私のコンピューターのリソース(CPU、ネットワーク、ディスク)を全く使用しません。
- 🔒 安定性: 途中でインターネットが切れる心配なく、安定して大容量ファイルをコピーできます。
📜 全体スクリプト大公開!
百聞は一見に如かず、ですよね?以下は、このすべてのプロセスを自動化する完全なBashスクリプトです。そのままコピーして使用しても構いません。
#!/bin/bash
# --- ユーザー設定変数 ---
# 既に作成されているリソースの名前を正確に入力してください。
resourceGroup="gasbugs_group" # リソースグループ
vmName="gasbugs" # 元の仮想マシン
storageAccount="storageaccountgasbugs0" # VHDを保存するストレージアカウント
containerName="blob-test" # VHDを保存するコンテナ
# 新しく作成するリソースの名前を自由に設定してください。
snapshotName="new-snapshot-$(date +%s)" # スナップショット名(重複防止のためタイムスタンプを追加)
newDiskName="new-disk-$(date +%s)" # 新しいディスク名
newVmName="new-vm-$(date +%s)" # 新しい仮想マシン名
# --- スクリプト実行 ---
echo ">> 1. 원본 VM의 OS 디스크 ID를 가져옵니다..."
osDiskId=$(az vm show --resource-group $resourceGroup --name $vmName --query "storageProfile.osDisk.managedDisk.id" -o tsv)
if [ -z "$osDiskId" ]; then echo "오류: OS 디스크 ID를 찾을 수 없습니다."; exit 1; fi
echo " - OS Disk ID: $osDiskId"
echo -e "
>> 2. OS 디스크의 스냅샷을 생성합니다..."
az snapshot create --resource-group $resourceGroup --name $snapshotName --source $osDiskId
echo " - 생성된 스냅샷: $snapshotName"
echo -e "
>> 3. 스냅샷에 접근할 수 있는 임시 SAS URL을 생성합니다..."
snapshotUrl=$(az snapshot grant-access --duration-in-seconds 3600 --name $snapshotName --resource-group $resourceGroup --query "accessSas" -o tsv)
echo " - SAS URL이 성공적으로 생성되었습니다."
echo -e "
>> 4. 스냅샷을 Blob Storage로 서버 측 복사를 시작합니다 (로컬 다운로드 없음)..."
# コピーするBlobの完全なURL
sharedVhdUrl="https://$storageAccount.blob.core.windows.net/$containerName/$snapshotName.vhd"
az storage blob copy start
--account-name $storageAccount
--destination-blob "$snapshotName.vhd"
--destination-container $containerName
--source-uri $snapshotUrl
# コピーが完了するまでステータスを確認します。
while true; do
copy_status=$(az storage blob show --account-name $storageAccount --container-name $containerName --name "$snapshotName.vhd" --query "properties.copy.status" -o tsv)
echo " - 복사 상태: $copy_status"
if [ "$copy_status" == "success" ]; then
echo " - Blob 복사가 완료되었습니다."
break
elif [ "$copy_status" == "failed" ]; then
echo "오류: Blob 복사에 실패했습니다."
exit 1
fi
sleep 15
done
echo -e "
>> 5. 스냅샷의 SAS URL 접근 권한을 해제합니다..."
az snapshot revoke-access --name $snapshotName --resource-group $resourceGroup
echo -e "
>> 6. 복사된 VHD Blob을 소스로 하여 새 관리 디스크를 생성합니다..."
az disk create --resource-group $resourceGroup --name $newDiskName --source $sharedVhdUrl
echo " - 생성된 디스크: $newDiskName"
echo -e "
>> 7. 생성된 디스크를 사용하여 새 가상 머신을 생성합니다..."
az vm create --resource-group $resourceGroup --name $newVmName --attach-os-disk $newDiskName --os-type Linux --public-ip-address "" # パブリックIPなしで作成
echo " - 생성된 VM: $newVmName"
echo -e "
✅ 모든 작업이 성공적으로 완료되었습니다."
###
🔬 スクリプト詳細分析
スクリプトがどのように動作するのか、段階別に詳しく見ていきましょう。
ステップ1:変数設定 ⚙️
スクリプトの上部で、複製する対象VM、リソースグループ、VHDを保存するストレージアカウントなどの基本情報を設定します。スクリプトを複数回実行しても名前が重複しないように、新しく作成するリソース名には`$(date +%s)`を付けて、現在時刻を基準に一意の名前を作成しました。
ステップ2:スナップショット作成 📸
`az vm show`で元のVMのOSディスクIDを取得した後、`az snapshot create`コマンドでディスクの特定時点のコピー、つまりスナップショットを作成します。
ステップ3:SAS URL生成 🔑
`az snapshot grant-access`は本当に重要な役割を果たします。作成されたスナップショットデータにちょうど1時間(3600秒)だけアクセスできる一時的な秘密鍵を含むURL、つまりSAS(共有アクセス署名)URLを作成します。このURLこそが、私たちのデータの「直通チケット」となります。
ステップ4:サーバーサイドコピーと状態確認 ☁️➡️☁️
このスクリプトのハイライトです!`az storage blob copy start`コマンドに、先ほど作成したSAS URLを`–source-uri`として、目標地点であるBlob情報を`–destination-blob`などで伝えます。
コマンドが実行されるとすぐに、Azureはバックグラウンドでコピーを開始します。しかし、コピーが完了するまで待つ必要がありますよね?そこで、`while`ループを使用して`az storage blob show`コマンドで15秒ごとにコピーの状態を確認します。状態が`success`に変わるとループを抜け出し、次のステップに進みます。本当にスマートですよね?
ステップ5〜7:権限解除とリソース作成 🏗️
コピーが完了したので、セキュリティのために`az snapshot revoke-access`でSAS URLを直ちに失効させます。次に、Blobストレージに安全に保存されたVHDファイルのURLをソースとして`az disk create`を実行し、新しい管理ディスクを作成します。最後に、このディスクをOSディスクとして使用して`az vm create`で最終的な複製VMを作成すれば、すべてのプロセスが完了です!
✨ 終わりに
もうVMを複製したりバックアップしたりするたびに、VHDファイルをローカルにダウンロードしてアップロードして時間を無駄にする必要はありません。今日学んだサーバーサイドコピーの方法を活用すれば、Azure CLIスクリプトを一度実行するだけで、すべてのプロセスを迅速かつ安定して自動化できます。
このスクリプトを活用して、あなた自身のVMバックアップシステムを構築したり、開発/テスト環境を迅速に構築したりしてみてはいかがでしょうか?
タグ: Azure, VM, Virtual Machine, Snapshot, Blob, Storage, Azure CLI, Bash, Script, DevOps, IaC, Cloud, IT
コメントを残す