azure - Azure DevOps Pipeline Azure Blob 存储上传文件 403 禁止异常
问题描述
概括
我正在为 Azure DevOps 管道中的新 Azure 存储帐户创建 CI/CD 预配管道,并尝试使用从管道中的 Azure Powershell 任务运行的 AzCopy 将一些文件上传到 Blob 存储中。
错误
该脚本从我的本地计算机成功运行,但在 Azure DevOps 管道中运行时出现以下错误(ErrorDateTime只是一个混淆的 ISO 8601 格式的日期时间):
- System.Management.Automation.RemoteException:[ErrorDateTime][ERROR] 解析目标位置时出错“ https://newStorageAccount.blob.core.windows.net/config/import ”:无法验证目标:发生了一个或多个错误。远程服务器返回错误:(403) Forbidden。
[error][ErrorDateTime][ERROR] 解析目标位置“ https://newStorageAccount.blob.core.windows.net/config/import ”时出错:无法验证目标:发生了一个或多个错误。远程服务器返回错误:(403) Forbidden。
[调试]已处理:##vso[task.logissue type=error][ErrorDateTime][ERROR] 解析目标位置时出错“ https://newStorageAccount.blob.core.windows.net/config/import ”:无法验证目标: 出现一个或多个错误。远程服务器返回错误:(403) Forbidden。
- 错误记录:
- 此请求无权执行此操作。
假设
- 存储帐户已设置为仅允许特定的 VNet 和 IP 地址访问。
- 看起来防火墙或凭据以某种方式配置错误,但运行脚本的 ServicePrincipal 已在其他同级管道任务中成功使用,为了了解这些问题,我暂时授予了 ServicePrincipal 订阅所有者权限,并且存储帐户防火墙规则选项卡具有“允许受信任的 Microsoft 服务访问此存储帐户”
我试过的...
我已经成功地从我的本地机器上运行了脚本,并且我的 IP 地址在允许列表中。
如果我在存储帐户防火墙规则上启用“允许从所有网络访问”,则脚本运行并成功上传文件。
似乎在自己的 VNet 中运行的 Azure Pipeline Agent 无权访问我的存储帐户,但我认为通过在防火墙设置中设置“允许受信任的 Microsoft 服务访问此存储帐户”可以满足要求
我在 Azure Powershell 任务中使用以下行。我对这些值感到满意,因为当启用“所有网络”或我的 IP 地址并且我在本地运行时,一切正常。
.\AzCopy.exe /Source:$SourcePath /Dest:$blobUrlDir /DestKey:$key /Pattern:$FilenamePattern /Y
任何想法或指导将不胜感激。
谢谢,
SJB
解决方案
在进行进一步研究后,我注意到以下提出的问题 - 从存储帐户的角度来看,Azure DevOps 不被视为受信任的 Microsoft 服务。
我的临时解决方法是:
- 将DefaultAction设置为Allow,从而允许“所有网络访问”。
- 在复制操作后将DefaultAction设置为Deny可确保再次强制执行我的 VNet 规则。
Try
{
Update-AzureRmStorageAccountNetworkRuleSet -ResourceGroupName "$ResourceGroupName" -Name "$StorageAccountName" -DefaultAction Allow
.\AzCopy.exe /Source:$SourcePath /Dest:$blobUrlDir /DestKey:$key /Pattern:$FilenamePattern /Y
}
Catch
{
#Handle errors...
}
Finally
{
Update-AzureRmStorageAccountNetworkRuleSet -ResourceGroupName "$ResourceGroupName" -Name "$StorageAccountName" -DefaultAction Deny
}
谢谢,
SJB
推荐阅读
- php - 在 PHP 中记录 POST 数据
- hash - 是否有一个散列函数将相同间隔中的点分箱到相同的散列,所以我们可以在 O(1) 时间内识别包含间隔
- micro-frontend - 如何从 single-spa util 模块中导出功能并在 single-spa 微前端中导入相同的功能?
- java - OpenGL 不在 Mac M1 计算机上
- reactjs - 如何解决 TypeScript React Hook useState() 上的“预期 0 类型参数,但得到 1”错误?
- python-3.x - Tkinter:为什么它会带来一个从类中获取的空变量?
- python - .pop() 同时影响两个列表
- python - Pandas - 根据之前的行为进行插值
- debugging - 将 c# dll 引入 c++ dll 后,Visual Studio 2017 会跳过所有调试点
- python - EC2 实例未连接到互联网