Azure Functions的Azure Blob storage触发器

检测到新的或更新的 blob 时,Blob storage触发器启动函数。 blob 内容作为函数的 输入提供

提示

有多种方法可以根据对storage容器中的 blob 的更改来执行函数代码。 如果选择使用Blob storage触发器,则提供两个实现:基于轮询的一个(本文中引用)和基于事件的实现。 建议使用基于事件的实现,因为它的延迟比其他实现低。 此外,Flex Consumption 计划仅支持基于事件的Blob storage触发器。

有关Blob storage触发器的两个实现和其他触发选项之间的差异的详细信息,请参阅使用 blob 的实现

有关设置和配置详细信息的信息,请参阅 overview

重要

本文使用选项卡来支持多个版本的 Node.js 编程模型。 v4 模型已正式发布,旨在为 JavaScript 和 TypeScript 开发人员提供更为灵活和直观的体验。 有关 v4 模型工作原理的更多详细信息,请参阅 Azure Functions Node.js 开发人员指南。 要详细了解 v3 和 v4 之间的差异,请参阅迁移指南

Azure Functions支持两个 Python 编程模型。 定义绑定的方式取决于选择的编程模型。

使用 Python v2 编程模型,可以直接在 Python 函数代码中使用修饰器定义绑定。 有关详细信息,请参阅 Python 开发人员指南

本文同时支持两个编程模型。

示例

可使用以下 C# 模式之一来创建 C# 函数:

  • 独立辅助角色模型:编译的 C# 函数,该函数在独立于运行时的工作进程中运行。 独立工作进程需要支持在 LTS 和非 LTS 版本上运行的 C# 函数,.NET和.NET框架。 独立工作进程函数的扩展使用 Microsoft.Azure.Functions.Worker.Extensions.* 命名空间。
  • 进程内模型:编译的 C# 函数,该函数在与 Functions 运行时相同的进程中运行。 在此模型的变体中,可以使用 C# 脚本运行 Functions,该脚本主要用于 C# 门户编辑。 进程内函数的扩展使用 Microsoft.Azure.WebJobs.Extensions.* 命名空间。

以下示例是一个 C# 函数,该函数在独立工作进程中运行,并将 blob 触发器与 blob 输入和 blob 输出 blob 绑定配合使用。 在 test-samples-trigger 容器中创建 blob 时,会触发该函数。 它从 test-samples-input 容器读取文本文件,并基于已触发文件的名称在输出容器中创建一个新的文本文件。

    public static class BlobFunction
    {
        [Function(nameof(BlobFunction))]
        [BlobOutput("test-samples-output/{name}-output.txt")]
        public static string Run(
            [BlobTrigger("test-samples-trigger/{name}")] string myTriggerItem,
            [BlobInput("test-samples-input/sample1.txt")] string myBlob,
            FunctionContext context)
        {
            var logger = context.GetLogger("BlobFunction");
            logger.LogInformation("Triggered Item = {myTriggerItem}", myTriggerItem);
            logger.LogInformation("Input Item = {myBlob}", myBlob);

            // Blob Output
            return "blob-output content";
        }
    }

此函数使用字节数组在容器中添加 myblob 或更新 blob 时写入日志。

基于轮询:

以下示例使用默认轮询触发器:

@FunctionName("blobprocessor")
public void run(
  @BlobTrigger(name = "file",
               dataType = "binary",
               path = "myblob/{name}",
               connection = "MyStorageAccountAppSetting") byte[] content,
  @BindingName("name") String filename,
  final ExecutionContext context
) {
  context.getLogger().info("Name: " + filename + " Size: " + content.length + " bytes");
}

以下示例使用事件网格触发器:

@FunctionName("blobprocessor")
public void run(
  @BlobTrigger(name = "file",
               dataType = "binary",
               path = "myblob/{name}",
               source = "EventGrid",
               connection = "MyStorageAccountAppSetting") byte[] content,
  @BindingName("name") String filename,
  final ExecutionContext context
) {
  context.getLogger().info("Name: " + filename + " Size: " + content.length + " bytes");
}

SDK 类型示例使用 BlobClient 来access blob 的属性。

