Azcopy で SAS を使って Azure VM を別テナントに複製する

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問は是非お願いします🥺！
間違ってたら優しく教えてください！

以前 Azure Compute Galleryを使って別テナントにAzure VM を複製する方法を書きました。

https://qiita.com/aktsmm/items/de7bcf68f7f2c0b8beb6

今回は Azcopy を使って別テナントに Azure VM を複製する方法を紹介します。
***一部 SAS (Shared Access Signature) の情報やSubscription IDなどはモザイクかけたり、文字を"X"に置き換えて記載しています。**

:::note
2024/03/06(水) : 追記
本記事の内容だと、8TiB 以上のマネージドディスクのコピーはできないのでその場合に方法を下記記事に記載しています。
https://qiita.com/aktsmm/items/ad416cbeab3be6adb5cc
:::


# おおまかな流れ
おおまかな流れとしては下記の 1 ~ 5 です。
本記事では 2 ~ 4 の部分にフォーカスして紹介します。

1.ソーステナントの対象 VM のディスクのスナップショットを取る
**フルスナップショットで取得してください。**
手順は下記の記事を参考にしてください。

https://qiita.com/aktsmm/items/7d49a393571bdf8eabb0


2.ソーステナントにある 1.で作ったスナップショットからエクスポート / SAS を発行する

3.ターゲットテナントのストレージ アカウント(コンテナー) のSAS を発行する

4.Azcopy でソーステナントからターゲットテナントスナップショットをコピー(VHD化)する

5.コピーされた VHD から Azure VM を作成
具体的な手順は下記の記事をご覧ください

https://qiita.com/aktsmm/items/f1e8a9ee8f7ba63ecddd

# 具体的な手順

■環境ざっくり情報■
ソーステナント側
Azure VM があって、そのディスクの<font color="red">フルスナップショット</font>があります。
フルスナップショットの名前は **Snapshot-VM-origin-full**

ターゲットテナント側
ストレージ アカウントがあってその中に **movedvhd** というコンテナーがあります。

## 1. ソーステナントの対象 VM のディスクのスナップショットを取る
**<font color="red">フルスナップショット</font>で取得してください。**
(追記：増分スナップショットでも可能だという声も聞きましたが、未検証です)
手順は下記の記事を参考にしてください。

https://qiita.com/aktsmm/items/7d49a393571bdf8eabb0

## 2. ソーステナントにある 1.で作ったスナップショットからエクスポート / SASを発行する
SAS URL の有効な期間は適宜環境に合わせて設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2d2aa14b-8288-3fe1-3a4e-2f9bd47e4a92.png)

![2023-12-27_15h51_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7f47c431-952e-585c-2eb3-0fd02de785ce.png)


ソース SAS をメモしておきます。
```
ソースSAS：https://md-n01chXXXXXXt.z14.blob.storage.azure.net/ltmj2bpl4m0m/abcd?sv=20XX-03-28&sr=b&si=f2bb0XXe-0XXX-43c5-99f1-e7XXXXXXXd1e&sig=NmDHMPGtCT6XXXXXjHBEzdnFAXXXXXXXXXXXXXXXXXXiw%3D
```



## 3. ターゲットテナントのストレージ アカウント(コンテナー) のSAS を発行する
ストレージ アカウントがない場合はストレージ アカウントを作成し、コンテナーの作成をしてください。
ここではすでにストレージ アカウントとコンテナーを作成している前提です。
今回はコンテナー名は **movedvhd** で作成しています。

対象のストレージ アカウント → コンテナー → 対象のコンテナー(今回は movedvhd) → 左ペインの「共有アクセストークン」から下記のように SAS を発行します。
**権限は「読み取り」「追加」「作成」「書き込み」** を設定して発行します。
有効時間は適宜適切に設定してください。

![2023-12-27_15h53_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f5ec3fae-b601-4533-6f4f-9bbcfc92326d.png)

[BLOB SAS URL] から ターゲット SASの元 をメモしておきます。
```
ターゲットSASの元[BLOB SAS URL] ：https://rXXXXsXXXg.blob.core.windows.net/movedvhd?sp=racw&st=2023-XX-27T05:21:48Z&XX=XXXX-01-30T13:21:48Z&spr=htXXX&sv=XXXX-11-02&sr=c&sig=EUzXXXXXXXXXXXXXXXXivkHdvFvWpNukArUklcOLJls%3D
```

