Я устанавливаю строку подключения к служебной шине в настройках приложения функции Azure. В настоящее время я храню всю строку подключения в Key Vault и ссылаюсь на секрет Key Vault в настройках приложения. Это работает нормально. Но то, что я пытаюсь сделать безуспешно, - это хранить только ключ служебной шины, а не всю строку подключения в хранилище ключей.
Я пытался объединить строку подключения с настройками справочного приложения KeyVault. на портале, как показано ниже
Endpoint=sb://xxxxx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=@Microsoft.KeyVault(SecretUri=xxxx.vault.azure.net/secrets/yyyy/zzzzz)
Но это не работает.
Причина, по которой мне нужно сделать это разделение, заключается в том, что я хочу повернуть ключи в хранилище ключей, и я не могу этого сделать, если вся строка подключения хранится в хранилище ключей.
ОБНОВЛЕНИЕ1:
Разделение строки подключения на несколько ключей настройки приложения может работать для этой проблемы, но это ограничило бы мою возможность использовать, скажем, сервисные шины, запускаемые функциями лазера, для которых требовалось полное имяключ строки подключения в настройках приложения внутри сигнатуры метода Run, как показано ниже
public static void Run(
[ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "ServiceBusConnection")]
string myQueueItem
ILogger log)
ОБНОВЛЕНИЕ 2:
Обход, который я проделал до сих пор, который, я надеюсь, может сделать более чистый подходиспользовать регулярные выражения в моей автоматизации Powershell, чтобы заменить только часть SharedAccessKey строки подключения. Таким образом, я использую только одну настройку приложения для строки подключения. Это работает, но мне это неудобно.
Это код, который я использую в моем Runbook Automation Runbook:
$azureAutomationConnectionName = "AzureRunAsConnection"
$servicePrincipalConnection = Get-AutomationConnection -Name $azureAutomationConnectionName
Add-AzureRmAccount -ServicePrincipal -TenantId $servicePrincipalConnection.TenantId -ApplicationId $servicePrincipalConnection.ApplicationId -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
$resourceGroupName = 'XXXX'
$serviceBusName = 'XXXX'
$serviceBusAccessPolicyName = 'RootManageSharedAccessKey'
$keyVaultName = 'XXXX'
$keyVaultSecretKey = 'XXXX'
$currentSecret = (Get-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretKey).SecretValueText
# Regenerate the Service Bus Primary Key
New-AzureRmServiceBusKey -ResourceGroupName $resourceGroupName -Namespace $serviceBusName -Name $serviceBusAccessPolicyName -RegenerateKey PrimaryKey
# Get the newly regenerated Primary Key
$newPrimaryKey = (Get-AzureRmServiceBusKey -ResourceGroupName $resourceGroupName -Namespace $serviceBusName -Name $serviceBusAccessPolicyName).PrimaryKey
# The secret is storing the entire connection string. We want to replace the SharedAccessKey Only
$newSecretStr = $currentSecret -replace 'SharedAccessKey=[^;]*', ([string]::Format('SharedAccessKey={0}',$newPrimaryKey))
# Convert the Primary Key to Secure String
$newSecureSecretStr = ConvertTo-SecureString $newSecretStr -AsPlainText -Force
# Update the Secret Value in the Key Vault
Set-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretKey -SecretValue $newSecureSecretStr