azure - 使用 powershell 从 ADL Gen2 下载镶木地板文件
问题描述
我正在使用以下 powershell 命令将 TSV 文件从 ADL 下载到本地系统,它工作得非常好
#this appid has access to ADL
[string] $AppID = "bbb88818-aaaa-44fb-q2345678901y"
[string] $TenantId = "ttt88888-xxxx-yyyy-q2345678901y"
[string] $SubscriptionName = "Sub Sample"
[string] $AzureDataLakeAccountName = "sample.blob.core.windows.net"
[string] $AzureDataLakeSrcFilePath = "/accounts/sample/test.tsv"
[string] $LocalTargetFilePathName = "D:\MoveToModern"
Write-Host "AppID = " $AppID
Write-Host "TenantId = " $TenantId
Write-Host "SubscriptionName = " $SubscriptionName
Write-Host "AzureDataLakeAccountName = " AzureDataLakeAccountName
Write-Host "AzureDataLakeSrcFilePath = " $AzureDataLakeSrcFilePath
Write-Host "LocalTargetFilePathName = " $LocalTargetFilePathName
#this is the access key of the appid
$AccessKeyValue = "1234567=u-r.testabcdefaORYsw5AN5"
$azurePassword = ConvertTo-SecureString $AccessKeyValue -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($AppID, $azurePassword)
Login-AzureRmAccount -Credential $psCred -ServicePrincipal -Tenant $TenantId
Get-AzureRmSubscription
Get-AzureRmSubscription -SubscriptionName $SubscriptionName | Set-AzureRmContext
Export-AzureRmDataLakeStoreItem -AccountName $AzureDataLakeAccountName -Path $AzureDataLakeSrcFilePath -Destination $LocalTargetFilePathName -Force
但是当我用值/accounts/sample/test-V4.parquet替换源文件路径时,我得到以下错误:
ADLSException:获取路径 /accounts/Partner/Non-PII/Account/Account-V4.parquet 的元数据时出错。操作:GETFILESTATUS 失败,出现 HttpStatus:Forbidden 错误:错误流的 JSON 解析中出现意外错误。错误响应的内容类型:application/xml。ExceptionType:Newtonsoft.Json.JsonReaderException ExceptionMessage:解析值时遇到意外字符:<。路径 '',第 0 行,位置 0。
AuthenticationFailed
服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名。请求ID:de2e4b16-001e-002e-625f-c92785000000
您能否告诉我如何使用 powershell 从 ADL Gen2 下载镶木地板文件。
解决方案
根据您提供的信息,您没有足够的权限执行此操作。所以你得到禁止错误。如果要使用服务主体从 Azure 数据湖存储下载文件,我们需要授予安全主体对该文件的读取权限,并授予安全主体对容器和文件夹层次结构中的每个文件夹的执行权限,这些文件夹会导致文件。
请检查并设置正确的 ACL。关于如何做到这一点,请参考这里
如果你想从 Azure Data Lake Gen2 下载文件,我建议你使用 PowerShell 模块Az.Storage
。更多详情,请参考这里
例如
- 为服务主体配置 ACL。
如果要使用服务主体从 Azure 数据湖 Gen2 下载文件,我们需要授予安全主体对该文件的读取权限,并授予安全主体对容器和文件夹层次结构中的每个文件夹的执行权限,这些文件夹导致文件。关于如何配置,请参考这里。
- 脚本
$AppID = ""
$AccessKeyValue = ""
$TenantId=""
$azurePassword = ConvertTo-SecureString $AccessKeyValue -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($AppID, $azurePassword)
Connect-AzAccount -Credential $psCred -ServicePrincipal -Tenant $TenantId
$AzureDataLakeAccountName = ""
$ctx =New-AzStorageContext -StorageAccountName $AzureDataLakeAccountName -UseConnectedAccount
$filesystemName="<your container name>"
$path="<your blob name>"
$LocalTargetFilePathName = ""
Get-AzDataLakeGen2ItemContent -Context $ctx -FileSystem $filesystemName -Path $path -Destination $LocalTargetFilePathName
推荐阅读
- github - GCP:由于缺少“最新”标签,Cloud Run 预览版构建失败
- php - 尽管代码没有错误,但 php 中的 save_uploaded_file 不起作用
- azure - Azure B2C:无法从 v2.0 .well-known openid-configuration 检索文档
- git - 提交的文件被覆盖到 git
- validation - Confluence Data Center Plugin Validator - 区分大小写的表名问题
- mysql - 用列表中的随机字符替换mysql中的字符
- google-api - 带有服务帐户的 Google Admin API -- 凭据错误
- jenkins - 如何读取 CYPRESS 测试用例中 jenkins 参数化作业中声明的参数值或环境变量值?
- docker - Docker 中的 Docker | Github 操作 - 自托管运行器
- node.js - 如何实现刷新令牌轮换?