@FunctionName("processBlob")
public void run(
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage") BlobClient blob,
        @BindingName("name") String file,
        ExecutionContext ctx)
{
    ctx.getLogger().info("Size = " + blob.getProperties().getBlobSize());
}

SDK 类型示例使用 BlobContainerClient 来access触发函数的容器中的 blob 的相关信息。

@FunctionName("containerOps")
public void run(
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage") BlobContainerClient container,
        ExecutionContext ctx)
{
    container.listBlobs()
            .forEach(b -> ctx.getLogger().info(b.getName()));
}

SDK 类型示例 用于 BlobClient 从有关触发执行的 Blob 的输入绑定中获取信息。

@FunctionName("checkAgainstInputBlob")
public void run(
        @BlobInput(
                name = "inputBlob",
                path = "inputContainer/input.txt") BlobClient inputBlob,
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage",
                dataType = "string") String triggerBlob,
        ExecutionContext ctx)
{
    ctx.getLogger().info("Size = " + inputBlob.getProperties().getBlobSize());
}

此示例演示如何从 Storage Blob 触发器和 HTTP 触发器上的输入绑定获取 BlobClient:

import "@azure/functions-extensions-blob"; // This is the mandatory first import for SDK binding
import { StorageBlobClient } from "@azure/functions-extensions-blob";
import { app, InvocationContext } from "@azure/functions";

export async function storageBlobTrigger(
  blobStorageClient: StorageBlobClient, // SDK binding provides this client
  context: InvocationContext
): Promise<void> {
  context.log(`Blob trigger processing: ${context.triggerMetadata.name}`);

  // Access to full SDK capabilities
  const blobProperties = await blobStorageClient.blobClient.getProperties();
  context.log(`Blob size: ${blobProperties.contentLength}`);

  // Download blob content
  const downloadResponse = await blobStorageClient.blobClient.download();
  context.log(`Content: ${downloadResponse}`);
}

// Register the function
app.storageBlob("storageBlobTrigger", {
  path: "snippets/{name}",
  connection: "AzureWebJobsStorage",
  sdkBinding: true, // Enable SDK binding
  handler: storageBlobTrigger,
});

此示例演示如何使用 HTTP 触发器从Storage Blob 输入绑定获取 ContainerClient

import "@azure/functions-extensions-blob"; // This is the mandatory first import for SDK binding
import { StorageBlobClient } from "@azure/functions-extensions-blob";
import {
  app,
  HttpRequest,
  HttpResponseInit,
  input,
  InvocationContext,
} from "@azure/functions";

const blobInput = input.storageBlob({
  path: "snippets",
  connection: "AzureWebJobsStorage",
  sdkBinding: true,
});

export async function listBlobs(
  request: HttpRequest,
  context: InvocationContext
): Promise<HttpResponseInit> {
  // Get input binding for a specific container
  const storageBlobClient = context.extraInputs.get(
    blobInput
  ) as StorageBlobClient;

  // List all blobs in the container
  const blobs = [];
  for await (const blob of storageBlobClient.containerClient.listBlobsFlat()) {
    blobs.push(blob.name);
  }

  return { jsonBody: { blobs } };
}

app.http("listBlobs", {
  methods: ["GET"],
  authLevel: "function",
  extraInputs: [blobInput],
  handler: listBlobs,
});

以下示例显示 blob 触发器 TypeScript 代码。 在 samples-workitems 容器中添加或更新 Blob 时,该函数会写入日志。

blob 触发器路径samples-workitems/{name}中的字符串{name}创建一个绑定表达式,可用于access触发 blob 的文件名。 有关详细信息,请参阅本文下文中的 Blob 名称模式

import { app, InvocationContext } from '@azure/functions';

export async function storageBlobTrigger1(blob: Buffer, context: InvocationContext): Promise<void> {
    context.log(
        `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
    );
}

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    handler: storageBlobTrigger1,
});

以下示例显示 blob 触发器 JavaScript 代码。 在 samples-workitems 容器中添加或更新 Blob 时,该函数会写入日志。

blob 触发器路径samples-workitems/{name}中的字符串{name}创建一个绑定表达式,可用于access触发 blob 的文件名。 有关详细信息,请参阅本文下文中的 Blob 名称模式

const { app } = require('@azure/functions');

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    handler: (blob, context) => {
        context.log(
            `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
        );
    },
});

