Logic AppsからAzure REST APIを使ってAzure Backup 利用後に残った復元ポイント コレクションをまとめて削除できるようにする

前回、Azure Backup 利用後に残った復元ポイント コレクションをAzure REST API経由で削除できるようにしました。

blog.jbs.co.jp

一応これで解決はしたのですが、手動で実施するにはやや大変な数の復元ポイント コレクションが残っています。そこで、Logic AppsからAzure REST APIを使い、削除できない原因であるDisk Restore Pointを取り消す操作を一括で行ってみました。

復元ポイント一覧の準備

色々探したのですが、「復元ポイント一覧」をスムーズに取得する方法が見つかりませんでした。ただ、頻繁に行うものではないのでここは割り切って、かなり力技で取得しました。

まず、復元ポイントコレクションの一覧はAzureポータルから取得可能です。

これをCSVで保存し、加工しました。

このデータを元にPowerShellで復元ポイント情報を取得します。

$restorePointCollections = Import-Csv -Path "C:\Work\AzurerestorePointCollections.csv"
$restorePoints =@()
foreach($restorePointCollection in $restorePointCollections){
$restorePoints += Get-AzRestorePointCollection -ResourceGroupName $restorePointCollection.ResourceGroupName -Name $restorePointCollection.restorePointCollectionName
}
$restorePoints | FT restorePoints

このように復元ポイントが取得できます。

この結果をコピーしてVS Codeに貼り付け、半角スペースなど余計な情報を消します。

これを、先ほどのCSVに追記します。

復元ポイントが複数ある場合、後の処理に響くので、行を分けて整形しておきます。

これをExcelとして保存し、OneDriveなどにおいて、Logic Appsから呼び出せるようにしておきます。

Azure Logic Appsの準備

Logic Appsの作成

作成は特に難しいことはなく、普通にLogic Appsを作成すればOKです。

マネージドIDの有効化

作成したLogic Appsの権限でDisk Restore Pointの取り消しなどをする必要があるので、まずはマネージドIDを有効にします。

カスタムロールの作成

今回のAzure REST APIの実行に必要な権限を持ったカスタムロールを作成します。

jsonはこのようになります。

{
 "properties": {
  "roleName": "{roleName}",
  "description": "",
  "assignableScopes": [
   "/subscriptions/{subscriptionID}"
  ],
  "permissions": [
   {
    "actions": [
     "Microsoft.Compute/restorePointCollections/restorePoints/diskRestorePoints/read",
     "Microsoft.Compute/restorePointCollections/restorePoints/diskRestorePoints/beginGetAccess/action",
     "Microsoft.Compute/restorePointCollections/restorePoints/diskRestorePoints/endGetAccess/action"
    ],
    "notActions": [],
    "dataActions": [],
    "notDataActions": []
   }
  ]
 }
}

リソースグループへの権限設定

復元ポイントコレクションが格納されているリソースグループに対して、先ほど有効にしたマネージドIDに対して、先ほど作成したカスタムロールを設定します。

最終的には、PowerShellスクリプトを用いて対象のリソースグループすべてに同様の設定を行いました*1

$ObjectId = {Logic AppsのObjectId}
$RoleDefinitionName = {先ほど作成したカスタムロールの名前}
$RGs = "{復元ポイントコレクションが保存されているリソースグループの名前1}","{復元ポイントコレクションが保存されているリソースグループの名前2}", "{...}"

foreach($rg in $RGs){
    New-AzRoleAssignment -ObjectId $ObjectId  -RoleDefinitionName $RoleDefinitionName -ResourceGroupName $rg
}

ロジックアプリの動作確認

まずは権限として通るかどうか確認するために、簡単なロジックアプリを作成し、Azure REST APIのURIは固定で入れた状態で実行してみます。

実行すると、無事結果を取得できました。

ロジックアプリの作成

ではここから本格的にロジックアプリを作りこんでいきます。

Disk Restore Pointの名前を取得する

まずは、最初に用意した「復元ポイント一覧」のExcelを読み込み、その値を使ってDisk Restore Pointの名前を取得するようにします。

learn.microsoft.com

Azure REST APIは以下の形式になります。

https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/restorePointCollections/{restorePointCollectionName}/restorePoints/{vmRestorePointName}/diskRestorePoints?api-version=2021-12-01

以下のように対応させます。

Azure REST API Sample 対応
{subscriptionId} (今回は固定。変数で指定)
{resourceGroupName} ExcelのresourceGroupName
{restorePointCollectionName} ExcelのrestorePointCollectionName
{vmRestorePointName} ExcelのRestorePointName

ロジックアプリはこのようになります。

Disk Restore Pointを取り消す

読み取ったDisk Restore Pointの取り消しを行っていきます。

learn.microsoft.com

Azure REST APIは以下の形式になります。

https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/restorePointCollections/{restorePointCollectionName}/restorePoints/{vmRestorePointName}/diskRestorePoints/{diskRestorePointName}/endGetAccess?api-version=2021-12-01

以下のように対応させます。

Azure REST API Sample 対応
{subscriptionId} (今回は固定。変数で指定)
{resourceGroupName} ExcelのresourceGroupName
{restorePointCollectionName} ExcelのrestorePointCollectionName
{vmRestorePointName} ExcelのRestorePointName
{diskRestorePointName} ロジックアプリで読み取ったDisk Restore Pointの名前

ロジックアプリはこのようになります。ロジックアプリで読み取ったDisk Restore Pointの名前は、一度jsonで解析してから利用しています。

ロジックアプリの動作確認

実際に実行してみると、応答コード200が返っています。

処理が終わった復元ポイントコレクションも無事削除できました。

おわりに

あとは、復元ポイントコレクションの入ったリソースグループごとすべて削除して、綺麗な状態に戻りました。

ちなみに、Power AutomateではなくLogic Appsにしたのは、プレミアムのコネクタの問題もありますが、マネージド IDによる認証が利用できた事も大きかったです。Azureの操作に関してはLogic Appsの方が融通が利くと感じました。

前の記事と合わせてかなりニッチな内容だと思いますが、同じように困った方の参考になれば幸いです。

*1:今回のケースではサブスクリプション内に他に復元ポイントコレクションはないので、サブスクリプション単位で権限をつけても良かったですね

執筆担当者プロフィール
舟越 匠

舟越 匠(日本ビジネスシステムズ株式会社)

人材開発部に所属。社内向けの技術研修をしつつ、JBS Tech Blog編集長を兼任。2024年8月からキーマンズネットPower Automateの連載を開始。好きなサービスはPower AutomateやLogic Apps。好きなアーティストはZABADAKとSound Horizon。

担当記事一覧