Azure DevOps管道Azure Blob存储上传文件403 Forbidden Exception

o2g1uqev  于 2023-06-06  发布在  其他
关注(0)|答案(4)|浏览(185)

总结

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

错误

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

假设

  • 存储帐户已设置为仅允许特定的VNet和IP地址访问。
  • 看起来防火墙或凭据配置错误,但运行脚本的ServicePrincipal已在其他同级管道任务中成功使用,为了理解这些问题,我暂时授予了ServicePrincipal订阅所有者权限,并且存储帐户防火墙规则选项卡具有“允许受信任的Microsoft服务访问此存储帐户”
    我所尝试的
  • 我已经成功地运行脚本从我的本地机器与我的IP地址正在允许的列表中。
  • 如果我在存储帐户防火墙规则上启用“允许从所有网络访问”,则脚本将运行,文件将成功上载。
  • 看起来好像在自己的VNet中运行的Azure Pipeline代理无法访问我的存储帐户,但我认为通过在防火墙设置中设置“允许受信任的Microsoft服务访问此存储帐户”可以满足此要求

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

.\AzCopy.exe /Source:$SourcePath /Dest:$blobUrlDir /DestKey:$key /Pattern:$FilenamePattern /Y

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

1szpjjfi

1szpjjfi1#

人们似乎在this github issue中得到了混合的结果,但是在将“Storage Blob Data Contributor”角色添加到ARM连接的服务主体(到存储帐户本身)之后,AzureFileCopy@4任务工作(至少对我们来说)。下面是在blob容器中将repo部署为静态网站的管道中唯一必要的步骤:

- 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

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

xqk2d5yq

xqk2d5yq2#

在做了进一步的研究之后,我注意到了以下提出的问题-从存储帐户的Angular 来看,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

9lowa7mx

9lowa7mx3#

在我的示例中,在管道中选择的Azure订阅中的服务主体需要具有存储Blob数据贡献者角色,用于我想要复制文件的所需存储帐户
要执行此操作,请执行以下步骤:
1.打开DevOps管道,找到Azure订阅字段,点击旁边的【管理】按钮
1.然后单击“管理服务主体”并注意显示名称(可选择将其更改为唯一名称-因为项目中服务连接的所有服务主体都具有相同的默认名称,这可能会使下一步混淆)
1.在Azure Portal中打开存储资源(帐户或容器),然后在左侧刀片中选择“访问控制(IAM)”,然后单击“添加角色分配”,并将“存储Blob数据贡献者”角色添加到您在上一步中记录的服务主体
如果“添加角色分配”被禁用或变灰,则需要请求管理员授予该访问权限。
这个解决方案是从这个GitHub评论中获得并改进的。

c90pui9n

c90pui9n4#

您是否考虑过使用Azure DevOps任务“Azure文件复制”而不是powershell脚本?参见:https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-file-copy?view=azure-devops

相关问题