以下示例演示如何创建在将文件添加到 source blob storage 容器时运行的函数。

函数配置文件 (function.json) 包含一个绑定,其 typeblobTriggerdirection 设置为 in

{
  "bindings": [
    {
      "name": "InputBlob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "source/{name}",
      "connection": "MyStorageAccountConnectionString"
    }
  ]
}

下面是 run.ps1 文件的关联代码。

param([byte[]] $InputBlob, $TriggerMetadata)

Write-Host "PowerShell Blob trigger: Name: $($TriggerMetadata.Name) Size: $($InputBlob.Length) bytes"

此示例使用 SDK 类型直接access由Blob storage触发器提供的基础 BlobClient 对象:

import logging

import azure.functions as func
import azurefunctions.extensions.bindings.blob as blob

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.blob_trigger(
    arg_name="client", path="PATH/TO/BLOB", connection="AzureWebJobsStorage"
)
def blob_trigger(client: blob.BlobClient):
    logging.info(
        f"Python blob trigger function processed blob \n"
        f"Properties: {client.get_blob_properties()}\n"
        f"Blob content head: {client.download_blob().read(size=1)}"
    )

有关使用其他 SDK 类型的示例,请参阅 ContainerClientStorageStreamDownloader 示例。 有关如何在函数应用中包括 SDK 类型绑定的分步教程,请遵循适用于 Blob 示例的 Python SDK 绑定

若要了解详细信息,包括支持其他 SDK 类型绑定的内容,请参阅 SDK 类型绑定

此示例记录传入 Blob 元数据中的信息。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="BlobTrigger1")
@app.blob_trigger(arg_name="myblob", 
                  path="PATH/TO/BLOB",
                  connection="CONNECTION_SETTING")
def test_function(myblob: func.InputStream):
   logging.info(f"Python blob trigger function processed blob \n"
                f"Name: {myblob.name}\n"
                f"Blob Size: {myblob.length} bytes")

特性

in-processisolated worker process C# 库都使用 BlobAttribute 属性来定义函数。 C# 脚本改用 function.json 配置文件,如 C# 脚本指南中所述。

该特性的构造函数采用以下参数:

参数 说明
BlobPath Blob 的路径。
连接 指定如何连接到 Azure Blob 的应用设置或设置集合的名称。 请参阅连接
Access 表示是要读取还是写入。
来源 设置触发事件的源。 用于BlobTriggerSource.EventGrid基于事件网格的 Blob 触发器,该触发器提供较低的延迟。 默认值为 BlobTriggerSource.LogsAndContainerScan,它使用标准轮询机制来检测容器中的更改。

下面是某个方法签名中的 BlobTrigger 特性:

        [Function(nameof(BlobFunction))]
        [BlobOutput("test-samples-output/{name}-output.txt")]
        public static string Run(
            [BlobTrigger("test-samples-trigger/{name}")] string myTriggerItem,
            [BlobInput("test-samples-input/sample1.txt")] string myBlob,
            FunctionContext context)

在本地开发时,需要将应用程序设置添加到 集合中的 Values中。

修饰符

仅适用于 Python v2 编程模型。

对于使用修饰器定义的 Python v2 函数,blob_trigger 修饰器上的以下属性定义Blob Storage触发器:

properties 说明
arg_name 在函数签名中声明参数名称。 触发函数时,此参数的值包含队列消息的内容。
path 要监视的 container。 可以是某种 Blob 名称模式
connection storage帐户connection string。
source 设置触发事件的源。 用于EventGrid基于事件网格的 Blob 触发器,该触发器提供较低的延迟。 默认值为 LogsAndContainerScan,它使用标准轮询机制来检测容器中的更改。

对于使用 function.json 定义的 Python 函数,请参阅“配置”部分。

批注

@BlobTrigger 属性用于向触发函数的 blob 提供access。 有关详细信息,请参阅触发器示例。 使用 source 属性设置触发事件的源。 用于EventGrid基于事件网格的 Blob 触发器,该触发器提供较低的延迟。 默认值为 LogsAndContainerScan,它使用标准轮询机制来检测容器中的更改。 |

