ASR の フェールオーバー を Azure CLI で実行するときの引数について

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！


## モチベ
Azure Site Recovery をAzure CLI で実行するときの引数が初見殺しでややこしいなーと思ったので、誰かの役に立てばと思いメモしておきます。

## 具体的にどれ？
例えば以下のフェールオーバを実行コマンドの引数です。 

```Azure:Azure CLI 
    az site-recovery protected-item unplanned-failover
```
https://learn.microsoft.com/ja-jp/cli/azure/site-recovery/protected-item?view=azure-cli-latest#az-site-recovery-protected-item-unplanned-failover


引数は以下があります。
説明は MS Learn からの引用です

--fabric-name
一意のファブリック名。

--failover-direction
フェールオーバーの方向。

--ids
1 つまたは複数のリソース ID (スペース区切り)。 これは、'Resource Id' 引数のすべての情報を含む完全なリソース ID である必要があります。 --ids または他の 'Resource Id' 引数を指定する必要があります。

> --name --replicated-protected-item-name -n
レプリケーションで保護された項目名。
> 
> --no-wait
実行時間の長い操作の終了を待機しません。
承認された値: 0, 1, f, false, n, no, t, true, y, yes
> 
> --protection-container --protection-container-name
保護コンテナー名。
> 
> --provider-details --provider-specific-details
プロバイダー固有の設定。 短縮構文、json-file、yaml-file をサポートします。 詳細を表示するには、"??" を試してください。
> 
> --resource-group -g
リソース グループの名前。 az configure --defaults group=<name> を使用して、既定のグループを構成できます。
> 
> --source-site-operations
ソース サイトの操作の状態。
> 
> --subscription
サブスクリプションの名前または ID。 az account set -s NAME_OR_ID を使用して、既定のサブスクリプションを構成できます。
> 
> --vault-name
Recovery Services コンテナーの名前。


また以下は　MS Learn に記載のある A2A (Azure 環境同士のDR構成) 時のコマンド例です。
```
az site-recovery protected-item unplanned-failover 
 --fabric-name fabric1_name  
 --protection-container container1_name  
 --replicated-protected-item-name protected_item_name -g rg  
 --vault-name vault_name  
 --failover-direction PrimaryToRecovery  
 --provider-details '{a2a:{}}'  
 --source-site-operations NotRequired
```

パッとみわかりそうなものもありますが、MS Learn の説明や例コマンドを読んでもわかりにくいものもあります。

具体的には以下です。結構初見殺しだと思います。
* --name / --replicated-protected-item-name / -n
　**レプリケーションを構成しているAzure VM の名前かと思いきや、<font color="red">そうではありません。**
* --protection-container --protection-container-name
 **Recovery Services コンテナー名かと思いきや、そうではありません。別にRecovery Services コンテナーの名前を指定する引数 --vault-name があります。**
* --fabric-name
 **<font color="red">ファブリックネームって何ですの**

## これらの引数の確認方法
実際にAzure Portal やAzure CLI で確認してみましょう。

### Azure Portal 
DR を構成している Recovery Services コンテナー からかきのように遷移してリソース ID をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4caff23c-9f7f-4dad-c952-69598b70e688.png)


以下がその内容です。Subscription ID は 伏字にしています

    /Subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX83/resourceGroups/Site-Recovery-vault-australiaeast/providers/Microsoft.RecoveryServices/vaults/Site-recovery-vault-australiaeast/replicationFabrics/asr-a2a-default-eastasia/replicationProtectionContainers/asr-a2a-default-eastasia-container/replicationProtectedItems/fec4de0b-c810-50c5-8483-a4dcbbb762c2

見やすく改行します
+ /Subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX83
+ /resourceGroups/Site-Recovery-vault-australiaeast
+ /providers/Microsoft.RecoveryServices
+ /vaults/Site-recovery-vault-australiaeast
+ /replicationFabrics/asr-a2a-default-eastasia
+ /replicationProtectionContainers/asr-a2a-default-eastasia-container
+ /replicationProtectedItems/fec4de0b-c810-50c5-8483-a4dcbbb762c2

