Azure リソースのサブスクリプション間移行可否を一括チェックするスクリプトを作成してみた

Azure リソースのサブスクリプション間移行可否を一括チェックするスクリプトを作成してみた

Clock Icon2025.04.16

いわさです。

Microsoft Azure のテナントやサブスクリプションを運用していると、リソースを別のリージョンやサブスクリプション、リソースグループへ移行したくなる場合があります。
このリソースの移行ですが、リソースの種別によってサポートされる移行タイプが異なっており、実際の環境のリソースひとつひとつのチェックが必要です。
全般的にテナント間の移行はサポートされていないのですが、リソースグループとサブスクリプションの移行は多くのリソースタイプでサポートされています。リージョンの移行はほとんどのリソースタイプでサポートされていません。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/move-support-resources

今回、あるサブスクリプションのリソース一式を別のサブスクリプションへどの程度移行できそうなのか調査する機会がありました。
上記ドキュメントで Azure リソースタイプごとの移行可否が示されているのですが、ドキュメントの一番最後に CSV ファイルが提供されていることに気が付きました。

この CSV ファイルを活用することである程度調査の自動化ができるのではないかということでやってみました。

スクリプト

本記事の検証環境は Apple M1 Max の macOS Sonoma 14.6.1 です。
bash スクリプトの中で、Azure リソースの取得、上記移行可否マスタデータの取得、リソースごとの判定を行ってみました。
相棒(生成 AI)と一緒に試行錯誤しながら作ったので、もうちょっとこうしたらいいんじゃない?みたいなのあるかもしれませんが、一応動いていそうです。

以下が作成したスクリプトとなります。リソースの取得にはaz resource listを使いました。

#!/bin/bash
echo "Azureにサインインします..."
az login

# 現在のサブスクリプション情報を表示
subscription_name=$(az account show --query name -o tsv)
subscription_id=$(az account show --query id -o tsv)
echo "現在のサブスクリプション: $subscription_name ($subscription_id)"

# リソース一覧をJSON形式で出力
echo "リソース一覧を取得しています..."
az resource list --output json > resources.json

# 移行マスタをダウンロード
echo "移行マスタデータをダウンロードしています..."
curl -s https://raw.githubusercontent.com/tfitzmac/resource-capabilities/refs/heads/main/move-support-resources.csv > move-support.csv

# マスタデータを一時ファイルに変換(検索用)
grep -v "^Resource," move-support.csv | while IFS=, read -r type move_rg move_sub; do
    echo "$type|$(echo "$move_sub" | tr -d '\r')"
done > move-support-processed.txt

echo "リソースグループ,リソース名,リソースタイプ,移行可否" > migration_results.csv
total=$(jq -r '.[] | [.resourceGroup, .name, .type] | @csv' resources.json | wc -l)
current=0
show_progress() {
    local current=$1
    local total=$2
    local percentage=$((current * 100 / total))

    printf "\r進捗状況: %3d%% (%d/%d)" "$percentage" "$current" "$total"
}

echo "リソースの移行可能性を分析しています..."
jq -r '.[] | [.resourceGroup, .name, .type] | @csv' resources.json | \
while IFS=, read -r group name type; do
    group=$(echo $group | tr -d '"')
    name=$(echo $name | tr -d '"')
    type=$(echo $type | tr -d '"')
    result=$(grep -i "^${type}|" move-support-processed.txt | head -n 1)
    if [ -n "$result" ]; then
        move_sub=$(echo "$result" | cut -d'|' -f2 | tr -d '\n\r ')        
        if [ "$move_sub" = "1" ]; then
            status="可能"
        else
            status="不可"
        fi
    else
        status="不明"
    fi
    echo "\"$group\",\"$name\",\"$type\",\"$status\""
    current=$((current + 1))
    show_progress $current $total >&2

done | sort >> migration_results.csv
echo -e "\n" >&2

rm move-support-processed.txt

# コンソールに結果サマリーを表示
total_resources=$(grep -c "," migration_results.csv)
total_resources=$((total_resources - 1))
movable=$(grep -c "\"可能\"" migration_results.csv)
unmovable=$(grep -c "\"不可\"" migration_results.csv)
unknown=$(grep -c "\"不明\"" migration_results.csv)
echo "=== 移行可否分析の結果 ==="
echo "総リソース数: $total_resources"
echo "├─ 移行可能: $movable"
echo "├─ 移行不可: $unmovable"
echo "└─ 状態不明: $unknown"
echo ""
echo "詳細な分析結果は migration_results.csv に保存されました"

使い方

上記スクリプトをカレントディレクトリに保存し、実行します。
まず Azure へのサインインが必要になるので、対象サブスクリプションの全リソースの取得ができるロールでサインインしましょう。

