将 Azure Web App 用于具有托管标识的容器

Using Azure Web App for Containers with managed identity

使用自定义映像(来自 Centos 7 基础映像)为容器部署了 Azure 应用服务。 基于以下 documentation 有一个环境变量应由 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',))

我已经成功地将托管标识用于虚拟机和应用服务(代码部署而非容器),应用服务是否支持容器和自定义容器?

它应该支持 MSI,确保你像下面那样启用 MSI。

此外,此doc中的第4步还提到了启用MSI的CLI命令。

az webapp identity assign --resource-group AppSvc-DockerTutorial-rg --name <app-name> --query principalId --output tsv

使用容器的应用服务时,“平台”环境变量(包括托管标识和应用设置)仅在容器初始化时可用。 为了使这些变量可以从容器中访问,必须将以下行合并到容器启动脚本中(从 Dockerfile ENTRYPOINT 调用):

eval $(printenv | sed -n "s/^\([^=]\+\)=\(.*\)$/export =/p" | sed 's/"/\\"/g' | sed '/=/s//="/' | sed 's/$/"/' >> /etc/profile)