В службе приложений для контейнеров отсутствует конечная точка управляемой службы Azure
Я пытаюсь развернуть свое приложение в Службе приложений Azure для контейнеров с помощью предварительной версии docker-compose. Конфигурация развертывания следующая:
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, с которым я интегрировал свое приложение с помощью поставщика конфигурации хранилища ключей в соответствии с документацией:
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
map в моей конфигурации docker-compose, и это тоже не повлияло.
1 ответ
Что касается вашей проблемы, я думаю, вы пропустили два шага для управляемого удостоверения веб-приложения для контейнера.
Во-первых, вам нужно сначала включить управляемую идентификацию. Например, вы используете систему типов, присвоенную управляемой идентификации. Включите это так:
Тогда переменные средыMSI_ENDPOINT
а также MSI_SECRET
будет отображаться так:
Другой заключается в том, что если вам необходимо использовать управляемое удостоверение для доступа к хранилищу ключей, вам необходимо предоставить управляемому удостоверению достаточные разрешения. Вы можете выполнить действия, описанные в разделе Назначение доступа управляемой идентификации к ресурсу с помощью портала Azure.