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}"
}
}
我创建了一个 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}"
}
}