使用 Azure PowerShell 将密钥保管库机密分配给 Azure 函数

Assign Key Vault Secrets to an Azure Function using Azure PowerShell

我正在尝试通过从 Azure DevOps 发布管道触发的 Azure PowerShell 脚本自动创建某些 azure 资源。我想创建一个函数应用程序,并自动集成对现有 Key Vault 中机密的读取权限。此 Key Vault 在同一个 Azure 订阅中。

虽然我可以按照文档创建大部分资源,但似乎缺少有关使用 Azure PowerShell 创建某些资源的文档(或者我找不到它)。

如果我按照此 link, I can accomplish it without a problem by using the UI in the Azure Portal, but I can't find any documentation on Microsoft Docs 中的示例使用 PowerShell 进行操作。

    Write-Host "Creating Function App..."
    $fnApp = New-AzFunctionApp   -Name $functionAppName `
                        -ResourceGroupName $emailFunctionRg `
                        -Location "$(AzureRegion)" `
                        -StorageAccount $storageName `
                        -Runtime dotnet `
                        -FunctionsVersion '3' `
                        -IdentityType SystemAssigned
    Write-Host "Function App created!"

    Write-Host "Assigning Key Vault access..."
    $appId = Get-AzADServicePrincipal -DisplayName $functionAppName
    Set-AzKeyVaultAccessPolicy -VaultName EmailSettings -ServicePrincipalName $appId -PermissionsToSecrets Get,List
    Write-Host "Key Vault access granted!"

运行 Set-AzKeyVaultAccessPolicy 失败并显示 “权限不足,无法完成操作。”。但我不确定这是否是正确的路径,这只是一个猜测,基于文档中的可用函数。

有什么想法吗?

这里有两个潜在问题需要检查:

  1. 您的应用程序创建将结果分配给 $fnApp。也许 $fnApp 或如上所述,$fnApp.ApplicationId 是您应该用于访问策略授予的 -ServicePrincipalName 参数的内容。
  2. 您没有分配 RBAC 角色的权限。转到 Key Vault,选择 Access Control,然后单击“角色分配”选项卡并验证您的用户是否作为管理员、用户访问管理员或所有者出现在列表中。

编辑: 关于 RBAC 权限,因为这是来自 Azure DevOps 的 Azure Powershell 中的 运行,您需要检查服务连接的角色分配服务主体 - 在 Azure 门户中的 Azure Active Directory 下,查找用于创建服务连接的主体,并确保它在密钥保管库中获得正确的角色。

经过一些反复试验后,我得出的结论是我没有为 Set-AzKeyVaultAccessPolicy cmdlet 使用正确的参数。

以下脚本将起作用(如果服务原则运行它具有适当的作用,如his/her答案中提到的WaitingForGuacamole):

Write-Host "Creating Function App..."
$fnApp = New-AzFunctionApp -Name <FnAppName> `
                    -ResourceGroupName <ResourceGroupName> `
                    -Location <AzureRegion> `
                    -StorageAccount <StorageAccount> `
                    -Runtime dotnet `
                    -FunctionsVersion '3' `
                    -IdentityType SystemAssigned
Write-Host "Function App created!"

Write-Host "Assigning Key Vault access..."
Set-AzKeyVaultAccessPolicy -VaultName <NameOfTheKeyVault> -ObjectId (Get-AzADServicePrincipal -DisplayName <FnAppName>).Id -PermissionsToSecrets <Get, List, etc...>
Write-Host "Key Vault access granted!"