我正在为 Azure Durable Function 开发队列触发器。使用“queue_trigger”装饰器时,我需要提供一个连接字符串。但是,我需要避免直接使用连接字符串,而是使用托管标识连接到存储帐户/队列存储,最好使用 DefaultAzureCredential() 或类似方法。在下面的示例中,我当前在环境变量中设置了“QueueConnectionString”,但我想将其替换为托管身份以安全访问队列。
import azure.functions as func
import logging
import azure.durable_functions as adf
myApp = adf.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.durable_client_input(client_name="client")
@myApp.queue_trigger(arg_name="azqueue", queue_name="test", connection="QueueConnectionString")
async def begin_data_entry(azqueue: func.QueueMessage, client):
logging.info('Python HTTP trigger function processed a request.')
await client.start_new("activity_function_name", client_input={})
我使用
Managed identity
为 Azure 持久功能创建了一个示例队列触发器,使用 DefaultAzureCredential
处理发送到 Azure 存储队列的消息,它对我来说效果很好。
QueueConnectionString__queueServiceUri
中添加存储URIlocal.settings.json
,如下所示。local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python",
"QueueConnection__queueServiceUri": "https://<storage_name>.queue.core.windows.net/"
}
}
在代码中添加以下连接,它将从
local.settings.json
加载存储URI。
connection="QueueConnection__queueServiceUri"
代码:
import azure.functions as func
import logging
import azure.durable_functions as adf
from azure.identity import DefaultAzureCredential
from azure.storage.queue import QueueClient
myApp = adf.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.durable_client_input(client_name="client")
@myApp.queue_trigger(arg_name="azqueue", queue_name="test", connection="QueueConnection__queueServiceUri")
async def begin_data_entry(azqueue: func.QueueMessage, client):
logging.info('Python HTTP trigger function processed a request.')
await client.start_new("activity_function_name", client_input={})
我已将 owner 角色添加到服务原则,并将 Storage Queue Data Contributor 角色添加到 Azure 存储帐户中的函数应用程序,如下所示。
确保将以下 URI 添加到 Azure Function App > 环境变量 > 应用程序设置,如下所示。
"QueueConnection__queueServiceUri": "https://<storage_name>.queue.core.windows.net/"