今回 **movedvhd**　コンテナー → の下に**full.vhd**という名前で VHDをコピーします。
そのため、<font color="red">"ターゲットSASの元" の "movedvhd" を "movedvhd/fulltest.vhd" に置き換えます。</font>
そうしてできた**ターゲット SAS** が以下です。

```
ターゲットSAS：https://rXXXXsXXXg.blob.core.windows.net/movedvhd/fulltest.vhd?sp=racw&st=2023-XX-27T05:21:48Z&XX=XXXX-01-30T13:21:48Z&spr=htXXX&sv=XXXX-11-02&sr=c&sig=EUzXXXXXXXXXXXXXXXXivkHdvFvWpNukArUklcOLJls%3D
```

## 4. Azcopy でソーステナントからターゲットテナントスナップショットをコピー(VHD化)する
下記のコマンドで実行します。 
なお、Azcopy はあらかじめインストールしパスを通しています。

::: note warn
2024/01/11(木) 追記:
コマンドの実行環境として Azure Portal (Azure Portal から実施できるコマンドライン機能)で Azcopy の場合に失敗する例を聞いております。
+ Cloud Shell で試してエラーがでてダメだった場合、一度クライアントPCにインストールした最新の Azcopy を使ってみてください。
+ また逆にクライアント OS にインストールした Azcopy でうまくいかない場合は、Cloud Shell で実施して改善するかご確認ください。
:::

```
azcopy copy ‘<ソース SAS>’ ‘<ターゲットSAS>’
```

今回の例に倣えば下記のようになります。
```
azcopy copy ‘https://md-n01chXXXXXXt.z14.blob.storage.azure.net/ltmj2bpl4m0m/abcd?sv=20XX-03-28&sr=b&si=f2bb0XXe-0XXX-43c5-99f1-e7XXXXXXXd1e&sig=NmDHMPGtCT6XXXXXjHBEzdnFAXXXXXXXXXXXXXXXXXXiw%3D’ ‘https://rXXXXsXXXg.blob.core.windows.net/movedvhd/fulltest.vhd?sp=racw&st=2023-XX-27T05:21:48Z&XX=XXXX-01-30T13:21:48Z&spr=htXXX&sv=XXXX-11-02&sr=c&sig=EUzXXXXXXXXXXXXXXXXivkHdvFvWpNukArUklcOLJls%3D’
```

実行中のイメージ
![2023-12-27_16h26_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/cbb3aef0-23a6-ffb6-50af-ae94483dafe1.png)

実行完了

![2023-12-27_16h29_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5c90b6cd-be2b-5a36-f8f1-e09fd004571b.png)

ターゲットテナントのストレージ アカウント内に想定した VHD ができている事を確認
![2023-12-27_16h29_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a3ad23de-6ff8-a0c2-9a05-056b4d6d7cc0.png)


## 5. コピーされた VHD から Azure VM を作成
具体的な手順は下記の記事をご覧ください.

https://qiita.com/aktsmm/items/f1e8a9ee8f7ba63ecddd

無事テナントをまたいだ Azure VM の複製ができました！✨


もちろんテナントを跨がない場合でも使えますが、同一テナントの場合や同一Subscriptionの場合はもっと簡単な方法があるかと思います。

# 他のテナントをまたいだAzure VM の複製方法

その他の方法としては以前下記の記事を書きました。

https://qiita.com/aktsmm/items/de7bcf68f7f2c0b8beb6


# Azure Compute Gallery を使う場合に対するメリット
今回の方法では SAS さえ発行してしまえば Azure 権限が不要、 Azure にログインする必要がないことです。別途 Azcopy をインストールする必要はあります。



# Azcopy について(補足)
Azcopy のダウンロード先

https://learn.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-v10#download-azcopy


また、今回はパスを通していましたが、パスを通していない場合はazcopy の exe ファイルがある場所に移動して azcopy を実行してください
参考までに、[こちらの記事](https://qiita.com/mikanchaaan/items/10731e0af7ecef7a2cdc#azcopy%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E6%BA%96%E5%82%99)はパスを通さないで実行されてます。

また、パスを通しの例。
パスを通すことでどの場所からでも今回のようなコマンドで Azcopy を実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f2cc81ea-216d-be24-392c-6685cd2756ca.png)



# 参考
+ ストレージ アカウント のページ　BLOB の制限について
> Azure でサポートされている最大ページ BLOB サイズは、8 TB (8,191 GiB) です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/9febf7d9-ebe7-c358-d519-84d3086d94a2.png)

https://learn.microsoft.com/ja-jp/azure/virtual-machines/faq-for-disks?tabs=azure-portal#---------------blob--------------