配置

仅适用于 Python v1 编程模型

下表说明了可以在传递给 options 方法的 app.storageBlob() 对象上设置的属性。

properties 说明
路径 要监视的 container。 可以是某种 Blob 名称模式
连接 指定如何连接到 Azure Blob 的应用设置或设置集合的名称。 请参阅连接
设置触发事件的源。 用于EventGrid基于事件网格的 Blob 触发器,该触发器提供较低的延迟。 默认值为 LogsAndContainerScan,它使用标准轮询机制来检测容器中的更改。

下表解释了在 function.json 文件中设置的绑定配置属性。

“function.json”属性 说明
类型 必须设置为 blobTrigger。 在Azure portal中创建触发器时,会自动设置此属性。
方向 必须设置为 in。 在Azure portal中创建触发器时,会自动设置此属性。 用法部分中已阐述异常。
名字 表示函数代码中的 Blob 的变量的名称。
路径 要监视的 container。 可以是某种 Blob 名称模式
连接 指定如何连接到 Azure Blob 的应用设置或设置集合的名称。 请参阅连接
设置触发事件的源。 用于EventGrid基于事件网格的 Blob 触发器,该触发器提供较低的延迟。 默认值为 LogsAndContainerScan,它使用标准轮询机制来检测容器中的更改。

有关完整示例的信息,请参阅示例部分

元数据

Blob 触发器提供了几个元数据属性。 这些属性可在其他绑定中用作绑定表达式的一部分,或者用作代码中的参数。 这些值具有与 CloudBlob 类型相同的语义。

properties 类型 说明
BlobTrigger string 触发 Blob 的路径。
Uri System.Uri 主位置的 blob 的 URI。
Properties BlobProperties Blob 的系统属性。
Metadata IDictionary<string,string> Blob 的用户定义元数据。

以下示例记录了触发 blob 的路径,包括容器:

public static void Run(string myBlob, string blobTrigger, ILogger log)
{
    log.LogInformation($"Full blob path: {blobTrigger}");
} 

元数据

Blob 触发器提供了几个元数据属性。 这些属性可在其他绑定中用作绑定表达式的一部分,或者用作代码中的参数。

properties 说明
blobTrigger 触发 Blob 的路径。
uri 主位置的 blob 的 URI。
properties Blob 的系统属性。
metadata Blob 的用户定义元数据。

可以从提供的 triggerMetadata 对象的 context 属性中获取元数据,如下面的示例所示,该属性记录触发 blob 的路径 (blobTrigger),包括容器:

context.log(`Full blob path: ${context.triggerMetadata.blobTrigger}`);

元数据

可以通过 $TriggerMetadata 参数获取元数据。

使用情况

Blob 触发器支持的绑定类型取决于函数应用中使用的扩展包版本和 C# 形式。

Blob 触发器可以绑定到以下类型:

类型 说明
string Blob 内容即字符串。 在 blob 内容为简单文本时使用。
byte[] Blob 内容的字节数。
JSON 可序列化类型 当 blob 包含 JSON 数据时,Functions 会尝试将 JSON 数据反序列化为普通的旧 CLR 对象 (POCO) 类型。
1 Blob 内容的输入流。
BlobClient1
BlockBlobClient1
PageBlobClient1
AppendBlobClient1
BlobBaseClient1
连接到 blob 的客户端。 此类型集提供了对 blob 处理的充分控制,如果连接具有足够的权限,则可用于写回 blob。

1 若要使用这些类型,需要引用 Microsoft。Azure。Functions.Worker.Extensions。Storage。Blob 6.0.0 或更高版本和 sdk 类型绑定的 common 依赖项

仅当 blob 大小较小时才建议绑定到 stringByte[]。 我们推荐此做法,因为整个 blob 内容都会加载到内存中。 对于大多数 blob,请使用 StreamBlobClient 类型。 有关详细信息,请参阅 并发和内存使用情况

如果在尝试绑定到其中一个Storage SDK 类型时收到错误消息,请确保引用 正确Storage SDK 版本

