在天蓝色中,我在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 时,什么也没有发生。如果我单击门户中的功能并选择“集成”并单击触发器,它会显示没有现有存储帐户连接。有什么想法如何解决这个问题吗?
首先,与Vnet集成的存储帐户:
然后,在与存储帐户相同的位置创建一个功能应用程序并集成相同的 Vnet:
在其中启用托管身份:
将存储 blob 所有者和贡献者角色授予 Function App 托管身份:
然后添加以下应用程序设置:
{
"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}");
}
}
}
集成部分如下所示:
输出:
功能应用程序被触发: