从Azure Powershell Function app

时间:2018-04-14 18:03:13

标签: azure-web-sites azure-active-directory azure-keyvault

我正尝试使用以下步骤从Timer Triggered Powershell Azure功能应用访问密钥保管库密码。

  1. 创建了TimerTrigger Powershell功能应用。
  2. 在快速模式下使用AD应用程序注册的功能应用程序
  3. 在功能应用程序中启用托管服务标识。
  4. 在同一资源组中创建了KeyVault,并在keyvault accesspolicies下添加了功能应用。
  5. 在keyvault秘密下创建了一个新秘密。
  6. 在代码下方用于访问功能应用程序中的keyvault。

    $NewTestSecret = Get-AzureKeyVaultSecret -VaultName FunctionAppTestKeyVault -Name TestSecret
    
    $NewTestSecretVaule = $NewTestSecret.SecretValueText
    
    Write-Output $NewTestSecretVaule
    
  7. 获取以下错误。不确定我缺少哪些额外步骤。 任何回复都非常感谢。

      

    CategoryInfo:InvalidOperation :(:)

         

    [Get-AzureKeyVaultSecret],PSInvalidOperationException

         

    FullyQualifiedErrorId:InvalidOperation,Microsoft.Azure.Commands.KeyVault.GetAzureKeyVaultSecret   2018-04-14T17:45:00.709 [错误]执行函数时异常:   Functions.TimerTriggerTestPowershell1。 Microsoft.Azure.WebJobs.Script:   PowerShell脚本错误。   Microsoft.Azure.Commands.ResourceManager.Common:运行   登录AzureRmAccount登录。

2 个答案:

答案 0 :(得分:1)

谢谢大家的回应。除了在功能应用程序中实现MSI之外,我使用下面的代码使用指纹证书从Powershell功能应用程序获取密钥保密。

Add-AzureRmAccount -CertificateThumbprint "***********" -Tenant "*********" 
-ServicePrincipal -ApplicationId "**********"

$secret = Get-AzureKeyVaultSecret -VaultName "testkeyvault" -Name 
         "testSecret"

写输出$ secret.SecretValueText

还必须在应用程序设置下添加 WEBSITE_LOAD_CERTIFICATES appsetting才能将证书加载到功能应用程序中。

答案 1 :(得分:0)

  

我正尝试使用以下步骤从Timer Triggered Powershell Azure功能应用访问密钥保管库密码。

如果要使用Get-AzureKeyVaultSecret命令,则需要先登录Azure-AzureRmAccount。

默认情况下,Login-AzureRmAccount执行交互式登录,该登录无法在Azure功能中运行。相反,您需要使用服务主体登录,例如

Connect-AzureRmAccount -ServicePrincipal -ApplicationId  "http://my-app" -Credential $pscredential -TenantId $tenantid

您可以从here获取更多信息。您还需要authorize the application to use the key or secret

另一种方式:

您也可以使用MSI功能来执行此操作。我们可以从此document获取访问代码。您还需要添加权限以让azure函数访问keyvault。有关更多详细信息,请参阅此guide

演示代码:

$vaultName = "Your key vault name" 
$vaultSecretName = "your scecretname "

$tokenAuthURI = $Env:MSI_ENDPOINT + "?resource=https://vault.azure.net&api-version=2017-09-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"Secret"="$env:MSI_SECRET"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token

$headers = @{ 'Authorization' = "Bearer $accessToken" }
$queryUrl = "https://$vaultName.vault.azure.net/secrets/" +$vaultSecretName + "?api-version=2016-10-01"

$keyResponse = Invoke-RestMethod -Method GET -Uri $queryUrl -Headers $headers

enter image description here