Azure DevOps 管道 Azure Blob 存储上传文件 403 禁止异常

SJB*_*SJB 5 azure azure-powershell azure-devops

概括

我正在为 Azure DevOps 管道中的新 Azure 存储帐户创建 CI/CD 配置管道,并尝试使用从管道中的 Azure Powershell 任务运行的 AzCopy 将一些文件上传到 Blob 存储。

错误

该脚本在我的本地机器上成功运行,但在 Azure DevOps 管道中运行时,我收到以下错误(ErrorDateTime只是一个经过混淆的 ISO 8601 格式的日期时间):

假设

  • 存储帐户已设置为仅允许特定 VNet 和 IP 地址访问。
  • 看起来防火墙或凭据以某种方式配置错误,但运行脚本的 ServicePrincipal 已成功用于其他同级管道任务,为了理解这些问题,我暂时授予了 ServicePrincipal 订阅所有者权限,并且存储帐户防火墙规则选项卡具有“允许受信任的 Microsoft 服务访问此存储帐户”

我试过的...

  • 我已经成功地从我的本地机器运行了脚本,我的 IP 地址在允许列表中。

  • 如果我在存储帐户防火墙规则上启用“允许从所有网络访问”,则脚本将运行并且文件已成功上传。

  • 似乎在自己的 VNet 中运行的 Azure 管道代理无权访问我的存储帐户,但我认为通过在防火墙设置中设置“允许受信任的 Microsoft 服务访问此存储帐户”可以满足该要求

我在 Azure Powershell 任务中使用以下行。我对这些值很满意,因为当“所有网络”或我的 IP 地址启用并且我在本地运行时,一切正常。

.\AzCopy.exe /Source:$SourcePath /Dest:$blobUrlDir /DestKey:$key /Pattern:$FilenamePattern /Y
Run Code Online (Sandbox Code Playgroud)

任何想法或指导将不胜感激。

谢谢,

SJB

SJB*_*SJB 5

在进一步研究之后,我注意到以下提出的问题 - 从存储帐户的角度来看,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
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

SJB

  • 谢谢...我现在遇到了同样的问题。这似乎是一个不错的解决办法,但即使是很短的时间“公开”(DefaultAction = 允许)仍然感觉很奇怪。从技术上讲,在“允许”和“拒绝”步骤之间可能会出现某些问题,然后存储帐户将保持打开状态。还有其他人找到其他解决方案吗? (2认同)

Mat*_*hap 5

人们似乎在这个 github 问题中得到了不同的结果,但是在将“存储 Blob 数据贡献者”角色添加到 ARM 连接的服务主体后,AzureFileCopy@4任务可以工作(至少对我们而言)。以下是将存储库部署为 blob 容器中的静态网站的管道中唯一必要的步骤:

- task: AzureFileCopy@4
  displayName: 'Copy files to blob storage: $(storageName)'
  inputs:
    SourcePath: '$(build.sourcesDirectory)'
    Destination: AzureBlob
    storage: $(storageName)
    ContainerName: $web
    azureSubscription: 'ARM Connection goes here' # needs a role assignment before it'll work
Run Code Online (Sandbox Code Playgroud)

(当然,如果你像我们一样使用 Azure CDN,下一步是清除 CDN 端点的缓存,但这与 blob 存储错误无关)

  • 在这里工作过。DevOps 在 Azure 中创建一个企业应用程序用户,名称如下:**<tenant-name>-<release-pipeline-name>-<guid>**。该用户具有“存储 Blob 数据贡献者”角色,但具有“资源组”角色。**预计它适用于所有子资源,但事实并非如此。** **01.** 在 Azure 门户中,转到接收我的构建工件的存储。**02.** 转到访问控制 (IAM)。**03.** + 添加 > 角色分配。**04.** 选择角色“存储 Blob 数据贡献者”。**05.** 选择 Azure Devops 为您的构建/发布管道创建的用户。 (2认同)