Azure Logic Apps でチャンクを使用してワークフロー内の大きいサイズのメッセージを処理する

適用対象: Azure Logic Apps (従量課金)

Azure Logic Apps では、ロジック アプリのリソースの種類とそのロジック アプリ ワークフローが実行される環境に基づいて、トリガーとアクションがロジック アプリ ワークフローで処理できるメッセージ コンテンツ サイズの最大制限が異なります。 これらの制限によって、大きなメッセージの格納と処理によって発生するオーバーヘッドを削減できます。 メッセージ サイズの制限については、Azure Logic Apps のメッセージ制限に関するページをご覧ください。

組み込みの HTTP アクションまたは特定のマネージド コネクタ アクションを使用していて、Azure Logic Apps が既定の制限よりも大きいメッセージを処理する必要がある場合は、チャンキングを有効にして、大きなメッセージを小さなメッセージに分割できます。 これにより、特定の条件下で大きいサイズのファイルを転送できます。 実際、これらの組み込み HTTP アクションまたは特定のマネージド コネクタ アクションを使用する場合、Azure Logic Apps が大きなメッセージを消費できる唯一の方法はチャンキングです。 この要件は、Azure Logic Apps とその他のサービス間の基になる HTTP メッセージ交換でチャンキングを使用する必要があること、または、使用するマネージド コネクタによって作成された接続もチャンキングをサポートしている必要があることを意味します。

注意

Azure Logic Apps では、複数のメッセージを交換することによるオーバーヘッドが増加するため、トリガーのチャンキングをサポートしていません。 また、Azure Logic Apps では、この記事で説明されている独自のプロトコルを使用して、HTTP アクションのチャンキングを実装します。 そのため、Web サイトまたは Web サービスでチャンキングがサポートされている場合でも、HTTP アクションのチャンキングではそれらは動作しません。 Web サイトまたは Web サービスで HTTP アクションのチャンキングを使用するには、Azure Logic Apps で使用されているのと同じプロトコルを実装する必要があります。 それ以外の場合は、HTTP アクションでチャンキングを有効にしないでください。

この記事では、Azure Logic Apps でのチャンキングのしくみと、サポートされているアクションでのチャンキングの設定方法について概要を説明します。

"大きいサイズ" のメッセージとは何か

メッセージは、それらのメッセージを処理するサービスに基づいて "大きいサイズ" になります。 大きいサイズのメッセージの正確なサイズ制限は、Logic Apps とコネクタによって異なります。 Logic Apps とコネクタは、どちらも大きいサイズのメッセージを直接使用できないため、メッセージのチャンクが必要になります。 Logic Apps のメッセージ サイズ制限については、「Logic Apps の制限と構成」を参照してください。 各コネクタのメッセージ サイズの制限については、コネクタのリファレンス ドキュメントを参照してください。

Logic Apps でのチャンクされたメッセージの処理

Logic Apps は、メッセージ サイズの制限を超えているチャンクされたメッセージの出力を直接使用できません。 これらの出力に含まれるメッセージのコンテンツは、チャンクをサポートするアクションのみがアクセスできます。 そのため、大きいサイズのメッセージを処理するアクションは、次の条件の "いずれか" を満たす必要があります。

  • そのアクションがコネクタに属している場合は、チャンクをネイティブにサポートしている。
  • そのアクションの実行時構成で、チャンクのサポートが有効になっている。

それ以外の場合、大きいサイズのコンテンツの出力にアクセスしようとすると、ランタイム エラーが発生します。 チャンクを有効にするには、チャンクのサポートの設定を参照してください。

コネクタでのチャンクされたメッセージの処理

Logic Apps と通信するサービスが、独自のメッセージ サイズの制限を持っている可能性があります。 多くの場合、これらの制限は、Logic Apps の制限よりも小さくなります。 たとえば、コネクタがチャンクをサポートしていることを前提として、コネクタは、30 MB のメッセージを大きいサイズのメッセージとみなす場合がありますが、Logic Apps では、これは大きいサイズのメッセージではありません。 このコネクタの制限を守るために、Logic Apps は、30 MB を超えるメッセージ を小さいチャンクに分割します。

チャンクをサポートするコネクタでは、エンドユーザーがチャンク プロトコルを認識することはありません。 ただし、すべてのコネクタがチャンクをサポートしているわけではないため、これらのコネクタでは、受信したメッセージがコネクタのサイズ制限を超えた場合は実行時エラーが生成されます。

