前提
メンテナンス時など、バックアップを取る際にスナップショットを手動で取得している。
課題
メンテナンスが問題なく完了した後、不必要になったスナップショットの削除を行う運用ルールがなく、スナップショットが残り続け無駄なコストが発生していた。
目的
スナップショット作成から一定期間経過したものは削除する仕組みをAzure Automation Runbookに登録し日次実行する。
以前AWSで作成したもののAzureバージョンを作ってみる。
ソース
# 自動削除するスナップショットの作成日が何日前かを指定する変数を設定
$RetentionPeriodDays = 7
# 削除対象のリソースグループ名を指定
$ResourceGroupName = "TestAD"
# システム割り当てマネージド ID を使用して Azure に接続する
$AzureContext = (Connect-AzAccount -Identity).context
# コンテキストの設定と保存
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
# 保持期間より古いリソース グループ内のすべてのスナップショットを取得する
$OldSnapshots = Get-AzSnapshot -ResourceGroupName $ResourceGroupName | Where-Object { $_.TimeCreated -lt (Get-Date).AddDays(-$RetentionPeriodDays) }
# 保存期間を過ぎた削除対象のスナップショットを削除
foreach ($Snapshot in $OldSnapshots) {
Remove-AzSnapshot -ResourceGroupName $ResourceGroupName -SnapshotName $Snapshot.Name -Force
Write-Output "Deleted snapshot: $($Snapshot.Name)"
}
スケジュール設定
日次実行が行えるよう以下設定を行います。
Automationアカウント > スケジュール > スケジュールの追加 > 以下のように必要情報を入力
Automationアカウント > Runbook > 該当のRunbookを選択 > スケジュールへのリンク > スケジュールをRunbookにリンクします > 事前に作成したスケジュールを選択
上記を実施し、以下のようにリンクされたRunbookに実行対象のRunbookが表示されていれば成功です。
ロールの設定
Automationアカウントに以下ロールを割り当てます。
Automationアカウント > ID > Azureロールの割当 > ロールの割当の追加
├ ディスクスナップショットの共同作成者
└ Automation オペレーター
まとめ
AWSで同様の仕組みを構築した時と比べて、少々癖を感じました。
(慣れもあると思いますが...)
特にロールの設定に関しては、選択肢がかなり多く取捨選択の難しさがありそうです。
そして何より、AWSと比較してブログ記事やQiitaの記事が少なく、ハマった際の調査が難航しました...
個人的な意欲面も含めてやはりAWSの方が好きかなぁと感じた次第です。