Я пытаюсь развернуть свое приложение в Azure Службе приложений для контейнеров, используя предварительный просмотр docker. Конфигурация развертывания выглядит следующим образом:
version: "3.7"
services:
auth:
image: myorg/myimage
environment:
- MyOrg__Hosting__PathBase=/auth
- ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
- ConnectionStrings__AuthenticationDatabase
# other services not important for this question
В этом развертывании мне необходимо получить доступ к Azure Key Vault, с которым я интегрировал свое приложение через поставщика конфигурации Key Vault, согласно документация :
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
config.AddAzureKeyVault(
$"https://{builtConfig["KeyVault:Name"]}.vault.azure.net/",
keyVaultClient,
DefaultKeyVaultSecretManager());
My Azure Key Vault имеет соответствующий набор политик доступа, и на страницах Kudu кажется, что переменные окружения MSI_ENDPOINT
и MSI_SECRET
были установлены в среда выполнения. Однако поставщику конфигурации Key Vault неоднократно не удается подключиться к Key Vault с ошибкой:
Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters:
Connection String: [No connection string specified], Resource: https://vault.azure.net,
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception
Message: Tried the following 3 methods to get an access token, but none of them worked.
2020-02-21T18:27:27.024474350Z Parameters:
Connection String: [No connection string specified], Resource: https://vault.azure.net,
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception
Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.
2020-02-21T18:27:27.024479550Z Parameters:
Connection String: [No connection string specified], Resource: https://vault.azure.net,
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception
Message: Tried to get token using Visual Studio. Access token could not be acquired. Environment variable LOCALAPPDATA not set.
2020-02-21T18:27:27.024483550Z Parameters:
Connection String: [No connection string specified], Resource: https://vault.azure.net,
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception
Message: Tried to get token using Azure CLI. Access token could not be acquired. No such file or directory
Первый из этих трех методов явно указывает на то, что MSI недоступен для некоторого повторного просмотра.
Я добавил ручной запрос для целей отладки, взятый из документации по управляемым удостоверениям :
public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion)
{
HttpClient client = new HttpClient();
var msiEndpoint = Environment.GetEnvironmentVariable("MSI_ENDPOINT") ?? "MSI_ENDPOINT is not set!";
Log.Logger.Debug("MSI_ENDPOINT is {MsiEndpoint}", msiEndpoint);
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", msiEndpoint, resource, apiversion));
}
, и я ясно вижу в журналах своего приложения строку MSI_ENDPOINT is
- так что оно установлено, но пусто или пробел. Это поддерживается InvalidOperationException
, выданным запросом отладки, утверждающим, что «предоставлен недопустимый URI запроса. URI запроса должен быть либо абсолютным URI, либо должен быть установлен BaseAddress».
Я пытался отключение и повторное включение идентификатора, назначенного системой, перезапуск службы приложений и тройная проверка политик доступа к Key Vault - все безрезультатно. На данный момент, я думаю, я могу только предположить, что переменные окружения MSI_*
не передаются в контейнер (ы) во время выполнения, и я не уверен, почему это будет.
Обновление: Я также попытался перечислить переменные окружения MSI_*
в карте environment
в моей конфигурации docker, но это также не помогло иметь какой-либо эффект.