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 コンテナーからテキスト ファイルを読み取り、トリガーされたファイルの名前に基づいて、出力コンテナーに新しいテキスト ファイルを作成します。

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";
        }
    }
}

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

HTTP トリガー、OutputBinding を使用する (Java)

次の例では、Java 関数が HttpTrigger 注釈を利用し、BLOB ストレージ コンテナーのファイル名を含むパラメーターを受け取ります。 BlobInput 注釈によってファイルが読み取られ、その内容が byte[] として関数に渡されます。 BlobOutput 注釈が OutputBinding outputItem にバインドされます。OutputBinding が関数によって使用され、構成済みのストレージ コンテナーに入力 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 関数ランタイム ライブラリ で、その値が Blob Storage のオブジェクトに書き込まれる関数のパラメーター上で @BlobOutput 注釈を使用します。 パラメータ型はOutputBinding<T>で、ここでTはネイティブのJava型または単なるJavaオブジェクト(POJO)です。

キューによってトリガーされ、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);
    },
});

次の例は、PowerShell 関数からの出力として、受信 BLOB のコピーを作成する方法を示しています。

関数の構成ファイル (function.json) で、trigger メタデータ プロパティを使用して path プロパティ内の出力 BLOB 名を指定します。

Note

無限ループを回避するために、入力パスと出力パスが異なることを確認してください。

{
  "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# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

BlobOutputAttribute コンストラクターは、次のパラメーターを受け取ります。

パラメーター 説明
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 ストレージ アカウントの接続文字列。
dataType 動的に型指定される言語の場合は、基になるデータ型を指定します。 設定可能な値は、stringbinary、または stream です。 詳細については、トリガーとバインドの概念に関する記事を参照してください。

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

注釈

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

構成

"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# モダリティによって異なります。

関数で 1 つの BLOB に書き込むとき、BLOB 出力バインドは次の型にバインドできます。

タイプ 説明
string BLOB コンテンツを表す文字列。 BLOB コンテンツが単純なテキストのときに使用します。
byte[] BLOB コンテンツのバイト数。
JSON シリアル化可能な型 JSON BLOB の内容を表すオブジェクト。 Functions は、Plain Old CLR Object (POCO) 型を JSON データにシリアル化しようとします。

関数で複数の BLOB に書き込むとき、BLOB 出力バインドは次の型にバインドできます。

タイプ 説明
T[] (T は単一の BLOB 出力バインドの型のいずれか) 複数の BLOB の内容を含む配列。 各エントリは、1 つの BLOB の内容を表します。

その他の出力シナリオでは、 BlobClient または BlobContainerClientAzure.Storage.Blobs から直接他の型と共に作成して使用します。 依存関係の挿入を使用して Azure SDK からクライアントの種類を作成する例については Azure クライアントの登録に関するページを参照してください。

string または Byte[] へのバインドが推奨されるのは、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 アプリケーション設定で定義されている、関数アプリの既定のストレージ アカウント。

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

値を直接返すか、context.extraOutputs.set() を使用して、BLOB データにアクセスします。

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

関数のパラメーターを次の型で宣言し、BLOB ストレージに書き込むことができます。

  • func.Out[str] は文字列
  • func.Out[func.InputStream] はストリーム

詳細については、「出力 - 例」を参照してください。

接続

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

例外とリターン コード

バインド リファレンス
BLOB BLOB エラー コード
BLOB、テーブル、キュー ストレージ エラー コード
BLOB、テーブル、キュー トラブルシューティング

次のステップ