我正在Azure DevOps管道中为新的Azure存储帐户创建CI/CD资源调配管道,并尝试使用管道中的Azure Powershell任务运行的AzCopy将一些文件上载到Blob存储。
脚本在我的本地计算机上成功运行,但在Azure DevOps管道中运行时,我收到以下错误(ErrorDateTime只是一个模糊的ISO 8601格式的日期时间):
我试过的。。。
>
如果在存储帐户防火墙规则上启用“允许从所有网络访问”,则脚本将运行并成功上载文件。
看起来好像在他们自己的VNet中运行的Azure管道代理没有访问我的存储帐户的权限,但我认为通过在防火墙设置中设置“允许受信任的Microsoft服务访问此存储帐户”可以满足这一要求
我在Azure PowerShell任务中使用以下行。我对这些值很满意,因为当启用“所有网络”或我的IP地址并在本地运行时,一切都可以工作。
.\AzCopy.exe /Source:$SourcePath /Dest:$blobUrlDir /DestKey:$key /Pattern:$FilenamePattern /Y
如有任何想法或指导,将不胜感激。
谢谢
SJB
在做了进一步的研究之后,我注意到了下面提出的问题——从存储帐户的角度来看,Azure DevOps不被认为是值得信任的Microsoft服务。
我的临时解决办法是:
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
人们似乎在这个github问题上得到了好坏参半的结果,但是AzureFileCopy@4在将“存储Blob数据贡献者”角色添加到ARM连接的服务主体后,该任务可以工作(至少对我们来说)。以下是将回购部署为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
(当然,如果您像我们一样使用Azure CDN,下一步是清除CDNendpoint的缓存,但这与blob存储错误无关)
是否考虑过使用Azure运营模式任务"Azure文件副本"而不是PowerShell脚本?见:https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-file-copy?view=azure-devops