[英]Connect Django with Azure MS SQL Server DB using managed identity
[英]Azure SQL Server Database connect using Azure Managed Service Identity (MSI)
我想使用带有MSI(托管服务标识)身份验证的python Azure Functions访问Azure SQL 数据库。
我试图找出如何将 Azure sql 与 MSI 从用于 python 的 azure 函数连接起来,但我没有得到任何信息。
有没有办法在 Azure Functions 中使用 MSI 访问 Azure SQL Server 数据库?
我想访问 Azure SQL 数据库,而无需使用 python 的 azure 函数在我的代码中传递凭据。
我从 azure 函数为 python 启用了身份选项。
如果你只是想在你的 Azure 函数中隐藏你的 Azure SQL 连接字符串,使用 Azure Key Vault 和 MSI 将是这里的最佳实践:只需将你的 Azure SQL 连接字符串保存为 Azure Key Vault 中的秘密,然后按照本指南做一些您的 Azure 函数上的配置将满足您的要求:您的凭据永远不会出现在您的 Azure 函数中。
我创建了一个密钥保管库并将我的 SQL 服务器连接字符串作为机密存储在 Azure 密钥保管库中,请注意机密标识符,因为我们稍后将使用它:
转到您的密钥保管库,为您的函数 msi 配置访问策略以确保您的函数可以访问机密: 在您的配置后保存它:
这是我的 python 演示代码,正如你所看到的,我正在从 Azure Web 应用程序读取“SQLConn”:
import logging
import os
import azure.functions as func
import pyodbc
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
cnxn = pyodbc.connect(os.environ["SQLConn"])
cursor = cnxn.cursor()
cursor.execute("select @@version")
row = cursor.fetchall()
return func.HttpResponse(str(row))
该值应为:
@Microsoft.KeyVault(SecretUri=<secret_uri_with_version which you noted from key valut>)
完成这些步骤后,您的 azure 函数将能够从密钥保管库中获取 SQL 连接字符串,并且它不会出现在您的函数应用设置中,并且无需更改代码。
顺便说一句,如果您仍然想使用 MSI 来获取访问令牌以连接到您的 Azure SQL , 我在这里发布了一个新的演示,这将对您有所帮助。
我刚刚做了一个快速测试。 完整的一步一步在这里: https : //github.com/crgarcia12/azure-function-msi-python
概括:
你需要:
pyodbc.connect
使用Authentication=ActiveDirectoryMsi
。要将 MSI 用户添加到数据库,您必须使用 AAD 管理员进行连接,然后运行以下查询:
CREATE USER "<MSI user display name>" FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER "<MSI user display name>" -- grant permission to read to database
ALTER ROLE db_datawriter ADD MEMBER "<MSI user display name>" -- grant permission to write to database
<MSI user display name>
通常是 Azure 函数名称。 您还可以在 PowerShell 中使用Get-AzureADObjectByObjectId -ObjectIds
获取它
这是一个 hello-world 函数的源代码:
import logging
import azure.functions as func
# Sql driver
import pyodbc
def main(req: func.HttpRequest) -> func.HttpResponse:
try:
logging.info('Python HTTP trigger function processed a request.')
# Connecting to Azure SQl the standard way
server = 'tcp:<servername>.database.windows.net'
database = '<dbname>'
driver = '{ODBC Driver 17 for SQL Server}' # Driver 13 did not work for me
with pyodbc.connect(
"Driver="
+ driver
+ ";Server="
+ server
+ ";PORT=1433;Database="
+ database
+ ";Authentication=ActiveDirectoryMsi", # This is important :)
) as conn:
logging.info("Successful connection to database")
with conn.cursor() as cursor:
#Sample select query
cursor.execute("SELECT Name FROM People;")
peopleNames = ''
row = cursor.fetchone()
while row:
peopleNames += str(row[0]).strip() + " "
row = cursor.fetchone()
return func.HttpResponse(f"Hello {peopleNames}!")
except Exception as e:
return func.HttpResponse(str(e))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.