【问题标题】:Generating SAS token from service principal in DevOps pipeline (self-hosted)从 DevOps 管道中的服务主体生成 SAS 令牌(自托管)
【发布时间】:2020-10-24 13:42:04
【问题描述】:

我在自托管 Azure DevOps 管道中有以下脚本,以便将构建工件复制到 Azure blob 存储(静态网站)。

任务如下,我尝试使用New-AzStorageContainerSASToken,构建步骤日志也告诉它获取服务主体。但是,我似乎一直无法从 DevOps 管道放入任务中的服务主体为容器生成 SAS 令牌,因此我可以在 AzCopy 中使用它。

- task: AzureCLI@2
  displayName: 'Copy test'
  inputs:
    azureSubscription: 'TestAccount (aaaaaaaa-bbbb-cccc-bbbb-ffffffffffff)'
    addSpnToEnvironment: true
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      
      $ctx = New-AzStorageContext -StorageAccountName "some123teststorage" -UseConnectedAccount
      $StartTime = Get-Date
      $EndTime = $startTime.AddDays(1)
      $sasToken = New-AzStorageContainerSASToken -Name "$web" -Permission rwd -StartTime $StartTime -ExpiryTime $EndTime -context $ctx
      azcopy copy "$(System.DefaultWorkingDirectory)\test-app\dist\" "$(destination_blob)" --put-md5 --recursive --overwrite=false --check-length=false --log-level=info

管道中的错误是

New-AzStorageContext : Context cannot be null.  Please log in using Connect-AzAccount.

总而言之,在 DevOps 管道日志中注明

C:\WINDOWS\system32\cmd.exe /D /S /C ""C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" cloud set -n AzureCloud"
C:\WINDOWS\system32\cmd.exe /D /S /C ""C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" login --service-principal -u *** "--password=***" --tenant *** --allow-no-subscriptions"
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "***",
    "id": "<snip>",
    "isDefault": true,
    "managedByTenants": [],
    "name": "TestAccount",
    "state": "Enabled",
    "tenantId": "***",
    "user": {
      "name": "***",
      "type": "servicePrincipal"
    }
  }
]
C:\WINDOWS\system32\cmd.exe /D /S /C ""C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" account set --subscription <snip>"
"C:\Program Files\PowerShell\7\pwsh.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\azuredevops\agent\_work\_temp\azureclitaskscript1593799829465.ps1'"
***
New-AzStorageContext : Context cannot be null.  Please log in using Connect-AzAccount.

值得注意的是 Azure file copy 任务在发布管道中有效。不过,我现在想直接从构建管道中执行此操作。

【问题讨论】:

    标签: azure powershell azure-devops azure-cli azure-devops-self-hosted-agent


    【解决方案1】:

    如果要在 Azure CLI 任务中为容器生成 SAS 令牌,请使用 Azure CLI 命令az storage container generate-sas 而不是 powershell 命令。

    确保与服务连接相关的服务主体在您的存储帐户或订阅的Access control (IAM) 中具有角色,例如Storage Blob Data Contributor,如果没有,请按照这个doc添加。

    示例:

    az storage container generate-sas \
        --account-name <storage-account> \
        --name <container> \
        --permissions acdlrw \
        --expiry <date-time> \
        --auth-mode login \
        --as-user
    

    更多详情,请参阅此文档 - https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-user-delegation-sas-create-cli#create-a-user-delegation-sas-for-a-container

    【讨论】:

    • 我会接受的。我注意到这在使用新的“组合”管道时有效。虽然当前管道是单独的 CI,然后是发布管道,但我认为我可以重构。把它放在这里给其他可能有类似问题的人。
    猜你喜欢
    • 2021-12-02
    • 2020-01-08
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2012-06-30
    相关资源
    最近更新 更多