Azure 函数应用程序 blob 触发器无法上传文件

Azure function app blob trigger cannot upload file

我创建了一个 blob 触发器,它接受来自 blob 的文件,将其解压缩并使用流将其移动到另一个 blob。

我的代码是这样的

[FunctionName("Requests")]
[StorageAccount("samplecontainer")]
public static void Run([BlobTrigger("incoming/{name}")]Stream myBlob,
    [Blob("processing/{name}.xml", FileAccess.Write)] TextWriter output,
    string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    string returnValue;

    using (Stream blob = myBlob)
    {
        using (GZipStream decompressionStream = new GZipStream(blob, CompressionMode.Decompress))
        {
            log.LogInformation($"Unzipping file");
            name = name.Replace(".gz", "");
            var content = String.Empty;
            using (StreamReader reader = new StreamReader(decompressionStream))
            {
                content = reader.ReadToEnd();
                reader.Close();

            }
            returnValue = content;
        }
    }
    log.LogInformation($"C# Blob trigger function finished processing blob\n Name:{name} \n Now writing to xml");
    output.WriteLine(returnValue);
}

这实际上可以工作,而 运行 这在本地使用“AzureWebJobsStorage”:“UseDevelopmentStorage=true”在我的 local.settings.json 文件中。

但是,一旦我部署了这个应用程序并使用 Azure 存储资源管理器将文件上传到真实容器,什么也没有发生,activity 日志显示操作在 Write.Tiny.txt.gz 中失败,无法查找文件 'D:\home\site\wwwroot\Requests\tiny.txt.gz'.

我有有效的 http 触发器,我尝试关闭配置 WEBSITE_RUN_FROM_PACKAGE 但没有效果。我可能缺少某些设置或配置吗? 当我在函数应用程序中进入此路径并 cat function.json 我得到这个:

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.29",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "blobTrigger",
      "connection": "samplecontainer",
      "path": "incoming/{name}",
      "name": "myBlob"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/azure-functions.dll",
  "entryPoint": "Requests.Run"
}

好的,我可以重现你的问题。

既然可以在本地工作,那么你的代码应该没有问题。

我可以解释为什么会这样。您在 azure 上的函数应用没有可以将数据写入 azure blob 存储的 RBAC。

以下步骤可以解决问题:

首先,创建函数应用程序的标识。

其次,将您的函数应用的 RBAC 角色添加到存储帐户。

对了,以上设置不会立即生效,需要等待几分钟才能生效。

我完全相信我还需要 Bowman Zhu 的回答才能正常工作,但在我的具体情况下,我忘记在我的 appSettings.json 中将存储帐户添加为连接字符串,因为我们最近更新到Microsoft.Azure.WebJobs.Extensions.Storage 版本 3,这是我们的第一个 blob 触发器。

在appSettings.json中:

{
  "ConnectionStrings": {
    "AzureWebJobsStorage": "{endpoint}"
  }
}