Azure Functions의 Azure Queue Storage 트리거
큐 스토리지 트리거는 메시지가 Azure Queue Storage에 추가될 때 함수를 실행합니다.
사용량 및 프리미엄 계획에 대한 Azure Queue Storage 크기 조정 결정은 대상 기반 크기 조정을 통해 수행됩니다. 자세한 내용은 대상 기반 크기 조정을 참조하세요.
Important
이 문서에서는 탭을 사용하여 여러 버전의 Node.js 프로그래밍 모델을 지원합니다. v4 모델은 일반적으로 사용 가능하며 JavaScript 및 TypeScript 개발자를 위해 보다 유연하고 직관적인 환경을 제공하도록 설계되었습니다. v4 모델의 작동 방식에 대한 자세한 내용은 Azure Functions Node.js 개발자 가이드를 참조하세요. v3과 v4의 차이점에 대해 자세히 알아보려면 마이그레이션 가이드를 참조하세요.
Azure Functions는 Python에 대해 두 가지 프로그래밍 모델을 지원합니다. 바인딩을 정의하는 방법은 선택한 프로그래밍 모델에 따라 달라집니다.
Python v2 프로그래밍 모델을 사용하면 Python 함수 코드에서 직접 데코레이터를 사용하여 바인딩을 정의할 수 있습니다. 자세한 내용은 Python 개발자 가이드를 참조하세요.
이 문서에서는 두 프로그래밍 모델을 모두 지원합니다.
예시
큐 트리거를 사용하여 큐에서 새 항목을 받을 때 함수를 시작합니다. 큐 메시지는 함수에 입력으로 제공됩니다.
C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.
- 격리된 작업자 모델: 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 C# 함수입니다. LTS 및 비 LTS 버전 .NET 및 .NET Framework에서 실행되는 C# 함수를 지원하려면 격리된 작업자 프로세스가 필요합니다. 격리된 작업자 프로세스 함수에 대한 확장은
Microsoft.Azure.Functions.Worker.Extensions.*
네임스페이스를 사용합니다. - In Process 모델: Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다. 이 모델의 변형에서는 주로 C# 포털 편집에 지원되는 C# 스크립팅을 사용하여 Functions를 실행할 수 있습니다. In Process 함수에 대한 확장은
Microsoft.Azure.WebJobs.Extensions.*
네임스페이스를 사용합니다.
Important
In Process 모델에 대한 지원은 2026년 11월 10일에 종료됩니다. 전체 지원을 위해 앱을 격리된 작업자 모델로 마이그레이션하는 것이 좋습니다.
다음 예제는 input-queue
큐를 폴링하고 큐 항목이 처리될 때마다 출력 큐에 여러 메시지를 쓰는 C# 함수를 보여 줍니다.
[Function(nameof(QueueFunction))]
[QueueOutput("output-queue")]
public string[] Run([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)
{
// Use a string array to return more than one message.
string[] messages = {
$"Album name = {myQueueItem.Name}",
$"Album songs = {myQueueItem.Songs.ToString()}"};
_logger.LogInformation("{msg1},{msg2}", messages[0], messages[1]);
// Queue Output messages
return messages;
}
다음 Java 예제에서는 큐에 배치된 트리거된 메시지를 기록하는 스토리지 큐 myqueuename
트리거 함수를 보여 줍니다.
@FunctionName("queueprocessor")
public void run(
@QueueTrigger(name = "msg",
queueName = "myqueuename",
connection = "myconnvarname") String message,
final ExecutionContext context
) {
context.getLogger().info(message);
}
다음 예제에서는 큐 트리거 TypeScript 함수를 보여줍니다. 함수는 myqueue-items
큐를 폴링하고 큐 항목이 처리될 때마다 로그를 기록합니다.
import { app, InvocationContext } from '@azure/functions';
export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<void> {
context.log('Storage queue function processed work item:', queueItem);
context.log('expirationTime =', context.triggerMetadata.expirationTime);
context.log('insertionTime =', context.triggerMetadata.insertionTime);
context.log('nextVisibleTime =', context.triggerMetadata.nextVisibleTime);
context.log('id =', context.triggerMetadata.id);
context.log('popReceipt =', context.triggerMetadata.popReceipt);
context.log('dequeueCount =', context.triggerMetadata.dequeueCount);
}
app.storageQueue('storageQueueTrigger1', {
queueName: 'myqueue-items',
connection: 'MyStorageConnectionAppSetting',
handler: storageQueueTrigger1,
});
사용량 섹션에서는 queueItem
에 대해 설명합니다. 메시지 메타데이터 섹션에서는 표시된 다른 모든 변수에 대해 설명합니다.
다음 예제에서는 큐 트리거 JavaScript 함수를 보여줍니다. 함수는 myqueue-items
큐를 폴링하고 큐 항목이 처리될 때마다 로그를 기록합니다.
const { app } = require('@azure/functions');
app.storageQueue('storageQueueTrigger1', {
queueName: 'myqueue-items',
connection: 'MyStorageConnectionAppSetting',
handler: (queueItem, context) => {
context.log('Storage queue function processed work item:', queueItem);
context.log('expirationTime =', context.triggerMetadata.expirationTime);
context.log('insertionTime =', context.triggerMetadata.insertionTime);
context.log('nextVisibleTime =', context.triggerMetadata.nextVisibleTime);
context.log('id =', context.triggerMetadata.id);
context.log('popReceipt =', context.triggerMetadata.popReceipt);
context.log('dequeueCount =', context.triggerMetadata.dequeueCount);
},
});
사용량 섹션에서는 queueItem
에 대해 설명합니다. 메시지 메타데이터 섹션에서는 표시된 다른 모든 변수에 대해 설명합니다.
다음 예제에서는 트리거를 통해 함수에 전달된 큐 메시지를 읽는 방법을 보여 줍니다.
스토리지 큐 트리거는 function.json 파일에 정의되어 있으며 여기서 type
은 queueTrigger
로 설정됩니다.
{
"bindings": [
{
"name": "QueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "messages",
"connection": "MyStorageConnectionAppSetting"
}
]
}
Run.ps1 파일의 코드는 매개 변수를 함수에서 큐 메시지를 읽을 수 있는 매개 변수로 $QueueItem
선언합니다.
# Input bindings are passed in via param block.
param([string] $QueueItem, $TriggerMetadata)
# Write out the queue message and metadata to the information log.
Write-Host "PowerShell queue trigger function processed work item: $QueueItem"
Write-Host "Queue item expiration time: $($TriggerMetadata.ExpirationTime)"
Write-Host "Queue item insertion time: $($TriggerMetadata.InsertionTime)"
Write-Host "Queue item next visible time: $($TriggerMetadata.NextVisibleTime)"
Write-Host "ID: $($TriggerMetadata.Id)"
Write-Host "Pop receipt: $($TriggerMetadata.PopReceipt)"
Write-Host "Dequeue count: $($TriggerMetadata.DequeueCount)"
다음 예제에서는 트리거를 통해 함수에 전달된 큐 메시지를 읽는 방법을 보여 줍니다. 이 예제는 v1 또는 v2 Python 프로그래밍 모델을 사용하는지 여부에 따라 달라집니다.
import logging
import azure.functions as func
app = func.FunctionApp()
@app.function_name(name="QueueFunc")
@app.queue_trigger(arg_name="msg", queue_name="inputqueue",
connection="storageAccountConnectionString") # Queue trigger
@app.queue_output(arg_name="outputQueueItem", queue_name="outqueue",
connection="storageAccountConnectionString") # Queue output binding
def test_function(msg: func.QueueMessage,
outputQueueItem: func.Out[str]) -> None:
logging.info('Python queue trigger function processed a queue item: %s',
msg.get_body().decode('utf-8'))
outputQueueItem.set('hello')
특성
In Process 및 격리된 작업자 프로세스 C# 라이브러리 모두 QueueTriggerAttribute를 사용하여 함수를 정의합니다. 대신 C# 스크립트는 C# 스크립팅 가이드에 설명된 대로 function.json 구성 파일을 사용합니다.
C# 클래스 라이브러리에서 특성의 생성자는 다음 예제와 같이 모니터링할 큐의 이름을 사용합니다.
[Function(nameof(QueueFunction))]
[QueueOutput("output-queue")]
public string[] Run([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)
이 예제에서는 특성 자체에서 연결 문자열 설정을 설정하는 방법도 보여 줍니다.
주석
QueueTrigger
주석을 사용하면 함수를 트리거하는 큐에 액세스할 수 있습니다. 다음 예에서는 message
매개 변수를 통해 함수에서 큐 메시지를 사용할 수 있도록 합니다.
package com.function;
import com.microsoft.azure.functions.annotation.*;
import java.util.Queue;
import com.microsoft.azure.functions.*;
public class QueueTriggerDemo {
@FunctionName("QueueTriggerDemo")
public void run(
@QueueTrigger(name = "message", queueName = "messages", connection = "MyStorageConnectionAppSetting") String message,
final ExecutionContext context
) {
context.getLogger().info("Queue message: " + message);
}
}
속성 | 설명 |
---|---|
name |
함수 서명에서 매개 변수 이름을 선언합니다. 함수가 트리거되면 해당 매개 변수의 값이 큐 메시지의 내용을 포함합니다. |
queueName |
스토리지 계정에서 큐 이름을 선언합니다. |
connection |
스토리지 계정 연결 문자열 가리킵니다. |
데코레이터
Python v2 프로그래밍 모델에만 적용됩니다.
데코레이터를 사용하여 정의된 Python v2 함수의 경우 데코레이터의 다음 속성은 queue_trigger
Queue Storage 트리거를 정의합니다.
속성 | 설명 |
---|---|
arg_name |
함수 서명에서 매개 변수 이름을 선언합니다. 함수가 트리거되면 해당 매개 변수의 값이 큐 메시지의 내용을 포함합니다. |
queue_name |
스토리지 계정에서 큐 이름을 선언합니다. |
connection |
스토리지 계정 연결 문자열 가리킵니다. |
function.json 사용하여 정의된 Python 함수는 구성 섹션을 참조하세요.
구성
Python v1 프로그래밍 모델에만 적용됩니다.
다음 표에서는 function.json 파일 및 QueueTrigger
특성에 설정된 바인딩 구성 속성을 설명합니다.
function.json 속성 | 설명 |
---|---|
type | queueTrigger 로 설정해야 합니다. 이 속성은 사용자가 Azure Portal에서 트리거를 만들 때 자동으로 설정됩니다. |
direction | function.json 파일에서만 적용됩니다. in 로 설정해야 합니다. 이 속성은 사용자가 Azure Portal에서 트리거를 만들 때 자동으로 설정됩니다. |
이름 | 함수 코드에서 큐 항목 페이로드를 포함하는 변수 이름입니다. |
queueName | 폴링할 큐의 이름입니다. |
connection | Azure 큐에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 연결을 참조하세요. |
전체 예제는 예제 섹션을 참조하세요.
로컬에서 개발하는 경우 Values
컬렉션의 local.settings.json 파일에 애플리케이션 설정을 추가합니다.
사용
참고 항목
함수에는 base64로 인코딩된 문자열이 필요합니다. 데이터를 base64로 인코딩된 문자열로 준비하기 위해 인코딩 형식을 조정하려면 호출 서비스에서 구현해야 합니다.
큐 트리거의 사용은 다음 모드 중 하나일 수 있는 함수 앱에서 사용되는 확장 패키지 버전 및 C# 형식에 따라 달라집니다.
격리된 작업자 프로세스 클래스 라이브러리 컴파일된 C# 함수는 런타임에서 격리된 프로세스에서 실행됩니다.
버전을 선택하여 모드 및 버전에 대한 사용 세부 정보를 확인합니다.
큐 트리거는 다음 형식에 바인딩할 수 있습니다.
Type | 설명 |
---|---|
string |
메시지 콘텐츠를 문자열로 지정입니다. 메시지가 간단한 텍스트일 때 사용합니다. |
byte[] |
메시지의 바이트입니다. |
JSON 직렬화 가능 형식 | 큐 메시지에 JSON 데이터가 포함된 경우 Functions는 JSON 데이터를 POCO(일반 CLR 개체) 형식으로 역직렬화하려고 합니다. |
QueueMessage1 | 메시지입니다. |
BinaryData1 | 메시지의 바이트입니다. |
1 이러한 형식을 사용하려면 Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues 5.2.0 이상 및 SDK 형식 바인딩에 대한 일반적인 종속성을 참조해야 합니다.
QueueTrigger 주석을 사용하면 함수를 트리거한 큐 메시지에 액세스할 수 있습니다.
function.json 파일에서 바인딩의 name
매개 변수로 지정된 이름과 일치하는 문자열 매개 변수를 통해 큐 메시지에 액세스합니다.
QueueMessage로 형식화된 매개 변수를 통해 큐 메시지에 액세스합니다.
메타데이터
큐 트리거는 여러 메타데이터 속성을 제공합니다. 이러한 속성은 다른 바인딩의 바인딩 식의 일부로 사용하거나 메시지 메타데이터에 대한 이 액세스를 제공하는 언어 작업자의 경우 코드의 매개 변수로 사용할 수 있습니다.
메시지 메타데이터 속성은 CloudQueueMessage 클래스의 멤버입니다.
메시지 메타데이터 속성은 .에서 context.triggerMetadata
액세스할 수 있습니다.
전달된 $TriggerMetadata
매개 변수에서 메시지 메타데이터 속성에 액세스할 수 있습니다.
속성 | Type | 설명 |
---|---|---|
QueueTrigger |
string |
큐 페이로드(유효한 문자열인 경우). 큐 메시지 페이로드가 문자열 QueueTrigger 인 경우 function.json 속성에 의해 명명된 name 변수와 동일한 값을 가집니다. |
DequeueCount |
long |
이 메시지가 큐에서 제거된 횟수입니다. |
ExpirationTime |
DateTimeOffset |
메시지가 만료되는 시간입니다. |
Id |
string |
큐 메시지 ID입니다. |
InsertionTime |
DateTimeOffset |
메시지가 큐에 추가된 시간입니다. |
NextVisibleTime |
DateTimeOffset |
메시지가 다음에 표시되는 시간입니다. |
PopReceipt |
string |
메시지의 팝 영수증입니다. |
다음 메시지 메타데이터 속성은 전달된 바인딩 매개 변수(msg
이전 예제)에서 액세스할 수 있습니다.
속성 | 설명 |
---|---|
body |
큐 페이로드를 문자열로 지정합니다. |
dequeue_count |
이 메시지가 큐에서 제거된 횟수입니다. |
expiration_time |
메시지가 만료되는 시간입니다. |
id |
큐 메시지 ID입니다. |
insertion_time |
메시지가 큐에 추가된 시간입니다. |
time_next_visible |
메시지가 다음에 표시되는 시간입니다. |
pop_receipt |
메시지의 팝 영수증입니다. |
연결
connection
속성은 앱이 Azure Queues에 연결해야 하는 방법을 지정하는 환경 구성에 대한 참조입니다. 다음을 지정할 수 있습니다.
구성된 값이 단일 설정에 대해 정확히 일치하고 다른 설정에 대해 접두사가 일치하는 경우 정확한 일치가 사용됩니다.
연결 문자열
연결 문자열을 가져오려면 스토리지 계정 액세스 키 관리에 표시된 단계를 따릅니다.
이 연결 문자열은 바인딩 구성의 connection
속성에 지정된 값과 일치하는 이름으로 애플리케이션 설정에 저장해야 합니다.
앱 설정 이름이 "AzureWebJobs"로 시작하는 경우 여기서 이름의 나머지만 지정할 수 있습니다. 예를 들어 connection
을 "MyStorage"로 설정하면 Functions 런타임은 "AzureWebJobsMyStorage"라는 앱 설정을 찾습니다. connection
을 비워두면 Functions 런타임은 AzureWebJobsStorage
라는 앱 설정의 기본 Storage 연결 문자열을 사용합니다.
ID 기반 연결
버전 5.x 이상(non-.NET 언어 스택의 경우 번들 3.x 이상)을 사용하는 경우 비밀과 함께 연결 문자열 사용하는 대신 앱에서 Microsoft Entra ID를 사용하도록 할 수 있습니다. ID를 사용하려면 트리거 및 바인딩 구성의 connection
속성에 매핑되는 공통 접두사 아래에 설정을 정의합니다.
connection
을 "AzureWebJobsStorage"로 설정하는 경우 ID로 호스트 스토리지에 연결을 참조하세요. 다른 모든 연결의 경우 확장에는 다음 속성이 필요합니다.
속성 | 환경 변수 템플릿 | 설명 | 예제 값 |
---|---|---|---|
큐 서비스 URI | <CONNECTION_NAME_PREFIX>__queueServiceUri 1 |
HTTPS 체계를 사용하여 연결 중인 큐 서비스의 데이터 평면 URI입니다. | https://<storage_account_name>.queue.core.windows.net |
1 <CONNECTION_NAME_PREFIX>__serviceUri
은 별칭으로 사용할 수 있습니다. 두 양식이 모두 제공되면 queueServiceUri
양식이 사용됩니다. 전체 연결 구성이 Blob, 큐 및/또는 테이블에서 사용되는 경우 serviceUri
형식을 사용할 수 없습니다.
연결을 사용자 지정하기 위해 다른 속성을 설정할 수 있습니다. ID 기반 연결의 공통 속성을 참조하세요.
Azure Functions 서비스에서 호스트되는 경우 ID 기반 연결에 관리 ID가 사용됩니다. 사용자가 할당한 ID는 credential
및 clientID
속성을 사용하여 지정할 수 있지만 기본적으로 시스템 할당 ID가 사용됩니다. 리소스 ID를 사용하여 사용자가 할당한 ID를 구성하는 것은 지원되지 않습니다. 로컬 개발과 같은 다른 컨텍스트에서 실행할 때 사용자 지정할 수 있지만 대신 개발자 ID가 사용됩니다. ID 기반 연결을 사용하여 로컬 개발을 참조하세요.
ID에 권한 부여
사용되는 모든 ID에는 의도한 작업을 수행할 수 있는 권한이 있어야 합니다. 대부분 Azure 서비스의 경우 이는 해당 권한을 제공하는 기본 제공 또는 사용자 지정 역할을 사용하여 Azure RBAC에서 역할을 할당해야 함을 의미합니다.
Important
일부 사용 권한은 모든 컨텍스트에 필요하지 않은 대상 서비스에 의해 노출될 수 있습니다. 가능한 경우 최소 권한 원칙을 준수하여 ID에 필요한 권한만 부여하세요. 예를 들어 앱이 데이터 원본에서 읽을 수만 있으면 되는 경우 읽기 권한만 있는 역할을 사용합니다. 읽기 작업에 대한 과도한 권한이 될 수 있으므로 해당 서비스에 쓰기도 허용하는 역할을 할당하는 것은 부적절합니다. 마찬가지로 역할 할당이 읽어야 하는 리소스에 대해서만 범위가 할당되도록 할 수 있습니다.
런타임에 큐에 대한 액세스를 제공하는 역할 할당을 만들어야 합니다. 소유자와 같은 관리 역할로는 충분하지 않습니다. 다음 표는 정상 작동에서 Queue Storage 확장을 사용할 때 권장되는 기본 제공 역할을 보여 줍니다. 작성하는 코드에 따라 애플리케이션에 추가 권한이 필요할 수 있습니다.
바인딩 유형 | 기본 제공 역할 예 |
---|---|
트리거 | Storage 큐 데이터 읽기 권한자, Storage 큐 데이터 메시지 프로세서 |
출력 바인딩 | Storage 큐 데이터 기여자, Storage 큐 데이터 메시지 보낸 사람 |
포이즌 메시지
큐 트리거 함수가 실패하면 Azure Functions는 첫 번째 시도를 포함하여 지정된 큐 메시지에 대해 함수를 최대 5번 다시 시도합니다. 5번의 시도가 모두 실패하면 함수 런타임은 originalqueuename-poison>이라는 <큐에 메시지를 추가합니다. 메시지를 기록하거나 수동 작업이 필요하다는 알림을 보내 포이즌 큐의 메시지를 처리하는 함수를 작성할 수 있습니다.
포이즌 메시지를 수동으로 처리하려면 큐 메시지의 dequeueCount 를 확인합니다.
피킹 잠금
피킹 잠금 패턴은 스토리지 서비스에서 제공하는 가시성 메커니즘을 사용하여 큐 트리거에 대해 자동으로 수행됩니다. 트리거된 함수에 의해 메시지가 큐에서 제거되면 보이지 않는 것으로 표시됩니다. 큐 트리거 함수를 실행하면 큐의 메시지에 다음 결과 중 하나가 있을 수 있습니다.
- 함수 실행이 성공적으로 완료되고 메시지가 큐에서 삭제됩니다.
- 함수 실행이 실패하고 Functions 호스트는 host.json 파일의 설정에
visibilityTimeout
따라 메시지의 표시 유형을 업데이트합니다. 기본 표시 시간 제한은 0입니다. 즉, 메시지가 다시 처리하기 위해 큐에 즉시 다시 나타납니다. 이visibilityTimeout
설정을 사용하여 처리에 실패한 메시지의 재처리를 지연합니다. 이 시간 제한 설정은 함수 앱의 모든 큐 트리거 함수에 적용됩니다. - 함수를 실행하는 동안 Functions 호스트가 충돌합니다. 이 일반적이지 않은 이벤트가 발생하면 호스트는 처리 중인 메시지에 적용
visibilityTimeout
할 수 없습니다. 대신, 메시지는 스토리지 서비스에서 설정한 기본 10분 시간 제한으로 남습니다. 10분 후에 메시지가 다시 처리하기 위해 큐에 다시 나타납니다. 이 서비스 정의 기본 시간 제한은 변경할 수 없습니다.
폴링 알고리즘
큐 트리거는 임의 지수 백오프 알고리즘을 구현하여 스토리지 트랜잭션 비용에 유휴 큐 폴링의 영향을 줄입니다.
알고리즘은 다음 논리를 사용합니다.
- 메시지가 발견되면 런타임은 100밀리초를 기다린 다음 다른 메시지를 확인합니다.
- 메시지가 없으면 다시 시도하기 전에 약 200밀리초 정도 기다립니다.
- 이후 큐 메시지를 가져오는 데 실패한 후에는 대기 시간이 최대 대기 시간에 도달할 때까지 계속 증가하며 기본값은 1분입니다.
- 최대 대기 시간은 host.json 파일의
maxPollingInterval
속성을 통해 구성할 수 있습니다.
로컬 개발 중에는 최대 폴링 간격이 기본적으로 2초로 설정됩니다.
참고 항목
소비 계획에서 함수 앱을 호스팅할 때 청구와 관련하여 런타임에 의한 폴링에 소요된 시간에 대해서는 요금이 청구되지 않습니다.
동시성
대기 중인 큐 메시지가 여러 개 있는 경우 큐 트리거는 메시지 일괄 처리를 검색하고 함수 인스턴스를 동시에 호출하여 처리합니다. 기본적으로 일괄 처리 크기는 16입니다. 처리 중인 숫자가 8로 감소하면 런타임은 다른 일괄 처리를 가져오고 해당 메시지 처리를 시작합니다. 따라서 하나의 VM(가상 머신)에서 함수당 처리되는 최대 동시 메시지 수는 24개입니다. 이 제한은 각 VM의 각 큐 트리거 함수에 개별적으로 적용됩니다. 함수 앱이 여러 VM으로 확장되면 각 VM은 트리거를 대기하고 함수 실행을 시도합니다. 예를 들어 함수 앱이 3개의 VM으로 확장되는 경우 큐에 트리거된 함수 중 하나의 동시 인스턴스의 기본 최대 수는 72개입니다.
일괄 처리 크기 및 새 일괄 처리를 가져오기 위한 임계값은 host.json 파일에서 구성 가능합니다. 함수 앱에서 큐 트리거 함수에 대한 병렬 실행을 최소화하려면 일괄 처리 크기를 1로 설정할 수 있습니다. 이 설정은 함수 앱이 단일 VM(가상 머신)에서 실행되는 한 동시성을 제거합니다.
큐 트리거는 함수가 큐 메시지를 동시에 여러 번 처리하는 것을 자동으로 방지합니다.
host.json 속성
host.json 파일에는 큐 트리거 동작을 제어하는 설정이 포함됩니다. 사용 가능한 설정에 대한 자세한 내용은 host.json 설정 섹션을 참조하세요.