У меня есть файл модуля .psm1, который содержит несколько вспомогательных функций для скрипта run.ps1.
В одной из функций я обращаюсь к Azure Key Vault, чтобы получить секрет подключения; здесь скрипт run.ps1, похоже, зависает.
Управляемая идентичность настроена и имеет разрешения доступа к хранилищу. Я получаю сообщение [warning] о доступе к секрету, но run.ps1 просто полностью ОСТАНАВЛИВАЕТСЯ в этот момент, никаких ошибок.
Я попробовал скопировать блок кода в верхнюю часть своего скрипта run.ps1, и он работает как задумано.
Вот фрагмент кода, скопированный в run.ps1, который работает.
$applicationId = 'abc123'
$securePassword = Get-AzKeyVaultSecret -VaultName "KV-SANDBOX" -Name "ConnectionSecret"
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $applicationId, $securePassword.SecretValue
Connect-PowerBIServiceAccount -ServicePrincipal -Credential $credential -TenantId 'a1b2c3'
Это проблема области видимости? Я не могу найти ничего о keyvault и функциях.
Что я пробовал:
- Запуск скриптов локально работает
- Я пытался выполнить функции в файле .ps1 (возникает проблема)
- Я пытался создать папку \Modules\ с файлом .psm1 со всеми функциями (возникает проблема)
- Копирование кода функции напрямую в run.ps1 работает правильно
Ответ
Проблема, с которой вы столкнулись при использовании функции Get-AzKeyVaultSecret внутри функции в модуле PowerShell, может быть связана с несколькими аспектами, включая контекст выполнения, управление переменными и разрешения. Давайте разберем возможные причины и пути решения вашей проблемы.
Возможные причины
-
Контекст выполнения: Когда вы вызываете функцию из файла модуля (.psm1), контекст выполнения может отличаться от контекста основного скрипта. Это может повлиять на доступ к переменным или на выполнение асинхронных вызовов.
-
Ошибка доступа к секрету: Хотя вы упомянули, что managed identity настроен и имеет доступ, важно убедиться, что используемая при вызове функции аутентификация также работает правильно. Если функция вызывается в другом контексте, она может не наследовать эти права.
- Прерывание выполнения: Если скрипт зависает или останавливается без сообщений об ошибках, это может быть связано с тем, что функция пытается вызвать Get-AzKeyVaultSecret с неправильными параметрами или что-то блокирует выполнение.
Решения
-
Обработайте ошибки: Оберните вызов
Get-AzKeyVaultSecret
в блокtry/catch
, чтобы отлавливать ошибки и получать дополнительную информацию:function Get-Secret { param ( [string]$vaultName, [string]$secretName ) try { $secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName return $secret } catch { Write-Error "Ошибка при получении секрета: $_" return $null } }
-
Передайте необходимые параметры: Убедитесь, что вы передаете все необходимые параметры в вашу функцию. Например, если функция требует имени хранилища секретов и имени секрета, убедитесь, что вы передали их корректно.
-
Проверьте разрешения: Проверьте, есть ли разрешения у Managed Identity на доступ к секрету из функции. Вы можете использовать командлеты Azure для проверки ролей и разрешений.
-
Отладка: Добавьте отладочные сообщения в вашу функцию. Это поможет вам определить, на каком этапе происходит зависание:
function Get-Secret { param ( [string]$vaultName, [string]$secretName ) Write-Host "Попытка получить секрет из хранилища: $vaultName" try { $secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName Write-Host "Секрет получен успешно" return $secret } catch { Write-Error "Ошибка при получении секрета: $_" return $null } }
- Асинхронные вызовы: Проверьте, есть ли у вас другие асинхронные вызовы, которые могут блокировать выполнение скрипта. Убедитесь, что ваш код не использует блокирующие операции, которые могут вызвать зависание.
Пример полного кода
Вот общий пример функции, который демонстрирует, как вы можете интегрировать все эти предложения:
function Get-Secret {
param (
[string]$vaultName,
[string]$secretName
)
Write-Host "Попытка получить секрет из хранилища: $vaultName"
try {
$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName
if ($null -ne $secret) {
Write-Host "Секрет получен успешно"
return $secret
} else {
Write-Error "Секрет не найден."
return $null
}
} catch {
Write-Error "Ошибка при получении секрета: $_"
return $null
}
}
# Использование функции в вашем основном скрипте
$vaultName = "KV-SANDBOX"
$secretName = "ConnectionSecret"
$securePassword = Get-Secret -vaultName $vaultName -secretName $secretName
if ($securePassword -ne $null) {
$applicationId = 'abc123'
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $applicationId, $securePassword.SecretValue
Connect-PowerBIServiceAccount -ServicePrincipal -Credential $credential -TenantId 'a1b2c3'
} else {
Write-Error "Не удалось получить секрет. Подключение к Power BI не выполнено."
}
Следуя этим рекомендациям, вы сможете устранить проблемы с получением секретов из Azure Key Vault в функции и обеспечить корректное функционирование вашего скрипта.