Azure Functions 的 Azure Blob 記憶體輸出系結

輸出系結可讓您修改和刪除 Azure 函式中的 Blob 記憶體數據。

如需安裝和組態詳細數據的詳細資訊,請參閱概 觀。

重要

本文使用索引標籤來支援多個版本的 Node.js 程式設計模型。 v4 模型已正式推出,旨在為 JavaScript 和 TypeScript 開發人員提供更靈活且更直覺的體驗。 如需 v4 模型運作方式的更多詳細資料,請參閱 Azure Functions Node.js 開發人員指南。 若要深入了解 v3 與 v4 之間的差異,請參閱移轉指南。

Azure Functions 支援兩種適用於 Python 的程式設計模型。 您定義系結的方式取決於您所選擇的程式設計模型。

Python v2 程式設計模型可讓您直接在 Python 函式程式代碼中使用裝飾項目來定義系結。 如需詳細資訊,請參閱 Python 開發人員指南。

本文支援這兩種程序設計模型。

範例

目前這款綁定沒有 Go 支援。

您可以使用下列其中一種 C# 模式來建立 C# 函式:

  • 隔離的背景工作模型:在與運行時間隔離的背景工作進程中執行的已編譯 C# 函式。 需要隔離的背景工作進程,才能支援在 LTS 和非 LTS 版本 .NET 和 .NET Framework 上執行的 C# 函式。 隔離背景工作進程函式的延伸模組會使用 Microsoft.Azure.Functions.Worker.Extensions.* 命名空間。
  • 同進程模型:在與 Functions 運行時間相同的進程中執行的已編譯 C# 函式。 在此模型的變化中,函式可以使用 C# 腳本來執行,主要支援 C# 入口網站編輯。 進程內函式的延伸模組會使用 Microsoft.Azure.WebJobs.Extensions.* 命名空間。

下列範例是 C# 函式 ,會在隔離的背景工作進程中執行,並使用 Blob 觸發程式搭配 Blob 輸入和 Blob 輸出 Blob 系結。 在 test-samples-trigger 容器中建立一個 blob 會觸發該函式。 它會從 test-samples-input 容器讀取文字檔,並根據觸發的檔名,在輸出容器中建立新的文本檔。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace SampleApp
{
    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";
        }
    }
}

本區段包含下列範例:

使用 OutputBinding 的 HTTP 觸發程式 (Java)

下列範例顯示 Java 函式,該函式會使用 HttpTrigger 註釋接收包含 Blob 記憶體容器中檔案名稱的參數。 然後批 BlobInput 註會讀取檔案,並將其內容傳遞至 函式做為 byte[]。 批 BlobOutput 注會系結至 OutputBinding outputItem,然後函式會使用此函式將輸入 Blob 的內容寫入已設定的記憶體容器。

  @FunctionName("copyBlobHttp")
  @StorageAccount("Storage_Account_Connection_String")
  public HttpResponseMessage copyBlobHttp(
    @HttpTrigger(name = "req", 
      methods = {HttpMethod.GET}, 
      authLevel = AuthorizationLevel.ANONYMOUS) 
    HttpRequestMessage<Optional<String>> request,
    @BlobInput(
      name = "file", 
      dataType = "binary", 
      path = "samples-workitems/{Query.file}") 
    byte[] content,
    @BlobOutput(
      name = "target", 
      path = "myblob/{Query.file}-CopyViaHttp")
    OutputBinding<String> outputItem,
    final ExecutionContext context) {
      // Save blob to outputItem
      outputItem.setValue(new String(content, StandardCharsets.UTF_8));

      // build HTTP response with size of requested blob
      return request.createResponseBuilder(HttpStatus.OK)
        .body("The size of \"" + request.getQueryParameters().get("file") + "\" is: " + content.length + " bytes")
        .build();
  }

佇列觸發程式,使用函式傳回值 (Java)

下列範例顯示 Java 函式,該函式會使用 QueueTrigger 註釋來接收訊息,其中包含 Blob 記憶體容器中檔案的名稱。 然後批 BlobInput 註會讀取檔案,並將其內容傳遞至 函式做為 byte[]。 批 BlobOutput 注會系結至函式傳回值,然後由運行時間用來將輸入 Blob 的內容寫入設定的記憶體容器。

  @FunctionName("copyBlobQueueTrigger")
  @StorageAccount("Storage_Account_Connection_String")
  @BlobOutput(
    name = "target", 
    path = "myblob/{queueTrigger}-Copy")
  public String copyBlobQueue(
    @QueueTrigger(
      name = "filename", 
      dataType = "string",
      queueName = "myqueue-items") 
    String filename,
    @BlobInput(
      name = "file", 
      path = "samples-workitems/{queueTrigger}") 
    String content,
    final ExecutionContext context) {
      context.getLogger().info("The content of \"" + filename + "\" is: " + content);
      return content;
  }

