Azure Functions における Azure Blob Storage の入力バインド

入力バインドを使用すると、Azure 関数への入力として BLOB Storage データを読み取ることができます。

セットアップと構成の詳細については、概要に関する記事を参照してください。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

Azure Functions では、Python の 2 つのプログラミング モデルがサポートされています。 バインドを定義する方法は、選択したプログラミング モデルによって異なります。

Python v2 プログラミング モデルでは、Python 関数コードでデコレーターを使用してバインドを直接定義できます。 詳細については、「Python 開発者ガイド」を参照してください。

この記事は、両方のプログラミング モデルをサポートしています。

このバインドに関しては現在、Goのサポートは利用できません。

A C# 関数は、次の C# モードのいずれかを使用して作成できます。

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。 分離ワーカー プロセス関数の拡張機能では、Microsoft.Azure.Functions.Worker.Extensions.* 名前空間が使用されます。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。 このモデルの一部では、主に C# ポータルの編集のためにサポートされている C# スクリプトを使用して Functions を実行できます。 インプロセス関数の拡張機能では、Microsoft.Azure.WebJobs.Extensions.* 名前空間が使用されます。

次の例は C# 関数であり、分離ワーカー プロセスで実行され、BLOB 入力と BLOB 出力の両方の BLOB バインドを持つ BLOB トリガーを使用します。 test-samples-triggerコンテナ内にブロブを作成すると、関数がトリガーされます。 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";
        }
    }
}

このセクションには、次の例が含まれています。

HTTP トリガー、クエリ文字列から BLOB を検索する

次の例では、Java 関数が HttpTrigger 注釈を利用し、BLOB ストレージ コンテナーのファイル名を含むパラメーターを受け取ります。 BlobInput 注釈によってファイルが読み取られ、その内容が byte[] として関数に渡されます。

  @FunctionName("getBlobSizeHttp")
  @StorageAccount("Storage_Account_Connection_String")
  public HttpResponseMessage blobSize(
    @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,
    final ExecutionContext context) {
      // 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();
  }

キュー トリガー: キュー メッセージから BLOB 名を受信する

次の例では、Java 関数が QueueTrigger 注釈を利用し、BLOB ストレージ コンテナーのファイル名を含むメッセージを受け取ります。 BlobInput 注釈によってファイルが読み取られ、その内容が byte[] として関数に渡されます。

  @FunctionName("getBlobSize")
  @StorageAccount("Storage_Account_Connection_String")
  public void blobSize(
    @QueueTrigger(
      name = "filename", 
      queueName = "myqueue-items-sample") 
    String filename,
    @BlobInput(
      name = "file", 
      dataType = "binary", 
      path = "samples-workitems/{queueTrigger}") 
    byte[] content,
    final ExecutionContext context) {
      context.getLogger().info("The size of \"" + filename + "\" is: " + content.length + " bytes");
  }

Java 関数ランタイム ライブラリで、その値が BLOB に由来するパラメーター上で @BlobInput 注釈を使用します。 この注釈はネイティブJava型、従来の旧Javaオブジェクト(POJO)、またはOptional<T>を用いたnullable値で使用できます。

この例では、ストレージ 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 トリガーを使用して両方のストレージ 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 関数を次の例に示します。 コピーするブロブの名前を含むキューメッセージが関数をトリガーします。 新しい 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,
});

キューによってトリガーされ、BLOB のコピーを作成する JavaScript 関数を次の例に示します。 コピーするブロブの名前を含むキューメッセージが関数をトリガーします。 新しい 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);
    },
});

次の例は、function.json ファイルで定義されている BLOB 入力バインドを示しています。このバインドにより、受信 BLOB データを PowerShell 関数で使用できるようになります。

json 構成を次に示します。

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

関数コードを次に示します。

# Input bindings are passed in via param block.
param([byte[]] $InputBlob, $TriggerMetadata)

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

この例では、SDK 型を使用して、BLOB ストレージ入力バインドによって提供される基になる BlobClient オブジェクトに直接アクセスします。

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

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
@app.route(route="file")
@app.blob_input(
    arg_name="client", path="PATH/TO/BLOB", connection="AzureWebJobsStorage"
)
def blob_input(req: func.HttpRequest, client: blob.BlobClient):
    logging.info(
        f"Python blob input function processed blob \n"
        f"Properties: {client.get_blob_properties()}\n"
        f"Blob content head: {client.download_blob().read(size=1)}"
    )
    return "ok"

