如何使用 PowerShell 对 Azure 存储的追加 Blob (Append Blob) 进行读写

众所周知,Azure 存储服务提供了三种类型的 Blob,块 Blob,追加 Blob 和页 Blob(磁盘)。用户需要在创建 Blob 时指定 Blob 类型。一旦 Blob 被创建,其类型不能被改变,并且只能通过使用适合于该 Blob 类型的操作来更新它,即,将块或块列表写入块 Blob,将块追加到追加 Blob,以及将页面写到页 Blob。

块 Blob 是用于存储大量非结构化对象数据(例如文本或二进制数据)的服务;磁盘是作为页 Blob 存储在 Azure 存储中的固定格式 VHD,由虚拟机用来存储持久性数据。 追加 Blob 由块组成,并针对追加操作进行了优化。当您修改追加块时,块仅通过追加块操作添加到块的末尾。与块 Blob 不同,追加 Blob 不支持更新或删除现有的块,且不公开其块 ID。与块 Blob 相同的是,追加 Blob 中的每个块可以是不同的大小,最大为 4MB,最多可以包含 50,000 个块。因此追加 Blob 的最大尺寸略大于 195GB(4MB X 50,000 块)。

追加 Blob 提供了直接将数据写入 Blob 的功能,特别是使用 Azure 自动化 执行脚本产生日志时,可以将内存变量中的日志数据直接写到追加 Blob 中。相比之下,块 Blob 需要生成本地文件后上传至存储,而页 Blob 只能通过 Azure 虚拟机加载后使用,追加 Blob 在此类情景下的优势可见一斑。

在操作追加 Blob 时,我们一般使用 Azure 存储 SDK 来执行,如 .NETNode.js。使用 PowerShell,也可以通过调用.NET 对象的方法来达到相同的效果。

设置存储账号上下文并查找 Blob 容器:

$Resourcegroup = "<yourResourceGroupName>"
$StorageAccountName = "<yourStorageAccountName>"
$StorageAccountKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $Resourcegroup -AccountName $StorageAccountName).Value[0]
$StorageContext = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
$container = Get-AzureStorageContainer -Name $logcontainer -Context $StorageContext

配置追加 Blob reference:

$appBlob = $container.CloudBlobContainer.GetAppendBlobReference("appendlog.log")
if (!$appBlob.Exists()) {
    $appBlob.CreateOrReplace();
}

备注

文件名所对应的文件可以不存在,也可以是已有的追加 Blob 文件。如果是已有的块 Blob 文件或页面 Blob,会出现 Blob 类型错误的报错。

将 String 写入追加 Blob:

$String = "Hello World!"
$appBlob.AppendText([String]::Format("`n{0}",$String))

将字符串数组循环写入追加 Blob,并在不同字符串中插入换行:

$Array = @("Hello World1!", "Hello World2!")
for ($i = 0; $i -lt $array.Count; $i++ ){
    $appBlob.AppendText([String]::Format("`n{0}",$array[$i]))
}

输出追加 Blob 的内容:

$appBlob.DownloadText()

相关参考