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

如何将Azure函数Queue Trigger迁移至托管身份(移除连接字符串)

将Azure函数Queue Trigger迁移至托管身份认证

一、配置托管身份权限(必做前提)

  • 为Azure函数启用系统分配或用户分配的托管身份
  • 在目标存储账户的「访问控制(IAM)」页面,为该托管身份分配存储队列数据参与者角色,作用域选择存储账户或特定队列(按需)

二、更新配置文件

  1. 从appsettings.json中移除原有的AzureWebStorage连接字符串
  2. 添加存储队列服务的URI配置:
{
  "SGWQueueName": "你的目标队列名称",
  "QueueStorageUri": "https://myaccount.queue.core.windows.net/"
}

三、修改Program.cs的服务配置

  1. 安装必要NuGet包:

    • Azure.Identity:提供托管身份认证凭据
    • Microsoft.Azure.WebJobs.Extensions.Storage.Queues:确保使用支持托管身份的最新版本
  2. 调整WebJobs队列扩展的配置逻辑,替换连接字符串为托管身份认证:

var builder = Host.CreateDefaultBuilder(args)
    .UseSerilog()
    .ConfigureAppConfiguration((context, config) =>
    {
        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
    });           

builder.ConfigureServices(services =>
{
    services.AddTransient<ILargePayload, LargePaylaod>();
    services.AddLogging();
    // 注册托管身份凭据(系统分配身份直接用DefaultAzureCredential,用户分配身份需指定ClientId)
    services.AddSingleton<TokenCredential>(sp =>
    {
        var config = sp.GetRequiredService<IConfiguration>();
        // 若使用用户分配身份,取消注释并填入ClientId
        // var clientId = config["ManagedIdentityClientId"];
        // return new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = clientId });
        return new DefaultAzureCredential();
    });
});

builder.ConfigureWebJobs(b =>
{
    b.AddAzureStorageCoreServices();
    b.AddAzureStorageBlobs();
    b.AddExecutionContextBinding();
    b.AddAzureStorageQueues(que =>
    {
        que.BatchSize = int.Parse(_CommonMethods.GetEnvironmentVariable("extensions:queues:batchSize", GlobalVariables.ConfigType.GlobalConstants));
        que.MaxDequeueCount = int.Parse(_CommonMethods.GetEnvironmentVariable("extensions:queues:maxDequeueCount", GlobalVariables.ConfigType.GlobalConstants));
        que.NewBatchThreshold = int.Parse(_CommonMethods.GetEnvironmentVariable("extensions:queues:newBatchThreshold", GlobalVariables.ConfigType.GlobalConstants));
    })
    // 绑定存储URI与托管身份凭据
    .ConfigureQueues(options =>
    {
        var sp = builder.Services.BuildServiceProvider();
        var config = sp.GetRequiredService<IConfiguration>();
        var credential = sp.GetRequiredService<TokenCredential>();
        var queueUri = new Uri(config["QueueStorageUri"]);
        
        options.Accounts.Add(new QueueAccountConfiguration(queueUri, credential));
    });
});

var host = builder.Build();
Log.Logger = new LoggerConfiguration()
           .ReadFrom.Configuration(host.Services.GetRequiredService<IConfiguration>()) 
           .CreateLogger();
ServiceLocator.Current = host.Services;
using (host)
{
    await host.RunAsync();
}

四、更新QueueTrigger方法属性

修改QueueTrigger的Connection参数,指向配置的存储URI项:

public async Task BlobTrigger([QueueTrigger("%SGWQueueName%", Connection = "QueueStorageUri")] string reqQueueMessage, Microsoft.Azure.WebJobs.ExecutionContext executionContext)
{
    try
    {
        await _largePayload.Process(executionContext.InvocationId, reqQueueMessage);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex.Message, SeverityLevel.Error);
    }            
}

关键注意事项

  • 本地调试时,需确保本地环境已通过Azure CLI、Visual Studio或环境变量完成Azure身份验证(DefaultAzureCredential会自动识别本地身份)
  • 若存储账户启用了防火墙/VNet限制,需将函数所在网络加入存储账户的允许列表
  • 确认存储队列名称配置SGWQueueName正确无误

内容的提问来源于stack exchange,提问作者Raghu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:31:14