从 DevOps 管道中的服务主体生成 SAS 令牌(自托管)
Generating SAS token from service principal in DevOps pipeline (self-hosted)
我在自托管的 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\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 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
我在自托管的 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\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 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