使用Azure Python SDK创建资源时遇AuthorizationFailed授权错误
刚碰到这个错误的时候我也踩过坑,其实核心原因很清晰:你用的服务主体(就是CLIENT_ID对应的那个身份)没有在你的免费订阅(或目标资源组)上被授予执行Microsoft.Resources/subscriptions/resourcegroups/read操作的权限。哪怕是免费订阅,Azure的权限控制逻辑和付费订阅完全一致,下面是具体的解决步骤:
1. 先确认服务主体和订阅的关联正确性
首先得确保你的服务主体存在,并且和你使用的免费订阅是对应的:
- 打开Azure CLI,运行命令检查服务主体信息:
对比返回结果里的az ad sp show --id <你的CLIENT_ID>objectId和错误信息中的OBJECT_ID,确认是同一个身份。 - 再检查订阅是否正确:
确保返回的订阅名称、ID和你正在使用的免费订阅一致。az account show --subscription <你的SUBSCRIPTION_ID>
2. 给服务主体分配合适的权限角色
这是解决问题的关键,你需要手动给服务主体添加读取(或更高)的权限:
方式一:通过Azure Portal操作
- 登录Azure Portal,找到你的免费订阅页面,点击左侧菜单的「访问控制(IAM)」
- 点击顶部的「添加」→「添加角色分配」
- 在「角色」标签里,选择**「读者(Reader)」**(如果你的脚本需要创建/修改资源,就选「参与者(Contributor)」,遵循最小权限原则选合适的角色)
- 切换到「成员」标签,选择「用户、组或服务主体」,然后搜索你的
CLIENT_ID对应的服务主体名称,找到后添加进去 - 点击「查看 + 分配」完成操作
方式二:通过Azure CLI命令操作
如果习惯用命令行,直接运行:
# 给订阅级别的读取权限(如果需要全订阅操作) az role assignment create --assignee <你的CLIENT_ID> --role "Reader" --scope "/subscriptions/<你的SUBSCRIPTION_ID>" # 或者只给特定资源组的权限(更安全) az role assignment create --assignee <你的CLIENT_ID> --role "Reader" --scope "/subscriptions/<你的SUBSCRIPTION_ID>/resourceGroups/<目标资源组名称>"
3. 验证权限并重新测试
- 注意:Azure的权限分配可能有1-5分钟的同步延迟,别急着立刻重试
- 等待几分钟后,重新运行你的Python脚本,应该就能正常读取资源组了
- 也可以用CLI验证权限是否生效:
查看返回结果里是否有你刚才添加的角色记录az role assignment list --assignee <你的CLIENT_ID> --subscription <你的SUBSCRIPTION_ID>
4. 检查Python代码的认证逻辑
最后再确认下你的代码里认证部分是否正确,比如服务主体认证的标准写法:
from azure.common.credentials import ServicePrincipalCredentials from azure.mgmt.resource import ResourceManagementClient # 初始化凭据 credentials = ServicePrincipalCredentials( client_id="你的CLIENT_ID", secret="你的CLIENT_SECRET", tenant="你的TENANT_ID" ) # 初始化资源管理客户端 resource_client = ResourceManagementClient( credentials, "你的SUBSCRIPTION_ID" ) # 尝试读取资源组列表 try: resource_groups = resource_client.resource_groups.list() for group in resource_groups: print(f"资源组名称: {group.name}") except Exception as e: print(f"错误信息: {str(e)}")
确保所有参数(CLIENT_ID、SUBSCRIPTION_ID等)都没有拼写错误,尤其是SUBSCRIPTION_ID要和你的免费订阅完全一致。
额外注意点
- 免费订阅的管理员权限:你作为免费订阅的创建者有全局管理员权限,但服务主体不会自动继承这个权限,必须手动分配角色
- 最小权限原则:尽量不要给服务主体订阅级别的全权限,只授予它需要操作的资源组或资源类型的权限,这样更安全
内容的提问来源于stack exchange,提问作者im_maddy
相关产品推荐
相关产品推荐

