使用托管标识的 Azure Function App Blob 触发器不起作用

问题描述 投票:0回答:1

在天蓝色中,我在VNET中部署了一个功能应用程序,旁边还有一个子网,其中包含通过私有DNS区域(每种存储类型一个)连接到存储帐户专用端点,该子网配置为仅允许从选定的虚拟网络和 IP 地址进行访问。 存储 Blob 数据所有者的 RBAC 角色已分配给函数应用程序。

我使用 Visual Studio 创建了一个 blob 触发器:

    [Function(nameof(BlobTriggered))]
     public async Task BlobTriggered([BlobTrigger("testContainer/{name}", Connection = "Storage")] Stream stream, string name) {
       // Log information
    }

在门户中我设置了以下环境变量:

Storage = DefaultEndpointsProtocol=https;AccountName=testStorage2342;EndpointSuffix=core.windows.net;Authentication=ManagedIdentity
Storage__blobServiceUri = https://testStorage2342.blob.core.windows.net

Visual Studio 在存储中创建了两个容器和一个名为 AzureWebJobsStorage__AccountName 的环境变量。

每当我部署 Function App 并将文件添加到 testContainer 时,什么也没有发生。如果我单击门户中的功能并选择“集成”并单击触发器,它会显示没有现有存储帐户连接。有什么想法如何解决这个问题吗?

azure azure-functions azure-storage-account vnet azure-blob-trigger
1个回答
0
投票

首先,与Vnet集成的存储帐户:

enter image description here

然后,在与存储帐户相同的位置创建一个功能应用程序并集成相同的 Vnet:

enter image description here

在其中启用托管身份:

enter image description here

将存储 blob 所有者和贡献者角色授予 Function App 托管身份:

enter image description here

然后添加以下应用程序设置:

enter image description here

{
    "name": "rithcon__accountName",
    "value": "rithwik81cf",
    "slotSetting": false
  },
  {
    "name": "rithcon__blobServiceUri",
    "value": "https://rithwik81cf.blob.core.windows.net/",
    "slotSetting": false
  },
  {
    "name": "rithcon__credential",
    "value": "managedIdentity",
    "slotSetting": false
  },
  {
    "name": "rithcon__queueServiceUri",
    "value": "https://rithwik81cf.queue.core.windows.net/",
    "slotSetting": false
  }

代码:

函数.cs:

using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace FunctionApp16
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function(nameof(Function1))]
        public async Task Run([BlobTrigger("rithcnt/{name}", Connection = "rithcon")] Stream stream, string name)
        {
            using var blobStreamReader = new StreamReader(stream);
            var content = await blobStreamReader.ReadToEndAsync();
            _logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {content}");
        }
    }
}

集成部分如下所示:

enter image description here

输出:

功能应用程序被触发:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.