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ポータルでの操作手順:
- 対象のサブスクリプションを開く
- 「アクセス制御(IAM)」→「ロールの割り当ての追加」を選択
- ロール:共同作成者
- アクセスの割り当て先:マネージドID
- 対象の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を活用することで資格情報の管理も不要になり、セキュアかつシンプルな自動化が実現できます。削除ロックとの組み合わせで柔軟な保護設定も可能ですので、ぜひ自身の環境に合わせて試してみてください。