はじめに
皆さんはマネージドIDはご存知でしょうか?
詳しくは以下のURLを参考にいただきたいですが、
簡単に申しあげますと
システムや共通のアカウント(のようなモノ)にAzureサブスクリプションの権限を付与して利用できるサービスです。
https://cloudsteady.jp/post/16563/
https://learn.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/overview
今回は具体的にマネージドIDを使ってAzureの作業を実施してみます。
シナリオ
blobストレージのファイルを削除するAutomationアカウントを作成します。
※blobストレージではライフサイクル管理と呼ばれる定期的にファイルを削除してくれる機能がありますが、ページblob等では適用されないため今回のように別途削除用のシステムを構築する必要があります
Automationアカウントの準備
今回はマネージドIDを使用するので、
デプロイ時にシステム割り当てにチェックを入れてデプロイしましょう
続いて、このシステム割り当てマネージドIDにサブスクリプションのロールを付与します。
今回はblobストレージの削除が目的なので、該当のストレージアカウントの
ストレージBLOBデータ共同作成者を割り当てます
割り当ては
以下の画像の通り、アカウント設定>ID
のアクセス許可から設定できます。
マネージドIDの準備ができました
続いて実際に削除するための設定を実施します。
今回はPowerShellスクリプトを使用するため、
Runbookの種類はPowershellにして作成します
Add-AzAccount -identity
$deletedays = 3
$ctx = New-AzStorageContext -StorageAccountName "<ストレージアカウント名>" -UseConnectedAccount
$containers = Get-AzStorageContainer -Context $ctx
Foreach ($container in $containers) {
$blobfiles = Get-AzStorageBlob -Name $container.name -Context $ctx
Foreach ($blobfile in $blobfiles) {
$blobfilename = $blobfile.name
if($blobfilename.indexof("/") -ne -1) {
$date=$blobfilename.substring(0,$blobfilename.indexof("/"))
$datetime = [DateTime]::ParseExact($date, "yyyyMMdd", $null)
$days=New-TimeSpan $datetime (GET-Date)
if($days.days -ge $deletedays){
$blobfilename
Remove-AzStorageBlob -Container $container.name -Blob $blobfilename -Context $ctx
}
}
}
}
上記のスクリプトはblobストレージのコンテナー配下に日付が切れられているフォルダを消していく動作となります($deletedaysの日数分前のフォルダを削除します)
例えば 実施日が2022年の11月30日で
・XXXXX/20221110/XXXX.txt
・XXXXX/20221130/XXXX.txt
といったファイルが保存されている場合
・XXXXX/20221110/XXXX.txt
が削除されます
また、今回マネージドIDを使用するのに当たり肝になるのが、冒頭の
Add-AzAccount -identity
です
こちらを記載することで、実施するマシン(この場合Automationアカウント)のマネージドIDを使用することができます。
実行する
テストを実施するため、ストレージアカウントのコンテナーに
以下のようにフォルダを切ってファイルを格納しました
それでは実施します
まとめ
マネージドIDを使ってPowerShellのスクリプトを実行しました。
Automationアカウントではスケジュールを組むことで、定期実行が可能です。
今回のようなスクリプトを時間指定で定期実行することでファイルの整理を行うことができます
また、今回作成したスクリプトは、イベントログなどのページブログで保存されてしまうファイルには有用ですので是非作成してみてください。
おまけ
マネージドIDに権限を付与していない場合以下のようなエラーが出ます