You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_ID
  • AZURE_CLIENT_ID
  • AZURE_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:47:05