在 Java 函式運行時間連結庫中,對 @BlobOutput 函式參數使用註釋,其值會寫入 Blob 記憶體中的物件。 參數型別應為 OutputBinding<T>,其中 T 是任何原生 Java 型態或普通的 Java 物件(POJO)。

下列範例顯示佇列觸發的 TypeScript 函式 ,其會建立 Blob 複本。 包含要複製 blob 名稱的佇列訊息會觸發該函式。 新的 Blob 名稱為 {originalblobname}-Copy。

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

const blobInput = input.storageBlob({
    path: 'samples-workitems/{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

const blobOutput = output.storageBlob({
    path: 'samples-workitems/{queueTrigger}-Copy',
    connection: 'MyStorageConnectionAppSetting',
});

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<unknown> {
    return context.extraInputs.get(blobInput);
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [blobInput],
    return: blobOutput,
    handler: storageQueueTrigger1,
});

下列範例顯示佇列觸發的 JavaScript 函式 ,其會建立 Blob 複本。 包含要複製 blob 名稱的佇列訊息會觸發該函式。 新的 Blob 名稱為 {originalblobname}-Copy。

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

const blobInput = input.storageBlob({
    path: 'samples-workitems/{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

const blobOutput = output.storageBlob({
    path: 'samples-workitems/{queueTrigger}-Copy',
    connection: 'MyStorageConnectionAppSetting',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [blobInput],
    return: blobOutput,
    handler: (queueItem, context) => {
        return context.extraInputs.get(blobInput);
    },
});

下列範例示範如何建立傳入 Blob 複本作為 PowerShell 函式的輸出。

在函式的組態檔 (function.json), trigger 元數據屬性是用來在屬性中 path 指定輸出 Blob 名稱。

注意

若要避免無限迴圈,請確定您的輸入和輸出路徑不同。

{
  "bindings": [
    {
      "name": "myInputBlob",
      "path": "data/{trigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in",
      "type": "blobTrigger"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "data/copy/{trigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

以下是 PowerShell 程式代碼:

# Input bindings are passed in via param block.
param([byte[]] $myInputBlob, $TriggerMetadata)
Write-Host "PowerShell Blob trigger function Processed blob Name: $($TriggerMetadata.Name)"
Push-OutputBinding -Name myOutputBlob -Value $myInputBlob

下列範例顯示 Blob 輸入和輸出系結。 此範例取決於您使用的是 v1 或 v2 Python 程式設計模型。

程序代碼會建立 Blob 的複本。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="BlobOutput1")
@app.route(route="file")
@app.blob_input(arg_name="inputblob",
                path="sample-workitems/test.txt",
                connection="<BLOB_CONNECTION_SETTING>")
@app.blob_output(arg_name="outputblob",
                path="newblob/test.txt",
                connection="<BLOB_CONNECTION_SETTING>")
def main(req: func.HttpRequest, inputblob: str, outputblob: func.Out[str]):
    logging.info(f'Python Queue trigger function processed {len(inputblob)} bytes')
    outputblob.set(inputblob)
    return "ok"

屬性

進程內和隔離的背景工作進程 C# 連結庫都會使用 屬性來定義函式。 C# 文稿會改用function.json組態檔,如 C# 腳本指南中所述。

建 BlobOutputAttribute 構函式會採用下列參數:

參數 描述
BlobPath blob 的路徑。
[連接] 指定 Azure Blob 連線方式的應用程式設定或設定集合的名稱。 請參閱連線。

當您在本機開發時,請在集合中的 local.settings.json 檔案Values中新增應用程式設定。

裝飾項目

僅適用於 Python v2 程式設計模型。

針對使用裝飾項目定義的 Python v2 函式,和 blob_input 裝飾專案上的blob_output下列屬性會定義 Blob 記憶體觸發程式:

屬性 描述
arg_name 表示函式程式碼中 Blob 的變數名稱。
path Blob 的路徑 針對 blob_input 裝飾專案,它是 Blob 讀取。 blob_output針對裝飾專案,它是輸入 Blob 的輸出或複本。
connection 儲存體帳戶連接字串。
dataType 針對動態類型語言,指定基礎數據類型。 可能的值為 string、binary 或 stream。 如需詳細資訊,請參閱 觸發程式和系結概念。

如需使用 function.json 定義的 Python 函式,請參閱組 態 一節。

註釋

屬性 @BlobOutput 可讓您存取觸發函式的 Blob。 如果您使用位元組陣列搭配 屬性,請將 設定 dataType 為 binary。 如需詳細資訊, 請參閱輸出範例 。

組態

僅適用於 Python v1 程式設計模型。

下表說明您可以在傳遞至 options 方法的物件output.storageBlob()上設定的屬性。

屬性 描述
path Blob 容器的路徑。
connection 指定 Azure Blob 連線方式的應用程式設定或設定集合的名稱。 請參閱連線。

下表說明您在 function.json 檔案中設定的繫結設定屬性。

屬性 描述
type 必須設定為 blob。
direction 輸出系結必須設定為 out 。 使用區段中會指出例外狀況。
name 表示函式程式碼中 Blob 的變數名稱。 設為 $return 以參考函式傳回值。
path Blob 容器的路徑。
connection 指定 Azure Blob 連線方式的應用程式設定或設定集合的名稱。 請參閱連線。

如需完整範例,請參閱範例一節。

使用方式

Blob 輸出支援的系結類型取決於函式應用程式中所使用的擴充套件版本和 C# 形式。

當您想要讓函式寫入單一 Blob 時,Blob 輸出系結可以繫結至下列類型:

類型 描述
string Blob 內容做為字串。 當 Blob 內容是簡單的文字時, 請使用 。
byte[] Blob 內容的位元組。
JSON 可序列化型別 物件,表示 JSON Blob 的內容。 函式會嘗試將一般舊的CLR物件 (POCO) 類型串行化為 JSON 數據。

當您想要讓函式寫入多個 Blob 時,Blob 輸出系結可以繫結至下列類型:

類型 描述
T[] 其中 T 是其中一個 Blob 輸出系結類型 數位,包含多個 Blob 的內容。 每個專案都代表一個 Blob 的內容。

針對其他輸出案例,請直接從 Azure.Storage.Blobs 建立和使用 BlobClient 或 BlobContainerClient 與其他類型。 如需使用相依性插入從 Azure SDK 建立用戶端類型的範例,請參閱 註冊 Azure 用戶端 。

只有在 Blob 大小很小時,才建議系結至 string或 Byte[] 。 建議使用這些類型,因為整個 blob 內容都會載入記憶體。 對於大部分的 Blob,請使用 Stream 或 BlobClient 類型。 如需詳細資訊,請參閱 並行和記憶體使用量。

您也可以使用 StorageAccountAttribute 來指定要使用的記憶體帳戶。 當您需要使用與連結庫中其他函式不同的記憶體帳戶時,可以執行此動作。 建構函式會採用包含記憶體 連接字串的應用程式設定名稱。 屬性可以在參數、方法或類別層級套用。 下列範例顯示類別層級和方法層級:

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

要使用的記憶體帳戶會依下列順序決定:

  • 屬性 BlobTrigger 的 Connection 屬性。
  • 套 StorageAccount 用至與 屬性相同的參數 BlobTrigger 的屬性。
  • 套 StorageAccount 用至函式的屬性。
  • 套 StorageAccount 用至 類別的屬性。
  • 函式應用程式的預設記憶體帳戶,定義於應用程式設定中 AzureWebJobsStorage 。

屬性 @BlobOutput 可讓您存取觸發函式的 Blob。 如果您使用位元組陣列搭配 屬性,請將 設定 dataType 為 binary。 如需詳細資訊, 請參閱輸出範例 。

直接傳 context.extraOutputs.set()回值或使用 來存取 Blob 數據。

透過符合系結名稱參數在 function.json 檔案中指定名稱的參數存取 Blob 數據。

您可以將函式參數宣告為下列類型,以寫出至 Blob 記憶體:

  • 字串為 func.Out[str]
  • 串流為 func.Out[func.InputStream]

如需詳細資訊, 請參閱輸出範例 。

連線

該 connection 屬性在應用程式設定中被設定為一個鍵,回傳一個由 Functions 執行時用來連接擴充功能所用儲存帳號的值。 連線屬性設定的值取決於連線類型:

  • 管理身份連線:該 connection 屬性是由 <CONNECTION_NAME_PREFIX> 一組設定共享,這些設定共同定義了與儲存帳號的身份基礎連線。 欲了解更多資訊,請參閱定義身份連結。
  • 金鑰保存庫 參考:connection屬性設定會回傳一個 Azure Key Vault 的參考,指向該 連接字串 集中維護的位置。 欲了解更多資訊,請參閱定義 金鑰保存庫 連接。
  • App Configuration 參考:connection屬性設定回傳一個 Azure 應用程式組態 參考,該參考會回傳一個 連接字串 或 金鑰保存庫 參考。 欲了解更多資訊,請參閱連接條目中的 Azure 應用程式組態。
  • Connection string:屬性設定會connection回傳實際的儲存帳戶 連接字串。 由於 連接字串 包含共享的秘密金鑰,建議在可能的情況下使用管理身份連線。 欲了解更多資訊,請參閱定義連結。

想了解更多關於綁定連接的資訊,請參閱 Azure Functions 中的「管理連線」。 若要取得連接字串,請遵循管理儲存體帳戶存取金鑰所示的步驟。

當你設定 connection 為某個金鑰或前綴為 name AzureWebJobsStorage ,或是空字串時,綁定擴充功能會使用預設的主機儲存帳號。 欲了解更多資訊,請參閱 「優化儲存效能」。

例外狀況和傳回碼

繫結 參考
Blob Blob 錯誤碼
Blob、數據表、佇列 記憶體錯誤碼
Blob、數據表、佇列 疑難排解

下一步