azure - 通过 Powershell 读取 Azure Blob

标签 azure powershell azure-blob-storage azure-data-lake azure-cli

Azure Blob 存储中存储了一些文件。我想在最新文件中搜索一个字符串,并稍后通过 Powershell 使用该字符串。问题是 - 我无法直接读取或搜索字符串,我必须先通过 Get-AzStorageBlobContent 下载它。我想避免下载文件。我想直接搜索一个字符串。

$storageAccountName = "resaibdplogsa2prod"
$container_name = "devops-tasks"
$context = New-AzStorageContext -StorageAccountName $storageAccountName -UseConnectedAccount
$blobs = Get-AzStorageBlob -Container $container_name -Context $context | sort @{Expression = "LastModified";Descending=$true}
$latestBlob = $blobs[0]
$getString_terraform = Select-String -Path $latestBlob -Pattern '_tool/terraform.*'

最后一行给了我一个明显的错误 ' 找不到路径 'C:\Users\jubaiaral\Microsoft.WindowsAzure.Commands.Common.Storage.ResourceModel.AzureStorageBlob',因为它不存在。 '

最佳答案

我不确定使用 Az PowerShell 模块是否可以实现您想要实现的目标。

根据@guiwhatsthat关于使用Select-String的注释,您可以使用REST API。从技术上讲,它还下载 blob(但不存储在文件中) - 这是一个示例。

身份验证部分

这使用基于 applicationId/secret 的身份验证。相应的服务主体至少需要分配Storage Blob Data Reader角色。

$requestMethod  = 'POST'
$requestHeaders = @{
    'Content-Type'  = 'application/x-www-form-urlencoded'
}
$requestUri     = 'https://login.microsoftonline.com/'+$tenantId+'/oauth2/v2.0/token'
$requestBody    = @{
    client_id       = $applicationId
    grant_type      = 'client_credentials'
    client_secret   = $applicationSecret
    scope           = $storageAccountBlobEndpoint+'.default'
}

$request = Invoke-RestMethod -Method $requestMethod `
                             -Headers $requestHeaders `
                             -Uri $requestUri `
                             -Body $requestBody

读取 Blob 并搜索字符串

$blobRequestMethod  = 'GET'
$blobRequestHeaders = @{
    'Content-Type'  = 'application/xml'
    Authorization   = $($request.token_type + ' ' + $request.access_token)
    'x-ms-date'     = $(Get-Date -AsUTC -Format 'ddd, dd MMM yyyy HH:mm:ss') + ' GMT'
    'x-ms-version'  = '2021-04-10'
}
$blobRequestUri     = $storageAccountBlobEndpoint + $containerName + '/' + $blobName

$blobRequest        = Invoke-RestMethod -Method $blobRequestMethod -Headers $blobRequestHeaders -Uri $blobRequestUri

$blobRequest | Select-String -Pattern $searchString

显然,在运行之前您需要填充一些变量(下面的值是随机示例):

$tenantId                   = "597d8458-6a5d-447f-875d-922e448f681a"
$subscriptionId             = "3338781b-426a-4b1c-8545-d9b88d78039d"
$storageAccountBlobEndpoint = "https://<some_name>.blob.core.windows.net/"
$applicationId              = "4e625cb8-595b-4b46-9ba9-6a9d220f4208"
$applicationSecret          = "<some_secret_value>"
$containerName              = "container01"
$blobName                   = "yourblob.txt"
$searchString               = "find this"

我知道它不是没有下载数据,但至少它没有写文件。 :-)

引用:https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob

关于azure - 通过 Powershell 读取 Azure Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73887937/

相关文章:

asp.net - 在条件 GET 请求中删除 Cookie

java - Azure key 保管库。无法使用相同的 key 和算法解密返回的值

powershell - 使用文本文件遍历PowerShell命令

azure - 虚拟机自动快照

azure - 时间扫描在 Azure 流分析翻转窗口和跳跃窗口中如何工作?

azure - 设置 WPF 桌面应用程序的持续部署

Azure 数据工厂将变量存储到 blob 中的文件

Powershell "Set-PSDebug -Trace 2"导致意外结果

winforms - 鼠标悬停列表框项目上的 POWERSHELL 工具提示

azure - 我在哪里可以获得 Microsoft 管理的 key ?