Azure Functions 바인딩 식 패턴

트리거와 바인딩의 가장 강력한 기능 중 하나는 바인딩 식입니다. function.json 파일에서 그리고 함수 매개 변수 및 코드에서 다양한 원본의 값을 확인하는 식을 사용할 수 있습니다.

대부분의 식은 중괄호로 래핑하여 식별됩니다. 예를 들어 큐 트리거 함수에서 {queueTrigger}는 큐 메시지 텍스트를 확인합니다. blob 출력 바인딩에 대한 path 속성이 container/{queueTrigger}이고 함수가 큐 메시지 HelloWorld에 의해 트리거되는 경우 HelloWorld라는 blob이 만들어집니다.

바인딩 식의 형식

바인딩 식 - 앱 설정

비밀과 연결 문자열은 구성 파일이 아닌 앱 설정을 사용하여 관리하는 것이 가장 좋습니다. 그럴 경우 이러한 비밀에 대한 액세스가 제한되고 function.json과 같은 파일을 공용 원본 제어 리포지토리에 안전하게 저장할 수 있습니다.

환경을 기준으로 구성을 변경하려는 경우에도 앱 설정이 유용합니다. 예를 들어 테스트 환경에서 다른 큐 또는 Blob Storage 컨테이너를 모니터링할 수 있습니다.

앱 설정 바인딩 식은 다른 바인딩 식과는 다르게 식별됩니다. 중괄호 대신 백분율 기호로 래핑됩니다. 예를 들어 blob 출력 바인딩 경로가 %Environment%/newblob.txt이고 Environment 앱 설정 값이 Development인 경우 blob은 Development 컨테이너에 생성됩니다.

함수를 로컬로 실행 중인 경우 앱 설정 값은 local.settings.json 파일에서 가져옵니다.

참고

트리거와 바인딩의 connection 속성은 특수한 경우이며 백분율 기호 없이 앱 설정으로 값을 자동 확인합니다.

다음 예제는 %input_queue_name% 앱 설정을 사용하여 트리거할 큐를 정의하는 Azure Queue Storage 트리거입니다.

{
  "bindings": [
    {
      "name": "order",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "%input_queue_name%",
      "connection": "MY_STORAGE_ACCT_APP_SETTING"
    }
  ]
}

클래스 라이브러리에서 동일한 방법을 사용할 수 있습니다.

[FunctionName("QueueTrigger")]
public static void Run(
    [QueueTrigger("%input_queue_name%")]string myQueueItem, 
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}

트리거 파일 이름

Blob 트리거에 대한 path는 다른 바인딩 및 함수 코드에서 blob 트리거의 이름을 참조할 수 있도록 하는 패턴일 수 있습니다. 또한 패턴은 함수 호출을 트리거할 수 있는 blob을 지정하는 필터링 조건을 포함할 수 있습니다.

예를 들어, 다음 Blob 트리거 바인딩에서 path 패턴은 sample-images/{filename}으로, filename이라는 바인딩 식을 만듭니다.

{
  "bindings": [
    {
      "name": "image",
      "type": "blobTrigger",
      "path": "sample-images/{filename}",
      "direction": "in",
      "connection": "MyStorageConnection"
    },
    ...

그런 다음, 식 filename은 출력 바인딩에서 생성되는 blob의 이름을 지정하는 데 사용될 수 있습니다.

    ...
    {
      "name": "imageSmall",
      "type": "blob",
      "path": "sample-images-sm/{filename}",
      "direction": "out",
      "connection": "MyStorageConnection"
    }
  ],
}

함수 코드는 매개 변수 이름으로 filename을 사용하여 이 동일한 값에 액세스할 수 있습니다.

// C# example of binding to {filename}
public static void Run(Stream image, string filename, Stream imageSmall, ILogger log)  
{
    log.LogInformation($"Blob trigger processing: {filename}");
    // ...
} 

바인딩 식 및 패턴을 사용하는 동일한 기능은 클래스 라이브러리의 특성에 적용됩니다. 다음 예제에서 특성 생성자 매개 변수는 앞의 function.json 예제와 동일한 path 값입니다.

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{filename}")] Stream image,
    [Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
    string filename,
    ILogger log)
{
    log.LogInformation($"Blob trigger processing: {filename}");
    // ...
}

또한 파일 이름 부분에 대한 식을 만들 수도 있습니다. 다음 예제에서 함수는 패턴과 일치하는 파일 이름에 대해서만 트리거됩니다. anyname-anyfile.csv

{
    "name": "myBlob",
    "type": "blobTrigger",
    "direction": "in",
    "path": "testContainerName/{date}-{filetype}.csv",
    "connection": "OrderStorageConnection"
}

Blob 경로 문자열에서 식 및 패턴을 사용하는 방법에 대한 자세한 내용은 스토리지 blob 바인딩 참조를 확인하세요.

트리거 메타데이터

트리거가 제공한 데이터 페이로드(예: 함수를 트리거한 큐 메시지의 콘텐츠) 이외에 많은 트리거가 추가 메타데이터 값을 제공합니다. 이러한 값은 C# 및 F#에서 입력 매개 변수로 사용하거나 JavaScript에서 context.bindings 개체의 속성으로 사용할 수 있습니다.

예를 들어 Azure Queue storage 트리거는 다음 속성을 지원합니다.

  • QueueTrigger - 유효한 문자열인 경우 트리거 메시지 내용
  • DequeueCount
  • ExpirationTime
  • Id
  • InsertionTime
  • NextVisibleTime
  • PopReceipt

