前にこちらの記事でAzureのBLOBのSnapshotに関して書きました。
【Azure】PowerShellでBLOB上のVHDのSnapshot作成・取得・削除の操作をする - YOMON8.NET
上記の内容を基にざっくりPowerShellスクリプト化してみました。実際にありそうな要件として世代管理機能をつけて、指定した最新の世代数のSnapshotを保持するスクリプトにしてみました。
$StorageAccountName = "Azureストレージアカウント名" $StorageAccountKey = "Azureストレージアクセスキー" $ContainerName = "コンテナ名" $BlobName = "BLOB名" #保持したい世代数 $GenerationNum = 3 function Get-BlobSnapshotListFromContainer { [OutputType([Microsoft.WindowsAzure.Storage.Blob.CloudPageBlob[]])] param ( [Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient] $BlobClient, [String] $ContainerName, [String] $BlobName ) try { [Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer]$container = $BlobClient.GetContainerReference($ContainerName) $blobList = $container.ListBlobs('', $true, [Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails]::Snapshots) $snapshotList = @() foreach($blob in $blobList) { #スナップショットの場合はSnapshotTimeのプロパティに値が設定されています if(($blob.Name -eq $BlobName) -and ($blob.SnapshotTime -ne $null)) { #変数resultsにスナップショットの一覧が格納されます $snapshotList += $blob } } return $snapshotList } catch { throw } } function Create-BlobSnapshot { param ( [Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient] $BlobClient, [String] $ContainerName, [String] $BlobName ) try { $blobUrl = "{0}{1}/{2}" -F $BlobClient.BaseUri,$ContainerName,$BlobName $blob = $client.GetBlobReferenceFromServer($blobUrl) $blob.CreateSnapshot() | Select Name,SnapshotTime } catch { throw } } try { Import-Module Azure $connectionString = "DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}" -F $StorageAccountName,$StorageAccountKey [Microsoft.WindowsAzure.Storage.CloudStorageAccount]$storageAccount = [Microsoft.WindowsAzure.Storage.CloudStorageAccount]::Parse($connectionString) [Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient]$client = $storageAccount.CreateCloudBlobClient() Write-Output "[INFO]新規Snapshot取得" Create-BlobSnapshot -BlobClient $client -ContainerName $ContainerName -BlobName $BlobName Write-Output "[INFO]削除前のSnapshotの一覧 Start ===============" $snapshotListPreDelete = Get-BlobSnapshotListFromContainer -BlobClient $client -ContainerName $ContainerName -BlobName $BlobName $snapshotListPreDelete Write-Output "[INFO]削除前のSnapshotの一覧 End ===============" Write-Output "[INFO]Snapshotの削除実行 最新の[$($GenerationNum)]世代を保持" $snapshotListPreDelete | Sort-Object -Property SnapshotTime -Descending | select -Skip $GenerationNum | foreach{$_.Delete()} Write-Output "[INFO]削除後のSnapshotの一覧 Start ===============" $snapshotListPostDelete = Get-BlobSnapshotListFromContainer -BlobClient $client -ContainerName $ContainerName -BlobName $BlobName $snapshotListPostDelete Write-Output "[INFO]削除後のSnapshotの一覧 End ===============" } catch { Write-Error $error[0].InvocationInfo.PositionMessage Write-Error $error[0].Exception.tostring() }