チャンキングをサポートし、チャンキングが有効になっているアクションでは、@triggerBody()?['Content'] のようにトリガー本体、変数、および式を使用することはできません。これらの入力のいずれかを使用すると、チャンキング操作の実行が妨げられるためです。 代わりに、Compose アクション を使用します。 具体的には、次の例に示すように、Compose アクションを使用して、トリガー本体、変数、式などからのデータ出力を格納するための body フィールドを作成する必要があります。

"Compose": {
    "inputs": {
        "body": "@variables('myVar1')"
    },
    "runAfter": {
        "Until": [
            "Succeeded"
        ]
    },
    "type": "Compose"
},

次に、データを参照するために、チャンキング アクションの中で @body('Compose') を使用します。

"Create_file": {
    "inputs": {
        "body": "@body('Compose')",
        "headers": {
            "ReadFileMetadataFromServer": true
        },
        "host": {
            "connection": {
                "name": "@parameters('$connections')['sftpwithssh_1']['connectionId']"
            }
        },
        "method": "post",
        "path": "/datasets/default/files",
        "queries": {
            "folderPath": "/c:/test1/test1sub",
            "name": "tt.txt",
            "queryParametersSingleEncoded": true
        }
    },
    "runAfter": {
        "Compose": [
            "Succeeded"
        ]
    },
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "Chunked"
        }
    },
    "type": "ApiConnection"
},

HTTP 経由でのチャンクの設定

一般的な HTTP シナリオでは、大きいサイズのコンテンツのダウンロードとアップロードを HTTP 経由で分割できるため、ロジック アプリとエンドポイントで大きいサイズのメッセージを交換できます。 ただし、Logic Apps が想定するようにメッセージをチャンクする必要があります。

エンドポイントでダウンロードまたはアップロード時のチャンクが有効になっている場合、ロジック アプリ内の HTTP アクションは、大きいサイズのメッセージを自動的にチャンクします。 それ以外の場合は、エンドポイントにチャンクのサポートを設定する必要があります。 エンドポイントまたはコネクタを所有も管理もしていない場合は、チャンクを設定するオプションがないことがあります。

また、HTTP アクションがチャンクを既に有効にしていない場合は、アクションの runTimeConfiguration プロパティにチャンクを設定する必要があります。 このプロパティは、後述するようにコード ビュー エディターでアクション内に直接設定するか、次の説明に従って Logic Apps デザイナーで設定できます。

  1. HTTP アクションの右上隅の省略記号ボタン ( . ) を選択し、 [設定] を選択します。

    アクションの [設定] メニューを開く

  2. [コンテンツ転送] で、 [チャンクの許可][On] に設定します。

    チャンクをオンにする

  3. ダウンロードまたはアップロードでのチャンクの設定を続行するには、次のセクションに進みます。

コンテンツをチャンクでダウンロードする

多くのエンドポイントは、HTTP GET 要求に応じてダウンロードを行うときに、大きいサイズのメッセージを自動的にチャンクで送信します。 チャンクされたメッセージをエンドポイントから HTTP 経由でダウンロードするには、エンドポイントがコンテンツの部分要求 ("チャンク ダウンロード") をサポートしている必要があります。 ロジック アプリが、コンテンツをダウンロードするためにエンドポイントに HTTP GET 要求を送信すると、エンドポイントは状態コード "206" を返して、応答にチャンクされたコンテンツが含まれていることを示します。 Logic Apps は、エンドポイントが部分要求をサポートするかどうかを制御することはできません。 ただし、ロジック アプリは、最初の "206" 応答を取得した場合は、複数の要求を自動的に送信して、すべてのコンテンツをダウンロードします。

エンドポイントが部分コンテンツをサポートできるかどうかを確認するには、HEAD 要求を送信します。 この要求によって、応答に Accept-Ranges ヘッダーが含まれているかどうかを確認できます。 この方法により、エンドポイントがチャンクされたダウンロードをサポートしているが、チャンクされたコンテンツを送信しない場合は、HTTP GET 要求の中に Range ヘッダーを設定することで、このオプションを "推奨" できます。

次の手順は、チャンクされたコンテンツをエンドポイントからロジック アプリにダウンロードするために Logic Apps が使用する詳細なプロセスを示しています。

  1. ロジック アプリがエンドポイントに HTTP GET 要求を送信します。

    必要に応じて、コンテンツのチャンクを要求するバイト範囲を記述する Range フィールドを要求ヘッダーを含めることができます。

  2. エンドポイントは、状態コード "206" と HTTP メッセージの本文を返します。

    このチャンクのコンテンツの詳細が、応答の Content-Range ヘッダーに含まれます。この中には、Logic Apps がチャンクを開始して終了する範囲に加え、チャンクを行う前にコンテンツ全体の合計サイズを判別するために役立つ情報が含まれます。

  3. ロジック アプリは、フォローアップ HTTP GET 要求を自動的に送信します。

    ロジック アプリは、コンテンツ全体が取得されるまで、フォローアップ GET 要求を送信します。

