Python 使用托管身份将功能应用程序连接到CosmosDB

Python 使用托管身份将功能应用程序连接到CosmosDB,python,azure,azure-functions,azure-cosmosdb,Python,Azure,Azure Functions,Azure Cosmosdb,我正在尝试在函数应用程序中编写一个函数,该应用程序可以处理CosmosDB中的数据。如果我把读写键放到环境变量中,它就会工作。为了使它更加健壮,我希望它能作为一个托管身份应用程序工作。该应用程序在Cosmos DB上具有“DocumentDB帐户贡献者”角色 但是,CosmosClient构造函数不接受凭据,需要读写密钥。我一直在寻找azure.mgmt.cosmosdb.operations的兔子洞,那里有一个数据库AccountsOperations类,带有列表键()方法。但是我找不到一个简

我正在尝试在函数应用程序中编写一个函数,该应用程序可以处理CosmosDB中的数据。如果我把读写键放到环境变量中,它就会工作。为了使它更加健壮,我希望它能作为一个托管身份应用程序工作。该应用程序在Cosmos DB上具有“DocumentDB帐户贡献者”角色

但是,CosmosClient构造函数不接受凭据,需要读写密钥。我一直在寻找azure.mgmt.cosmosdb.operations的兔子洞,那里有一个
数据库AccountsOperations
类,带有
列表键()
方法。但是我找不到一个简单的方法来访问这个函数。如果我尝试创建该对象(需要从我的dbmgmt对象中非法获取配置、序列化器和反序列化器),它仍然需要
resourceGroupName
accountName

我忍不住想,我在某个地方拐错了弯,因为这必须以更直接的方式实现。特别是考虑到JavaScript SDK引用了一个更符合SubscriptionClient的逻辑类。但是,我在python端的任何地方都找不到该类。 有什么建议吗

从azure.identity导入DefaultAzureCredential
从azure.cosmos导入CosmosClient
从azure.mgmt.resource导入SubscriptionClient
从azure.mgmt.cosmosdb导入cosmosdb
from.cred_wrapper导入CredentialWrapper
def main(请求:func.HttpRequest)->func.HttpResponse:
请求\正文=请求获取\正文()
#凭证=DefaultAzureCredential()
# https://gist.github.com/lmazuel/cc683d82ea1d7b40208de7c9fc8de59d
凭证=凭证包装器()
uri=os.environ.get('cosmos-db-uri')
#db=CosmosClient(url=uri,credential=credential)#不起作用,需要一个RW/R密钥的凭据
#如果我用主键/辅键替换它,它就可以工作,但目标是消除对主键/辅键的依赖。
订阅\u客户端=订阅客户端(凭据)
subscription=next(subscription\u client.subscriptions.list())
dbmgmt=CosmosDB(凭证,订阅.subscription_id)#这不接受DB URI??
operations=list(dbmgmt.operations.list())#我在那里看到了list_keys()操作。。。

编辑 一个乐于助人的灵魂在这里提供了一个回应,但在我做出反应或接受它作为答案之前就把它移除了。他们指出有一个等价物,来自azure.mgmt.cosmosdb的
导入CosmosDBManagementClient
就可以做到这一点

从那以后,我就靠自己了,因为这导致了

ImportError: cannot import name 'CosmosDBManagementClient' from 'azure.mgmt.cosmosdb'
我相信问题的根源在于包
azure mgmt
的不兼容性。从my
requirements.txt中删除
azure mgmt
并仅加载cosmos和identiy相关软件包后,导入错误得到解决

这解决了90%的问题

dbmgmt=CosmosDBManagementClient(凭证,subscription.subscription\u id,c\u uri)
打印(dbmgmt.database\u accounts.list\u keys())

真的需要收集这些参数吗?与之相比,这似乎非常复杂。

对于其他希望使用托管身份访问CosmosDB的不幸者来说,截至2021年5月,这似乎还不可能


资料来源:关于那个乐于助人的灵魂是史蒂夫·赵(上帝保佑他:)的讨论。他确实为
CosmosDBManagementClient
添加了代码,但是该客户机用于对您的Cosmos DB帐户执行管理操作。您需要的是使用托管标识执行数据操作。我向他指出了这一点,这就是他删除答案的原因。此外,只有在Cosmos DB帐户上没有管理锁的情况下,
list\u keys()
方法才会起作用。是的,
resource\u group\u name
account\u name
方法中都需要
list\u keys
参数。谢谢你们两位的宝贵意见。经过进一步挖掘,似乎到2021年5月,从功能应用程序到cosmos的托管身份访问还不受支持。出于礼貌,我是用这个答案来结束我的问题,还是该怎么办?@Sebastiaan你可以发布一个答案来结束这个问题。
TypeError: list_keys() missing 2 required positional arguments: 'resource_group_name' and 'account_name'