Развернул службу приложений Azure для контейнеров с пользовательским образом (из базового образа Centos 7). На основе следующей документации Существует переменная среды, которая должна быть установлена Azure и использоваться для создания запроса REST API для получения токена доступа:
Однако при проверке внутри контейнера эта переменная не устанавливается:
[root@f22dfd74be31 ~]# echo $IDENTITY_ENDPOINT
(empty result here)
Я также пытался вызвать az cli, что также не удалось:
[root@f22dfd74be31 ~]# az login -i
AzureConnectionError: Failed to connect to MSI. Please make sure MSI is configured correctly
and check the network connection.
Error detail: HTTPConnectionPool(host='169.254.169.254', port=80): Max retries exceeded with
url: /metadata/identity/oauth2/token?resource=https%3
A%2F%2Fmanagement.core.windows.net%2F&api-version=2018-02-01 (Caused by
NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f9e0c4
c72e8>: Failed to establish a new connection: [Errno 110] Connection timed out',))
Я успешно использовал управляемое удостоверение как с виртуальными машинами, так и со службой приложений (развертывание кода, а не с контейнерами). Поддерживается ли оно службой приложений для контейнеров с настраиваемыми контейнерами?
@Sajeetharan, этому сообщению в блоге более двух лет;) Я считаю, что оно должно быть GA и работать. Так что вам, вероятно, следует открыть дело поддержки, если это возможно.
да, создал обращение в службу поддержки, я хотел проверить, успешно ли кто-то его реализовал. Еще я заметил, что установка переменных в настройках приложения не распространяется на переменную среды внутри контейнера.
Он должен поддерживать MSI, убедитесь, что вы включили MSI, как показано ниже.
Кроме того, в шаге 4 в этом документе также упоминается команда CLI для включения MSI.
az webapp identity assign --resource-group AppSvc-DockerTutorial-rg --name <app-name> --query principalId --output tsv
Как говорится в вопросе, в прошлом я настраивал MI как с виртуальными машинами, так и со службой приложений (код), поэтому я знаю, как установить систему и управляемую пользователем идентификацию. проблема в том, что переменная среды IDENTITY_ENDPOINT не экспортируется внутри пользовательского контейнера. Он также указан на вкладке «Среда» инструментов Advances (Kudo), но опять же не распространяется внутри контейнера.
При работе со службой приложений для контейнеров переменные среды "платформа", включая управляемое удостоверение и параметры приложения, доступны только при инициализации контейнера. Чтобы сделать эти переменные доступными из контейнера, в сценарий запуска контейнера необходимо включить следующую строку (вызывается из Dockerfile ENTRYPOINT):
eval $(printenv | sed -n "s/^\([^=]\+\)=\(.*\)$/export \1=\2/p" | sed 's/"/\\\"/g' | sed '/=/s// = "/' | sed 's/$/"/' >> /etc/profile)
О, чувак, это спасение, потратьте несколько дней, пытаясь понять это, и это отлично работает!
Эй, можете ли вы объяснить, где именно должна быть размещена команда eval в ответе? Я создал скрипт run.sh
(используемый как ENTRYPOINT в моем файле докеров), где первая строка — это команда выше, а следующая строка — моя исполняемая команда запуска. Это верно? Кажется, это не решает ошибку 400 из конечной точки /msi/token для меня.
да поддерживается, но не в GA azure.microsoft.com/en-us/blog/…