Azure Automation Runbookで毎日自動的にすべてのリソースを削除する

この記事の内容

  • Azure Automation Runbookを使い、検証用サブスクリプション内のリソースを毎日自動削除する仕組みを構築します
  • システム割り当てマネージドIDを活用し、パスワード不要でリソース操作を実現します
  • 削除ロックを設定することで、消したくないリソースグループを保護できます
  • PowerShell 7.2ベースのRunbookを実装し、非同期削除と進捗出力を組み合わせます
  • スケジュール実行により、毎日深夜に自動クリーンアップが走る運用を実現します

背景と課題:消し忘れによる余計な課金を防ぎたい

検証用のAzureサブスクリプションを長期間運用していると、「作ったまま消し忘れたリソースがいつの間にか課金されていた」という経験をされた方は多いのではないでしょうか。

今回は、Azure MVPサブスクリプション(2026年8月9日まで有効)を検証環境として活用するにあたり、毎日リソースを全削除する自動化の仕組みを構築しました。消したくないリソースには削除ロックをかけて保護しつつ、それ以外はすべて自動クリーンアップするというシンプルかつ強力な設計です。


全体の設計方針

設計のポイントは以下の通りです。

  • サブスクリプション内のリソースグループを毎日自動削除する
  • 残したいリソースグループには 削除ロック(ReadOnly) を設定して保護する
  • Azure Automation アカウントに システム割り当てマネージドID を使わせ、パスワードレスで認証する
  • スケジュール実行(毎日深夜3時)でランブックを定期起動する

ステップ1:削除ロックで保護するリソースグループを準備する

まず、残したいリソースグループに対して削除ロックを設定します。Azureポータルから対象のリソースグループを開き、「ロック」から新しいロックを追加します。

項目設定値の例
ロック名gj利用 (任意の名前でOK)
ロックの種類削除(ReadOnly)

このロックが設定されているリソースグループは、後述のRunbookからも削除されません。


ステップ2:Azure Automationアカウントを作成する

対象のサブスクリプション(今回は「ジルMVP」サブスクリプション)内に、Azure Automationアカウントを新規作成します。

作成時の設定

  • リソースグループ:新規作成(例:Automation
  • マネージドID:システム割り当てマネージドIDを有効化
  • ネットワーク:公開アクセス(インターネット経由)

マネージドIDを有効化することで、このAutomationアカウントはAzure AD上の「サービスプリンシパル」として扱われ、明示的なパスワードや資格情報なしに他のリソースを操作できるようになります。


ステップ3:マネージドIDに権限を付与する

AutomationアカウントのマネージドIDに対し、サブスクリプション単位で「共同作成者」ロールを割り当てます。

Azureポータルでの操作手順:

  1. 対象のサブスクリプションを開く
  2. 「アクセス制御(IAM)」→「ロールの割り当ての追加」を選択
  3. ロール:共同作成者
  4. アクセスの割り当て先:マネージドID
  5. 対象のAutomationアカウントのマネージドIDを選択して保存

これにより、RunbookがマネージドID認証でサブスクリプション内のリソースグループを削除できるようになります。


ステップ4:PowerShell Runbookを作成する

Automationアカウント内で、PowerShellベースのRunbookを新規作成します。

Runbookの基本情報

項目設定値
名前DeleteAll(任意)
Runbookの種類PowerShell
ランタイム環境PowerShell 7.2

スクリプトの要件

今回のスクリプトはChatGPTなどのAIツールを活用して生成しました。実装すべき要件は以下の通りです。

  • マネージドID認証でAzureにログインする
  • サブスクリプションIDを指定してコンテキストを設定する
  • 全リソースグループを取得し、削除ロックが設定されているものはスキップする
  • 各リソースグループを非同期で削除する
  • 削除の進捗状況を出力する
  • タイムアウト(最大5分)を設定し、無限ループを防止する

実装時の注意点

Automation Runbook内でコンソール出力を行う際は、Write-Output を使用してください。Write-Host はAutomation Runbookのジョブ出力に反映されないため注意が必要です。

# 例:進捗状況の出力
Write-Output "リソースグループ '$rgName' の削除を開始します..."
Write-Output "リソースグループ '$rgName' の削除が完了しました。"

# NG: Write-HostはRunbookのジョブ出力に表示されない
# Write-Host "削除完了"

ステップ5:テスト実行で動作を確認する

Runbookを本番スケジュールに組み込む前に、テスト実行で動作を確認します。

テスト用に3つのリソースグループを準備しました。

  • 1つ:削除ロックあり(保護対象)
  • 2つ:削除ロックなし(削除対象)

テスト実行の結果、削除ロックが設定されたリソースグループは残り、それ以外の2つは正常に削除されました。ジョブの出力にはWrite-Outputによる進捗メッセージが表示され、成功/失敗のステータスも確認できました。


ステップ6:スケジュール実行を設定する

Runbookの動作確認ができたら、「公開」してからスケジュールを設定します。

スケジュール設定の内容

項目設定値
開始時刻毎日 3:00 AM
タイムゾーン日本標準時(JST)
繰り返し1日ごと
有効期限設定なし(無期限)

スケジュール設定後は、Runbookとスケジュールをリンクします。これにより、毎日深夜3時に自動でRunbookが起動し、サブスクリプション内のリソースがクリーンアップされます。


まとめ

今回の構成を整理すると、以下のコンポーネントの組み合わせで「毎日自動リソース削除」を実現できました。

コンポーネント役割
Azure Automation アカウントRunbookのホスト環境
システム割り当てマネージドIDパスワードレス認証
共同作成者ロール(サブスクリプション単位)リソース削除の権限
PowerShell 7.2 Runbook削除ロジックの実装
スケジュール実行毎日深夜3時の定期起動
削除ロック(ReadOnly)残したいリソースの保護

検証用や使い捨てのサブスクリプション運用において、消し忘れによる余分な課金を防ぐ強力な手段となります。マネージドIDを活用することで資格情報の管理も不要になり、セキュアかつシンプルな自動化が実現できます。削除ロックとの組み合わせで柔軟な保護設定も可能ですので、ぜひ自身の環境に合わせて試してみてください。