上記を見ればわかるかと思います。
引数との対応を表にしたものが以下です。

|引数|項目名|値(上記の例の場合)|
|:-|:-|:-|
--resource-group|リソースグループ|Site-Recovery-vault-australiaeast|
-- vault-name|Recovery Services コンテナー名|Site-recovery-vault-australiaeast|
--fabric-name|ファブリック名|asr-a2a-default-eastasia|
--protection-container |プロテクションコンテナー名|asr-a2a-default-eastasia-container|
--name |保護対象のVMを指し示す値 (VM 名ではない)|fec4de0b-c810-50c5-8483-a4dcbbb762c2|

### Azure CLI
続いて Azure CLI で--fabric-name、--protection-container、--name の値を取得します。
リソースグループ名 (Site-Recovery-vault-australiaeast)、Recovery Services コンテナー名 (Site-recovery-vault-australiaeast) を引数に取ることで可能です。

+ -fabric-name
```Azure CLI : --fabric-name を取得
az site-recovery fabric list --resource-group '<リソース グループ名>' --vault-name '<Recovery Services コンテナー名>' --output table
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d4ce7318-5a67-239b-befa-c1c832785a0b.png)

これで --fabric-name が取得できました。
**asr-a2a-default-eastasia** が  --fabric-name です。


+ --protection-container
**さきほど取得した --fabric-name も利用して取得します。**

```Azure CLI : --protection-container を取得
az site-recovery protection-container list --fabric-name '<ファブリック名>' --resource-group '<リソース グループ名>' --vault-name '<Recovery Services コンテナー名>' --output table
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1a4077b9-31d4-c6c8-02e0-23e5a0079b5b.png)

**asr-a2a-default-eastasia-container** が --protection-container です。

+ --name / --replicated-protected-item-name / -n
**さきほど取得した --fabric-name に加えて、--protection-container も利用して取得します。**

```Azure CLI : --name / --replicated-protected-item-name / -n を取得
az site-recovery protected-item list --fabric-name '<ファブリック名>' --protection-container '<保護コンテナー名>' --resource-group '<リソース グループ名>' --vault-name '<Recovery Services コンテナー名>'  --query "[].{FriendlyName:properties.friendlyName,Name:name}" --output table
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e0ff209d-8e09-9b68-bf01-62cc4829e103.png)


**fec4de0b-c810-50c5-8483-a4dcbbb762c2** が --name です。
また **FriendlyName** の **VM-asr-origin** が、保護対象の アイテム名 (Azure VM 名) です。

## まとめ


:::note info
Azure CLI で ASR を操作するときに以下の引数に注意。

* --name / --replicated-protected-item-name / -n
　**レプリケーションを構成しているAzure VM の名前かと思いきやそうではありません。**
* --protection-container --protection-container-name
 **Recovery Services コンテナー名かと思いきや、そうではありません。**
* --fabric-name
 **ファブリックネーム**

Azure Portal でも確認できるし、Azure CLI でも対象の Recovery Services コンテナーのリソースグループとRecovery Services コンテナー名が分かれば取得することが可能❣
:::

## おまけ Azure CLI でフェールオーバーした際の画面ショット
以下のように正常にコマンドは実行されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6969e098-25cc-f9e0-ad51-a0466a057504.png)

:::note
フェールオーバー実施後に得られる name 値 
今回の場合、ba10407f-2909-4013-8064-a449b3bbebfa は Job 識別子と呼ばれるものです。

Azure CLI (Az site-recovery job show コマンド) で以下のように使うことができます。

```Azure CLI : Az site-recovery job show コマンド例
az site-recovery job show  -g Site-Recovery-vault-australiaeast --vault-name Site-Recovery-vault-australiaeast --job-name ba10407f-2909-4013-8064-a449b3bbebfa
```

![2024-04-18_20h34_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d85eb840-77b2-a0ab-b6e3-0bcd456395e0.png)

参考) az site-recovery job
https://learn.microsoft.com/ja-jp/cli/azure/site-recovery/job?view=azure-cli-latest

:::


## 参考

https://learn.microsoft.com/ja-jp/azure/site-recovery/site-recovery-overview