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"
}
}
직접 FileName
을 BlobName.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"
}
현재 시간
바인딩 식 DateTime
은 DateTime.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# 스크립트 개발자 참조를 확인하세요.