たとえば、次のアクション定義は、Range ヘッダーを設定する HTTP GET 要求を示しています。 このヘッダーは、エンドポイントがチャンクされたコンテンツで応答することを "推奨" します。

"getAction": {
    "inputs": {
        "headers": {
            "Range": "bytes=0-1023"
        },
       "method": "GET",
       "uri": "http://myAPIendpoint/api/downloadContent"
    },
    "runAfter": {},
    "type": "Http"
}

GET 要求は、"Range" ヘッダーを、バイト範囲である "bytes=0-1023" に設定しています。 エンドポイントが部分コンテンツ要求をサポートしている場合、エンドポイントは、要求された範囲のコンテンツのチャンクで応答します。 "Range" ヘッダー フィールドの正確な形式は、エンドポイントによって異なる可能性があります。

コンテンツをチャンクでアップロードする

HTTP アクションからチャンクされたコンテンツをアップロードするには、アクションの runtimeConfiguration プロパティによって、そのアクションでのチャンクのサポートを有効にする必要があります。 この設定は、アクションがチャンク プロトコルを開始することを許可します。 その後、ロジック アプリは、最初の POST または PUT メッセージをターゲット エンドポイントに送信できます。 エンドポイントが推奨されたチャンク サイズで応答した後、ロジック アプリは、コンテンツのチャンクを含む HTTP PATCH 要求を送信することでフォローアップを行います。

次の手順は、チャンクされたコンテンツをロジック アプリからエンドポイントにアップロードするために Logic Apps によって使用される詳細なプロセスを示しています。

  1. ロジック アプリは、最初の HTTP POST または PUT 要求をメッセージ本文を空にして送信します。 要求ヘッダーには、ロジック アプリによってチャンクでアップロードされるコンテンツに関する情報が含まれます。

    Logic Apps の要求ヘッダー フィールド 種類 説明
    x-ms-transfer-mode chunked String コンテンツがチャンクでアップロードされることを示します
    x-ms-content-length <content-length> Integer チャンクする前のコンテンツ全体のサイズ (バイト単位)
  2. エンドポイントは、成功を示す状態コード "200" と次の情報を返します。

    エンドポイントの応答ヘッダー フィールド Type 必須 説明
    場所 String はい HTTP PATCH メッセージを送信する URL の場所
    x-ms-chunk-size Integer いいえ 推奨されたチャンク サイズ (バイト単位)
  3. ロジック アプリを使用すると、次の情報を含む各フォローアップ HTTP PATCH メッセージが作成され、送信されます。

    • x-ms-content-length の長さのコンテンツがすべてアップロードされるまでの x-ms-chunk-size または内部的に計算されたサイズに基づくコンテンツのチャンク

    • 次のヘッダーには、それぞれの PATCH メッセージで送信されるコンテンツのチャンクの詳細が記述されます。

      Logic Apps の要求ヘッダー フィールド 種類 説明
      Content-Range <range> String 現在のコンテンツのチャンクのバイト範囲。開始値、終了値、および合計コンテンツ サイズ合計が含まれます。例: "bytes=0-1023/10100"
      Content-Type <content-type> String チャンクされたコンテンツの種類
      Content-Length <content-length> String 現在のチャンクのサイズ (バイト単位)
  4. 各 PATCH 要求の後、エンドポイントでは、"200" 状態コードと次の応答ヘッダーで応答することによって、各チャンクの受信を確認します。

    エンドポイントの応答ヘッダー フィールド Type 必須 説明
    Range String はい エンドポイントで受信されたコンテンツのバイト範囲。例: "bytes=0-1023"
    x-ms-chunk-size Integer いいえ 推奨されたチャンク サイズ (バイト単位)

たとえば、次のアクション定義は、チャンクされたコンテンツをエンドポイントにアップロードするための HTTP POST 要求を示しています。 アクションの runTimeConfiguration プロパティの中で、contentTransfer プロパティが transferModechunked に設定しています。

"postAction": {
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "chunked"
        }
    },
    "inputs": {
        "method": "POST",
        "uri": "http://myAPIendpoint/api/action",
        "body": "@body('getAction')"
    },
    "runAfter": {
    "getAction": ["Succeeded"]
    },
    "type": "Http"
}