% ./hoge.sh
Azureにサインインします...
A web browser has been opened at https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.

ブラウザでの Azure ポータルへの認証が必要になります。

4FE26E70-A911-4C07-B279-A3DDDB0221BB.png

サインインに成功すると次のように表示されるのでコンソールに戻りましょう。

3EF61E8C-1702-4A07-B4DF-AC33E2D997F3_4_5005_c.jpeg

そうすると調査対象のサブスクリプションを選択します。
このスクリプトは移行元サブスクリプションのリソースが同一テナントのサブスクリプションへ移行できそうな調べるものになります。なのでここで選択するのは移行元のサブスクリプションです。

Retrieving tenants and subscriptions for the selection...

[Tenant and subscription selection]

No     Subscription name    Subscription ID                       Tenant
-----  -------------------  ------------------------------------  ---------
[1] *  hoge subscription    12a34b56-78c9-4d0e-a1b2-c3d4e5f67890  既定のディレクトリ
[2]    piyo subscription    98f76e54-d3c2-1b0a-9876-543210fedcba  既定のディレクトリ

The default is marked with an *; the default tenant is '既定のディレクトリ' and subscription is 'hoge subscription' (12a34b56-78c9-4d0e-a1b2-c3d4e5f67890).

Select a subscription and tenant (Type a number or Enter for no changes): 

サブスクリプションを選択すると、すぐに分析が開始されます。

Tenant: 既定のディレクトリ
Subscription: hoge subscription (12a34b56-78c9-4d0e-a1b2-c3d4e5f67890)

[Announcements]
With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236

If you encounter any problem, please open an issue at https://aka.ms/azclibug

[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.

現在のサブスクリプション: hoge subscription (12a34b56-78c9-4d0e-a1b2-c3d4e5f67890)
リソース一覧を取得しています...
移行マスタデータをダウンロードしています...
リソースの移行可能性を分析しています...
進捗状況: 100% (51/51)

=== 移行可否分析の結果 ===
総リソース数: 51
├─ 移行可能: 36
├─ 移行不可: 12
└─ 状態不明: 3

詳細な分析結果は migration_results.csv に保存されました

コンソール上は分析結果のサマリだけ表示するようにしています。
リソースごとの移行可否は出力結果ファイルを確認する必要があります。
形式はなんでも良かったのですが CSV ファイルを出力するようにしてみました。

移行可否の列を見てください。可能・不可の判定がされています。

4322DD0D-9653-4508-ACCA-387AF5F83F1F.png

内容としては冒頭のドキュメントのサブスクリプション移行可否に従ったものになっています。
例えば仮想マシンであればスクリプトで移行可能と判定されていまして、ドキュメント上も次のように移行できる旨が記載されています。

8B41C62D-CC93-4628-8596-EC1C49326DCE.png

一方で移行できないリソースについても同じように検出されていました。
代表的なところだとマネージド ID や Network Watcher ですね。先日ブログを書いた ISV for Datadog も移行対象外でした。なるほどね。

FD2A94DD-790E-4C5E-B1E4-2A02D991A720_4_5005_c.jpeg

また、ドキュメントや CSV マスタデータ上存在しないものは判定できていません。
私の環境だと、Microsoft.Communication/EmailServices関係はドキュメント上確認できないリソースでした。ちなみに Azure のリソース移行ツールで検証してみると、サブスクリプション移行ができないリソースタイプでした。このあたりの検証ツールの使い方は別途紹介します。

E4C6A5CB-B215-4387-954B-807EB49FAC3B

さいごに

本日は Azure リソースのサブスクリプション間移行可否を一括チェックするスクリプトを作成してみたのでスクリプトや使い方を紹介しました。

このスクリプトはあくまでも公式のドキュメントにて引用されている移行可否 CSV データを使った判定となります。
移行可能とされたものもドキュメント上は条件付きのものなどもありますので、完全な分析結果ではないことに注意しましょう。
実際に Azure ポータルからリソース移動を行おうとすると、このスクリプトで移行 OK と判定されたものも色々な前提条件によって検証 NG になるものがまぁまぁあります。
とはいえこのスクリプトでだいたいの移行可否の規模を把握することができると思います。

実際の移行操作は次のドキュメントを使って移行していくのですが、それも試したので次回のブログで書きたいと思います。
結論としては単独リソースグループの移行チェックのみであれば Azure リソースグループ上移動ツールで検証したほうが早いし正確です。ただ、リソースグループが多くてサブスクリプション全体の移行可否をざっくり判定したいのであれば今回の方法が使えると思います。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/move-resource-group-and-subscription?tabs=azure-cli

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.