世代管理機能付きAzure BLOB Snapshot取得PowerShellスクリプト

前にこちらの記事で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()
}