如何在Azure容器Apps的Django中同时使用服务主体与系统分配身份
在Azure Container Apps中同时使用Service Principal与系统分配托管身份
背景
- 此前在AKS部署应用,通过设置身份验证环境变量,Azure Python SDK可无缝连接订阅资源
- 现需将应用迁移至订阅B的Azure Container Apps(ACA),但仍需访问订阅A的资源
- 团队已获安全许可,可继续用Service Principal访问订阅A;订阅A与B采用Hub-and-Spoke网络配置,流量已开放
- 订阅B中的MySQL数据库,Team B仅允许通过ACA的**系统分配托管身份(MSI)**访问,拒绝为Service Principal授权
当前正常配置
Django应用通过DefaultAzureCredential成功访问订阅A资源,已配置环境变量:
AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRET
核心需求
如何在Django中实现:
- MySQL数据库使用系统分配托管身份验证
- 其余Python SDK调用保持使用
DefaultAzureCredential(依赖Service Principal)
尝试操作与问题
错误的Django数据库配置
尝试配置MySQL连接时误用了SQL Server引擎,代码如下:
DATABASES = { "default": { "ENGINE": "mssql", "NAME": env("DATABASE_NAME"), "HOST": env("DATABASE_HOST"), "PORT": 3306, "CONN_MAX_AGE": env.int("DATABASE_CONN_MAX_AGE", default=0), "OPTIONS": { "driver": "ODBC Driver 18 for SQL Server", "extra_params": "Authentication=ActiveDirectoryMsi;Encrypt=yes;TrustServerCertificate=no", }, } }
触发错误:
File "/home/docker4sg/miniconda3/envs/py310/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py", line 200, in get_new_connection conn = Database.connect(**conn_params) TypeError: 'driver' is an invalid keyword argument for this function
推测为驱动/引擎配置错误,与身份验证方式无关。
AZ CLI调试MSI
执行az login --identity报错:
Failed to connect to MSI. Please make sure MSI is configured correctly. Get Token request returned: <Response [405]>
使用workaround后再次执行,得到:
No access was configured for the VM, hence no subscriptions were found. If this is expected, use '--allow-no-subscriptions' to have tenant level access.
ManagedIdentityCredential调试
指定client_id初始化凭据时报错:
from azure.identity import ManagedIdentityCredential credential = ManagedIdentityCredential( client_id="XXXXXXX-XXXX-XXXX-XXXX-XXXXXXX", )
错误信息:
azure.identity._exceptions.CredentialUnavailableError: App Service managed identity configuration not found in environment. invalid_scope
移除client_id后可成功获取令牌,但连接MySQL时失败:
from azure.identity import ManagedIdentityCredential credential = ManagedIdentityCredential() token_msi = credential.get_token( "https://ossrdbms-aad.database.windows.net/.default" ).token import pymysql pymysql.connect( host="xxxxxxxxxxxxx.mysql.database.azure.com", user="xxxxxx-xxxx-xxxx-xxxx-xxxxxx", password=token_msi, db="my_db", )
错误:
pymysql.err.OperationalError: (1045, "Access denied for user '52181d1e-0ab2-4e0c-b19d-876223d1f44d'@'10.34.45.173' (using password: YES)")
已确认IAM角色权限配置正确,但目标数据库尚未创建。
疑问
是否可以同时使用Service Principal(通过DefaultAzureCredential)和系统分配托管身份(用于MySQL)?若可以,如何配置Django实现该需求?
内容的提问来源于stack exchange,提问作者BeGreen
相关产品推荐
相关产品推荐

