如何从 Azure 容器应用服务向 Azure ACR 进行身份验证
Posted
技术标签:
【中文标题】如何从 Azure 容器应用服务向 Azure ACR 进行身份验证【英文标题】:How to authenticate with Azure ACR from Azure container app service 【发布时间】:2020-09-06 18:55:15 【问题描述】:我正在尝试设置我的应用容器服务,以便它可以使用托管身份从我们的 ACR 中提取 docker 映像,而不是将用户名和密码存储在应用设置中(除了我们想要编写这些部署脚本的任何其他内容如果应用服务需要用户名和密码,那么我们必须将它们存储在源代码管理中)。
令人难以置信的是,我在这种情况下找不到任何文档。我发现最接近的是使用托管身份从 VM [https://docs.microsoft.com/en-us/azure/container-registry/container-registry-authentication-managed-identity] 中提取 ACR 图像,我不能将其用作最后一步的指南(我唯一的一点是缺少)是SSH 进入虚拟机并在命令行运行az acr login --name myContainerRegistry
。
我要去的地方:
我已经创建了 ACR 和容器应用服务 我已将角色ACR Pull
和 Reader
授予应用服务的系统分配身份
应用服务在尝试拉取容器映像时访问被拒绝
我不知道下一步该做什么;就像我说的,我找不到关于这种情况的任何指南。
【问题讨论】:
我不确定这是否可能。但另一种方法是从部署管道访问 Azure Key Vault 以获取凭据并将它们注入到az webapp config container set
命令中。请注意,这仅在部署新环境时才需要,而不是在每次代码部署时都需要。部署环境是基础设施自动化而不是 CI/CD。 docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/…
谢谢,虽然我不确定这是否对我们有用,因为我们使用的是 Terraform 而不是 ARM 或直接使用 CLI。
【参考方案1】:
现在可以通过设置 acrUseManagedIdentityCreds 属性来实现
这是一个包含步骤的教程: https://docs.microsoft.com/en-us/azure/app-service/tutorial-custom-container?pivots=container-linux#configure-app-service-to-deploy-the-image-from-the-registry
这里是具体的命令
-
授予托管身份访问容器注册表的权限:
az role assignment create --assignee <principal-id> --scope /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/<registry-name> --role "AcrPull"
-
将您的应用配置为使用托管标识从 Azure 容器注册表中提取
az resource update --ids /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Web/sites/<app-name>/config/web --set properties.acrUseManagedIdentityCreds=True
【讨论】:
【参考方案2】:您对 Web 应用的托管标识的理解有误。 Web 应用程序的托管标识用于访问 Web 应用程序容器内的其他资源。这意味着 Web 应用程序容器已经在运行。但是当你拉取镜像时,容器运行不好。所以不可能使用托管身份从 ACR 中提取图像。您只能使用用户名和密码从 ACR 中提取图像。
【讨论】:
【参考方案3】:要将应用服务配置为从 ACR 中提取,您可以使用服务主体方法并设置访问级别,就像您已经完成的那样。
https://github.com/Azure/app-service-linux-docs/blob/master/service_principal_auth_acr.md
就带有 terraform 的应用服务而言,您可以使用以下方法在 Azure Key Vault 中注入 ServicePrincipal 凭据机密的设置
https://www.terraform.io/docs/providers/azurerm/r/app_service.html#app_settings
【讨论】:
感谢@djsly,我使用您的想法将密码放入密钥保管库实例中,因此现在我的 terraform 状态仅包含密钥保管库引用 (docs.microsoft.com/en-gb/azure/app-service/…) 作为应用设置,而不是密码本身以上是关于如何从 Azure 容器应用服务向 Azure ACR 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何从应用服务向 Azure 上的 EventHub 发送日志
如何通过azure设备配置服务从azure功能向iot设备发送自定义错误消息?