이러한 메타데이터 값은 function.json 파일 속성에서 액세스할 수 있습니다. 예를 들어 큐 트리거를 사용하고 큐 메시지는 읽으려는 Blob의 이름을 포함한다고 가정합니다. function.json 파일에서 다음 예제와 같이 Blob path 속성에서 queueTrigger 메타데이터 속성을 사용할 수 있습니다.

{
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "queueTrigger",
      "queueName": "myqueue-items",
      "connection": "MyStorageConnection",
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "direction": "in",
      "connection": "MyStorageConnection"
    }
  ]
}

각 트리거의 메타데이터 속성은 해당 참조 문서에서 자세히 설명되어 있습니다. 예를 들어 큐 트리거 메타데이터를 참조하세요. 설명서는 Portal에서 통합 탭의 바인딩 구성 영역 아래 설명서 섹션에서도 참조할 수 있습니다.

JSON 페이로드

일부 시나리오에서는 동일한 함수 및 함수 코드의 다른 바인딩에 대한 구성에서 트리거 페이로드의 속성을 참조할 수 있습니다. 이렇게 하려면 트리거 페이로드가 JSON이고 각 트리거에 특정한 임계값보다 작아야 합니다. 일반적으로 페이로드 크기는 100MB 미만이어야 하지만 각 트리거에 대한 참조 콘텐츠를 검사 합니다. 트리거 페이로드 속성을 사용하면 애플리케이션의 성능에 영향을 줄 수 있으며 트리거 매개 변수 형식은 문자열이나 JSON 데이터를 나타내는 사용자 지정 개체 형식과 같은 단순 형식이 됩니다. 스트림, 클라이언트 또는 기타 SDK 형식과 함께 사용할 수 없습니다.

다음 예제에 JSON에서 blob 이름을 수신하는 웹후크 함수에 대한 function.json 파일이 나와 있습니다({"BlobName":"HelloWorld.txt"}). Blob 입력 바인딩은 blob을 읽고, HTTP 출력 바인딩은 HTTP 응답에서 blob 콘텐츠를 반환합니다. Blob 입력 바인딩은 BlobName 속성("path": "strings/{BlobName}")을 직접 참조하여 blob 이름을 가져옵니다.

{
  "bindings": [
    {
      "name": "info",
      "type": "httpTrigger",
      "direction": "in",
      "webHookType": "genericJson"
    },
    {
      "name": "blobContents",
      "type": "blob",
      "direction": "in",
      "path": "strings/{BlobName}",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ]
}

이렇게 하려면 C# 및 F#에서 다음 예제와 같이 역직렬화할 필드를 정의하는 클래스가 필요합니다.

using System.Net;
using Microsoft.Extensions.Logging;

public class BlobInfo
{
    public string BlobName { get; set; }
}
  
public static HttpResponseMessage Run(HttpRequestMessage req, BlobInfo info, string blobContents, ILogger log)
{
    if (blobContents == null) {
        return req.CreateResponse(HttpStatusCode.NotFound);
    } 

    log.LogInformation($"Processing: {info.BlobName}");

    return req.CreateResponse(HttpStatusCode.OK, new {
        data = $"{blobContents}"
    });
}

JavaScript에서 JSON deserialization은 자동으로 실행됩니다.

module.exports = async function (context, info) {
    if ('BlobName' in info) {
        context.res = {
            body: { 'data': context.bindings.blobContents }
        }
    }
    else {
        context.res = {
            status: 404
        };
    }
}

점 표기법

JSON 페이로드의 속성 중 일부가 속성을 가진 개체인 경우 점(.) 표기법을 사용하여 직접 참조할 수 있습니다. 이 표기법은 Azure Cosmos DB 또는 Table Storage 바인딩에는 작동하지 않습니다.

예를 들어 JSON이 다음과 같다고 가정합니다.

{
  "BlobName": {
    "FileName":"HelloWorld",
    "Extension":"txt"
  }
}

직접 FileNameBlobName.FileName으로 참조할 수 있습니다. 이 JSON 형식을 사용할 때 이전 예제에서의 path 속성은 다음과 같습니다.

"path": "strings/{BlobName.FileName}.{BlobName.Extension}",

C#에서 다음과 같은 두 개의 클래스가 필요합니다.

public class BlobInfo
{
    public BlobName BlobName { get; set; }
}
public class BlobName
{
    public string FileName { get; set; }
    public string Extension { get; set; }
}

GUID 만들기

{rand-guid} 바인딩 식은 GUID를 만듭니다. function.json 파일의 다음 blob 경로는 50710cb5-84b9-4d87-9d83-a03d6976a682.txt와 같은 이름의 blob을 만듭니다.

{
  "type": "blob",
  "name": "blobOutput",
  "direction": "out",
  "path": "my-output-container/{rand-guid}.txt"
}

현재 시간

바인딩 식 DateTimeDateTime.UtcNow로 확인됩니다. function.json 파일의 다음 blob 경로는 2018-02-16T17-59-55Z.txt와 같은 이름의 blob을 만듭니다.

{
  "type": "blob",
  "name": "blobOutput",
  "direction": "out",
  "path": "my-output-container/{DateTime}.txt"
}

런타임에 바인딩

C# 및 기타 .NET 언어에서는 function.json 및 특성의 바인딩과 달리 명령적 바인딩 패턴을 사용할 수 있습니다. 명령적 바인딩은 바인딩 매개 변수를 디자인 타임이 아닌 런타임에 계산해야 할 경우 유용합니다. 자세한 내용은 C# 개발자 참조 또는 C# 스크립트 개발자 참조를 확인하세요.

다음 단계