他の SDK の種類の使用例については、 ContainerClientStorageStreamDownloader のサンプルを参照してください。 関数アプリに SDK 型のバインドを含める方法の詳細なチュートリアルについては、 Blob 用 Python SDK バインドのサンプルに従ってください。

他の SDK 型バインドがサポートされているものも含め、詳細については、 SDK の型バインドに関するページを参照してください。

このコードでは、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="PATH/TO/BLOB",
                connection="CONNECTION_SETTING")
@app.blob_output(arg_name="outputblob",
                path="PATH/TO/NEW/BLOB",
                connection="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# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

分離ワーカー プロセスでは、次のパラメーターを受け取る BlobInputAttribute 属性を使用して入力バインディングを定義します。

パラメーター 説明
BlobPath BLOB へのパス。
接続 Azure Blob への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

ローカルで開発する場合は、 コレクション内の Valuesにアプリケーション設定を追加します。

デコレーター

Python v2 プログラミング モデルにのみ適用されます。

デコレーターを使用して定義された Python v2 関数の場合、blob_input および blob_output デコレーターの次のプロパティによって Blob Storage トリガーが定義されます。

プロパティ 説明
arg_name 関数コード内の BLOB を表す変数の名前。
path BLOB へのパス blob_input デコレーターの場合は、読み取られた BLOB です。 blob_output デコレーターの場合は、入力 BLOB の出力またはコピーです。
connection ストレージ アカウントの接続文字列。
data_type 動的に型指定される言語の場合は、基になるデータ型を指定します。 設定可能な値は、stringbinary、または stream です。 詳細については、トリガーとバインドの概念に関する記事を参照してください。

function.json を使用して定義された Python 関数については、[構成] セクションを参照してください。

注釈

@BlobInput 属性を使用すると、関数をトリガーした BLOB にアクセスできます。 この属性と共にバイト配列を使用する場合は、dataTypebinary に設定します。 詳細については、「入力 - 例」を参照してください。

構成

"Python v1 プログラミング モデルにのみ適用されます。"

次の表では、options メソッドに渡される input.storageBlob() オブジェクトに対して設定できるプロパティについて説明します。

プロパティ 説明
パス BLOB へのパス。
接続 Azure Blob への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
タイプ blob に設定する必要があります。
方向 in に設定する必要があります。 例外は、使用方法のセクションに記載しています。
名前 関数コード内の BLOB を表す変数の名前。
パス BLOB へのパス。
接続 Azure Blob への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。
dataType 動的に型指定される言語の場合は、基になるデータ型を指定します。 設定可能な値は、stringbinary、または stream です。 詳細については、トリガーとバインドの概念に関する記事を参照してください。

完全な例については、セクションの例を参照してください。

使用法

BLOB 入力でサポートされるバインドの種類は、拡張機能パッケージのバージョンと、関数アプリで使用される C# モダリティによって異なります。

関数で 1 つの BLOB を処理するとき、BLOB 入力バインドは次の型にバインドできます。

タイプ 説明
string BLOB コンテンツを表す文字列。 BLOB コンテンツが単純なテキストのときに使用します。
byte[] BLOB コンテンツのバイト数。
JSON シリアル化可能な型 BLOB に JSON データが含まれているとき、Functions は JSON データを単純な従来の CLR オブジェクト (POCO) 型に逆シリアル化しようとします。
Stream1 BLOB コンテンツの入力ストリーム。
BlobClient1
BlockBlobClient1
PageBlobClient1
AppendBlobClient1
BlobBaseClient1
BLOB に接続されているクライアント。 この型のセットには BLOB の処理に対する最大限の制御機能が備わっています。接続に十分なアクセス許可がある場合は、それへの書き戻しに使用できます。

関数で 1 つのコンテナーの複数の BLOB を処理するとき、BLOB 入力バインドは次の型にバインドできます。

タイプ 説明
T[] または List<T> (T は単一の BLOB 入力バインドの型のいずれか) 複数の BLOB の配列またはリスト。 各エントリは、コンテナーの 1 つの BLOB を表します。 これらの型によって実装される IEnumerable<T> などの任意のインターフェイスにバインドすることもできます。
BlobContainerClient1 コンテナーに接続されているクライアント。 この型にはコンテナーの処理に対する最大限の制御機能が備わっています。接続に十分なアクセス許可がある場合は、それへの書き込みに使用できます。

1 これらの型を使用するには、Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs 6.0.0 以降SDK 型バインドの一般的な依存関係に関する記事を参照する必要があります。

stringまたはByte[]へのバインドは、BLOB の内容全体がメモリに読み込まれるため、BLOB サイズが小さい場合にのみ推奨されます。 ほとんどの BLOB では、Stream 型または BlobClient 型を使用します。 詳細については、「コンカレンシーとメモリ使用量」を参照してください。

Storage SDK タイプの 1 つにバインドしようとしてエラー メッセージが表示された場合は、適切な Storage SDK バージョンへの参照があることを確認してください。

StorageAccountAttribute を使用して、使用するストレージ アカウントを指定することもできます。 これは、ライブラリ内の他の関数とは異なるストレージ アカウントを使用する必要がある場合に実行できます。 コンストラクターは、ストレージ接続文字列を含むアプリ設定の名前を受け取ります。 属性は、パラメーター、メソッド、またはクラス レベルで適用できます。 次の例では、クラス レベルとメソッド レベルを示します。

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

使用するストレージ アカウントは、次の順序で決定されます。

  • BlobTrigger 属性の Connection プロパティ。
  • StorageAccount 属性と同じパラメーターに適用された BlobTrigger 属性。
  • 関数に適用される StorageAccount 属性。
  • クラスに適用される StorageAccount 属性。
  • AzureWebJobsStorage アプリケーション設定で定義されている、関数アプリの既定のストレージ アカウント。

@BlobInput 属性を使用すると、関数をトリガーした BLOB にアクセスできます。 この属性と共にバイト配列を使用する場合は、dataTypebinary に設定します。 詳細については、「入力 - 例」を参照してください。

context.extraInputs.get() を使用して BLOB データにアクセスします。

function.json ファイルのバインドの name パラメーターで指定されている名前と一致するパラメーターを使用して、BLOB データにアクセスします。

InputStream に型指定したパラメーターを使用して BLOB データにアクセスします。 詳細については、「入力 - 例」を参照してください。

Functions では、Azure Blob Storage の Python SDK 型バインドもサポートされています。これにより、基になる SDK の種類を使用して BLOB データを操作できます。

同期 SDK の種類のみがサポートされています。

重要

Python の SDK の種類のサポートは一般提供されており、Python v2 プログラミング モデルでのみサポートされています。 詳細については、Python の SDK 型を参照してください。

接続

connectionプロパティはアプリケーション設定でキーに設定されており、Functionsランタイムが拡張で使用しているストレージアカウントに接続するために使われる値を返します。 接続プロパティ設定の値は接続の種類によって異なります:

  • マネージドID接続: connection プロパティは、複数の設定群が共有する <CONNECTION_NAME_PREFIX> であり、これらが共にストレージアカウントへのアイデンティティベースの接続を定義します。 詳細については、「 同一性接続の定義」を参照してください。
  • Key Vault参照:connectionプロパティ設定は、接続文字列が中央管理されている場所への参照Azure Key Vaultを返します。 詳細については、「Key Vault connectionsの定義」をご覧ください。
  • App Configuration reference:connectionプロパティ設定は接続文字列またはKey Vault参照を返すAzure App Configuration参照を返します。 詳細については、接続記事のAzure App Configurationをご覧ください。
  • Connection string:connectionプロパティ設定は実際のストレージアカウント接続文字列を返します。 接続文字列には共有の秘密鍵が含まれているため、可能であれば管理型アイデンティティ接続の使用を検討すべきです。 詳細については、「 接続の定義」を参照してください。

バインディング接続について詳しく知りたい方は、Azure Functionsの「Manage connection in Connection」をご覧ください。 接続文字列を取得するには、「ストレージ アカウント アクセス キーを管理する」の手順に従います。

connectionをキーやAzureWebJobsStorageという名前のキープレフィックスに設定したり、空文字列に設定した場合、バインディング拡張はデフォルトのホストストレージアカウントを使用します。 詳細については 、「ストレージパフォーマンスの最適化」をご覧ください。

次のステップ