还可以使用 StorageAccountAttribute 指定要使用的storage帐户。 如果需要使用与库中其他函数不同的storage帐户,则可以执行此作。 构造函数采用包含storage connection string的应用设置的名称。 可以在参数、方法或类级别应用该特性。 以下示例演示类级别和方法级别:

[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
    [FunctionName("BlobTrigger")]
    [StorageAccount("FunctionLevelStorageAppSetting")]
    public static void Run( //...
{
    ....
}

要使用的storage帐户按以下顺序确定:

  • BlobTrigger 特性的 Connection 属性。
  • 作为 StorageAccount 特性应用到同一参数的 BlobTrigger 特性。
  • 应用到函数的 StorageAccount 特性。
  • 应用到类的 StorageAccount 特性。
  • 函数应用的默认storage帐户,该帐户在 AzureWebJobsStorage 应用程序设置中定义。

注释

对绑定到 SDK 类型的支持目前以预览版提供,仅限于Azure Blob Storage SDK。 有关详细信息,请参阅 Java 参考文章中的 SDK 类型

Access blob 数据作为函数的第一个参数。

通过与绑定的名称参数在 function.json 文件中指定的名称匹配的参数Access blob 数据。

通过类型化为 InputStream 的参数Access blob 数据。 有关详细信息,请参阅触发器示例

函数还支持用于Azure Blob storage的 Python SDK 类型绑定,这允许使用以下基础 SDK 类型处理 blob 数据:

注释

仅支持同步 SDK 类型。

重要

对 Python 的 SDK 类型支持已正式发布,并且仅支持 Python v2 编程模型。 有关详细信息,请参阅 Python 中的 SDK 类型

连接

connection 属性是对环境配置的引用,它指定应用应如何连接到 Azure Blob。 它可能指定:

  • 包含 connection string
  • 多个应用程序设置的共享前缀的名称,共同定义基于标识的连接

如果配置的值既是单个设置的完全匹配,也是其他设置的前缀匹配,则使用完全匹配。

Connection string

若要获取connection string,请按照 Manage storage 帐户access密钥所示的步骤进行作。 connection string必须用于常规用途storage帐户,而不是 Blob storage 帐户

此connection string应存储在应用程序设置中,其名称与绑定配置的 connection 属性指定的值匹配。

如果应用设置名称以“AzureWebJobs”开始,则只能在此处指定该名称的余下部分。 例如,如果将 connection 设置为“MyStorage”,则 Functions 运行时会查找名为“AzureWebJobsMyStorage”的应用设置。 如果将 connection 留空,Functions 运行时将使用名为 AzureWebJobsStorage 的应用设置中的默认Storage connection string。

基于标识的连接

如果对非.NET语言堆栈使用 version 5.x 或更高版本bundle 3.x 或更高版本),而不是对机密使用connection string, 应用可以使用 Microsoft Entra 标识。 要使用标识,需要定义公共前缀下的设置,该前缀映射到触发器和绑定配置中的 connection 属性。

如果要将 设置为“AzureWebJobsStorage”,请参阅连接以使用标识1 托管storage。 对于所有其他连接,扩展需要以下属性:

properties 环境变量模板 说明 示例值
Blob 服务 URI <CONNECTION_NAME_PREFIX>__serviceUri 1 要连接到的 Blob 服务的数据平面 URI,使用 HTTPS 方案。 <https:// storage_account_name.blob.core.chinacloudapi.cn>

1<CONNECTION_NAME_PREFIX>__blobServiceUri 可以用作别名。 如果连接配置将由 Blob 触发器使用,则 blobServiceUri 还必须带有 queueServiceUri。 请参阅下文。

如果要跨 Blob、队列和/或表使用总体连接配置,则无法使用 serviceUri 窗体。 URI 只能指定 Blob 服务。 作为一种替代方案,可以为每个服务专门提供一个 URI,从而允许使用单个连接。 如果这两个版本均提供,则将使用多服务窗体。 若要为多个服务(而不是 <CONNECTION_NAME_PREFIX>__serviceUri)配置连接,请设置:

properties 环境变量模板 说明 示例值
Blob 服务 URI <CONNECTION_NAME_PREFIX>__blobServiceUri 要连接到的 Blob 服务的数据平面 URI,使用 HTTPS 方案。 <https:// storage_account_name.blob.core.chinacloudapi.cn>
队列服务 URI(Blob 触发器需要2 <CONNECTION_NAME_PREFIX>__queueServiceUri 使用 HTTPS 方案的队列服务的数据平面 URI。 仅 Blob 触发器需要该值。 <https:// storage_account_name.queue.core.chinacloudapi.cn>

2 blob 触发器通过将 poison blob 写入队列来处理多个重试失败。 在 serviceUri 窗体中,将使用 AzureWebJobsStorage 连接。 但是,在指定 blobServiceUri 时,还必须为 queueServiceUri 提供队列服务 URI。 建议使用与 blob 服务相同的storage帐户中的服务。 还需要通过分配Storage队列数据参与者等角色来确保触发器可以在配置的队列服务中读取和写入消息。

可以设置其他属性来自定义连接。 请参阅基于标识的连接的通用属性

在Azure Functions服务中托管时,基于标识的连接使用 托管标识。 默认情况下使用系统分配的标识,但可以使用 credentialclientID 属性来指定用户分配的标识。 请注意,不支持为用户分配的标识配置资源 ID。 在其他上下文(如本地开发)中运行时,将改用开发人员标识,尽管可以进行自定义。 请参阅使用基于标识的连接进行本地开发

向标识授予权限

无论使用何种标识,都必须具有执行所需操作的权限。 对于大多数Azure服务,这意味着需要使用提供这些权限的内置角色或自定义角色在 Azure RBAC 中分配角色

重要

某些权限可能由并非所有上下文都需要的目标服务公开。 尽可能遵循最低权限原则,仅授予标识所需的权限。 例如,如果应用只需要从数据源进行读取即可,则使用仅具有读取权限的角色。 分配一个也具有该服务写入权限的角色并不恰当,因为对于读取操作来说,写入是多余的权限。 同样,你也希望确保角色分配的范围仅限于需要读取的资源。

需要创建一个角色分配,该分配在运行时向 blob 容器提供access。 Owner 等管理角色是不够的。 下表显示了在正常作中使用 Blob Storage 扩展时建议的内置角色。 根据所编写的代码,应用程序可能需要进一步的权限。

绑定类型 内置角色示例
触发器 Storage Blob 数据所有者andStorage队列数据参与者1

此外,还必须向 AzureWebJobsStorage 连接授予额外的权限。2
输入绑定 Storage Blob 数据读取器
输出绑定 Storage Blob 数据所有者

1 blob 触发器通过将 poison blobs1 写入到连接指定的storage帐户上的队列来处理多个重试失败。

2 AzureWebJobsStorage 连接在内部用于启用触发器的 blob 和队列。 如果将其配置为使用基于标识的连接,则该连接将需要超出默认要求的其他权限。 Storage Blob 数据所有者Storage队列数据参与者Storage帐户参与者角色涵盖所需的权限。 若要了解详细信息,请参阅 连接以使用标识0 托管storage。

Blob 名称模式

可以在 path 属性中或者在 BlobTrigger 特性构造函数中指定 Blob 名称模式。 名称模式可以是筛选器或绑定表达式。 以下部分提供了有关示例。

提示

容器名称不能在名称模式中包含解析程序。

获取文件名和扩展名

以下示例演示如何分别绑定到 Blob 文件名和扩展名:

"path": "input/{blobname}.{blobextension}",

如果 Blob 名为 original-Blob1.txt,则函数代码中 blobnameblobextension 变量的值为 original-Blob1txt

按 Blob 名称筛选

以下示例仅根据 input 容器中以字符串“original-”开头的 Blob 触发:

"path": "input/original-{name}",

如果 Blob 名称为 original-Blob1.txt,则函数代码中 name 变量的值为 Blob1.txt

按文件类型筛选

以下示例仅根据 .png 文件触发:

"path": "samples/{name}.png",

按文件名中的大括号筛选

若要查找文件名中的大括号,请使用两个大括号将大括号转义。 以下示例筛选名称中包含大括号的 Blob:

"path": "images/{{20140101}}-{name}",

如果 Blob 名为 {20140101}-soundfile.mp3,则函数代码中的 name 变量值为 soundfile.mp3

轮询和延迟

轮询在检查日志和运行定期容器扫描之间起到混合作用。 每次以 10,000 个为一组扫描 Blob,并在间隔之间使用继续标记。 如果函数应用基于消耗计划,则当函数应用处于空闲状态时,处理新 Blob 会出现长达 10 分钟的延迟。

警告

Storage日志是在“最佳努力”的基础上创建的。 不保证捕获所有事件。 在某些情况下可能会遗漏某些日志。

如果需要更快或更可靠的 Blob 处理,应考虑切换托管以使用启用了Always On的App Service计划,这可能会导致成本增加。 还可考虑使用经典轮询 blob 触发器以外的触发器。 有关blob storage容器的各种触发选项的详细信息和比较,请参阅 blob 容器上的 Trigger

Blob 回执

Azure Functions运行时可确保对于同一新的或更新的 blob,不会多次调用 Blob 触发器函数。 为了确定是否已处理给定的 blob 版本,它会维护 blob 回执

Azure Functions函数应用的Azure storage帐户(由应用设置AzureWebJobsStorage定义)中存储 blob 回执azure-webjobs-hosts。 Blob 回执包含以下信息:

  • 触发的函数(<FUNCTION_APP_NAME>.Functions.<FUNCTION_NAME>,例如:MyFunctionApp.Functions.CopyBlob
  • 容器名称
  • Blob 类型(BlockBlobPageBlob
  • Blob 名称
  • ETag(blob 版本标识符,例如:0x8D1DC6E70A277EF

若要强制重新处理 blob,请手动从 azure-webjobs-hosts 容器中删除该 blob 的 blob 回执。 虽然重新处理可能不会立即发生,但它肯定会在稍后的时间点发生。 若要立即重新处理,可以更新 azure-webjobs-hosts/blobscaninfoscaninfo> blob。 将再次扫描 LatestScan 属性后具有上次修改时间戳的任何 Blob。

有害 Blob

如果给定 blob 的 blob 触发器函数失败,Azure Functions默认重试该函数总共五次。

如果所有五次尝试都失败,Azure Functions将消息添加到名为 webjobs-blobtrigger-poison 的Storage队列。 最大尝试次数可配置。 使用相同的 MaxDequeueCount 设置处理有害 Blob 和有害队列消息。 有害 Blob 的队列消息是包含以下属性的 JSON 对象:

  • FunctionId(格式为 <FUNCTION_APP_NAME>.Functions.<FUNCTION_NAME>
  • BlobType(BlockBlobPageBlob
  • 容器名称
  • BlobName
  • ETag(blob 版本标识符,例如:0x8D1DC6E70A277EF

内存使用率和并发性

绑定到不支持流式处理的输出类型(例如 stringByte[])时,运行时必须在处理期间将整个 Blob 多次加载到内存中。 这可能会导致处理 Blob 时内存使用率高于预期。 如果可能,请使用支持流的类型。 类型支持取决于 C# 模式和扩展版本。 有关详细信息,请参阅 Binding 类型

此时,运行时必须在处理期间将整个 Blob 多次加载到内存中。 这可能会导致处理 Blob 时内存使用率高于预期。

当多个函数实例同时处理 Blob 数据时,内存使用率可能会进一步受到影响。 如果使用 Blob 触发器遇到内存问题,请考虑减少允许的并发执行数。 减少并发可能会产生增加等待处理的 blob 积压的副作用。 函数应用的内存限制取决于计划。 有关详细信息,请参阅服务限制

可以控制并发执行数的方式取决于所使用的Storage扩展的版本。

使用 Storage 扩展或更高版本的 5.0.0 版时,可以使用 设置来控制触发并发>blobs 配置 host.json

限制分别应用于使用 blob 触发器的每个函数。

host.json 属性

host.json 文件包含控制 blob 触发器行为的设置。 有关可用设置的详细信息,请参阅 host.json 设置部分。

后续步骤