다음을 통해 공유


Azure Functions용 Dap 확장

Azure Functions용 Dapr 확장은 개발자가 Azure Functions를 Dapr(Distributed Application Runtime) 플랫폼과 쉽게 통합할 수 있는 도구 및 서비스 집합입니다.

Azure Functions는 다른 Azure 서비스와 쉽게 연결할 수 있도록 일련의 트리거 및 바인딩을 제공하는 이벤트 기반 컴퓨팅 서비스입니다. Dapr은 마이크로 서비스, 상태 관리, 게시/구독 메시징 등을 포함하여 분산 애플리케이션을 빌드하기 위한 일련의 구성 요소와 모범 사례를 제공합니다.

Dapr과 Functions의 통합을 통해 Dapr 또는 외부 시스템의 이벤트에 반응하는 함수를 빌드할 수 있습니다.

작업 방향 Type
Dapr 입력 바인딩 시 트리거 해당 없음 daprBindingTrigger
Dapr 서비스 호출 시 트리거 해당 없음 daprServiceInvocationTrigger
Dapr 항목 구독 시 트리거 해당 없음 daprTopicTrigger
실행을 위해 Dapr 상태 끌어오기 In daprState
실행을 위해 Dapr 비밀 끌어오기 In daprSecret
Dapr 상태에 값 저장 Out daprState
다른 Dapr 앱 호출 Out daprInvoke
Dapr 항목에 메시지 게시 Out daprPublish
Dapr 출력 바인딩에 값 보내기 Out daprBinding

확장 설치

설치하는 확장 NuGet 패키지는 함수 앱에서 사용 중인 C# 모드 진행 중 또는 격리된 작업자 프로세스에 따라 달라집니다.

이 확장은 NuGet 패키지 버전 1.0.0을 설치하여 사용할 수 있습니다.

.NET CLI 사용:

dotnet add package Microsoft.Azure.WebJobs.Extensions.Dapr

번들 설치

host.json 파일에 다음 코드를 추가하거나 바꿔 확장을 추가할 수 있습니다.

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Dapr 사용

런타임 컨텍스트에 따라 다양한 [인수 및 주석][dapr-args]을 사용하여 Dapr을 구성할 수 있습니다. 두 가지 채널을 통해 Azure Functions용 Dapr을 구성할 수 있습니다.

  • Bicep 또는 ARM(Azure Resource Manager) 템플릿과 같은 IaC(Infrastructure as Code) 템플릿
  • Azure Portal

IaC 템플릿을 사용하는 경우 컨테이너 앱 리소스 정의의 properties 섹션에서 다음 인수를 지정합니다.

DaprConfig: {
  enabled: true
  appId: '${envResourceNamePrefix}-funcapp'
  appPort: 3001
  httpReadBufferSize: ''
  httpMaxRequestSize: ''
  logLevel: ''
  enableApiLogging: true
}

위의 Dapr 구성 값은 애플리케이션 범위 변경으로 간주됩니다. 여러 수정 모드에서 컨테이너 앱을 실행하는 경우 이러한 설정을 변경해도 새 수정 버전이 만들어지지 않습니다. 대신, 모든 기존 수정 버전이 최신 값으로 구성되도록 다시 시작됩니다.

Azure Portal을 사용하여 Dapr을 구성하는 경우 함수 앱으로 이동하여 왼쪽 메뉴에서 Dapr을 선택합니다.

Azure Portal에서 함수 앱에 대한 Dapr 사용을 찾을 수 있는 위치를 보여 주는 스크린샷.

Dapr 포트 및 수신기

Dapr에서 함수를 트리거할 때 확장은 Dapr 사이드카에서 들어오는 요청을 수신 대기하기 위해 자동으로 포트 3001을 노출합니다.

Important

포트 3001은 Dapr 트리거가 함수 앱에 정의된 경우에만 노출되고 수신 대기됩니다. Dapr을 사용하는 경우 사이드카는 인스턴스화를 완료하기 전에 정의된 포트로부터 응답을 받을 때까지 기다립니다. 트리거가 없으면 dapr.io/port 주석 또는 --app-port를 정의하지 마세요. 그렇게 하면 Dapr 사이드카에서 애플리케이션이 잠길 수 있습니다.

입력 및 출력 바인딩만 사용하는 경우 포트 3001을 노출하거나 정의할 필요가 없습니다.

기본적으로 Azure Functions는 Dapr과 통신을 시도할 때 환경 변수 DAPR_HTTP_PORT에서 확인된 포트를 통해 Dapr을 호출합니다. 해당 변수가 null인 경우 기본값은 포트 3500입니다.

바인딩(또는 특성)에 대해 function.json에서 DaprAddress 속성을 설정하여 입출력 바인딩에 사용되는 Dapr 주소를 재정의할 수 있습니다. 기본적으로는 http://localhost:{DAPR_HTTP_PORT}를 사용합니다.

함수 앱은 로컬에서는 기본값이 7071이지만 컨테이너에서는 기본값이 80인 HTTP 트리거와 같은 항목에 대해 다른 포트와 엔드포인트를 계속 노출합니다.

바인딩 형식

.NET에 지원되는 바인딩 형식은 확장 버전과 C# 실행 모드에 따라 달라지며 다음 중 하나일 수 있습니다.

In Process 클래스 라이브러리는 Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다.

Dapr 확장은 아래 표에 따라 매개 변수 형식을 지원합니다.

바인딩 매개 변수 형식
Dapr 트리거 daprBindingTrigger
daprServiceInvocationTrigger
daprTopicTrigger
Dapr 입력 daprState
daprSecret
Dapr 출력 daprState
daprInvoke
daprPublish
daprBinding

이러한 형식을 사용하는 예제는 확장에 대한 GitHub 리포지토리를 참조하세요.

Azure Functions용 Dapr 확장 사용해 보기

제공된 샘플을 통해 Azure Functions용 Dapr 확장을 사용하는 방법을 알아봅니다.

샘플 설명
빠른 시작 Dapr Pub/sub 바인딩 및 HttpTrigger 사용을 시작합니다.
Dapr Kafka Kafka 바인딩 Dapr 구성 요소와 함께 Azure Functions Dapr 확장을 사용하는 방법을 알아봅니다.
.NET In Process Azure Functions In Process 모델을 사용하여 서비스 호출, 게시/구독, 바인딩 및 상태 관리와 같은 .NET의 여러 Dapr 구성 요소와 통합하는 방법을 알아봅니다.
.NET 격리 Azure Functions OOP(out-of-proc) 실행 모델을 사용하여 .NET의 Dapr 구성 요소와 통합합니다.

Azure Functions용 Dapr 확장 사용해 보기

제공된 샘플을 통해 Azure Functions용 Dapr 확장을 사용하는 방법을 알아봅니다.

샘플 설명
Java 함수 Java를 사용하여 Azure Functions Dapr 확장을 사용하는 방법을 알아봅니다.

Azure Functions용 Dapr 확장 사용해 보기

제공된 샘플을 통해 Azure Functions용 Dapr 확장을 사용하는 방법을 알아봅니다.

샘플 설명
빠른 시작 Dapr Pub/sub 바인딩 및 HttpTrigger 사용을 시작합니다.
Dapr Kafka Kafka 바인딩 Dapr 구성 요소와 함께 Azure Functions Dapr 확장을 사용하는 방법을 알아봅니다.
JavaScript JavaScript Dapr 함수 애플리케이션을 실행하고 Azure Functions를 사용하여 Dapr 서비스 호출, Pub/Sub, 바인딩 및 상태 관리와 통합합니다.

Azure Functions용 Dapr 확장 사용해 보기

제공된 샘플을 통해 Azure Functions용 Dapr 확장을 사용하는 방법을 알아봅니다.

샘플 설명
PowerShell 함수 PowerShell에서 Azure Functions Dapr 확장을 사용하는 방법을 알아봅니다.

Azure Functions용 Dapr 확장 사용해 보기

제공된 샘플을 통해 Azure Functions용 Dapr 확장을 사용하는 방법을 알아봅니다.

샘플 설명
Dapr Kafka Kafka 바인딩 Dapr 구성 요소와 함께 Azure Functions Dapr 확장을 사용하는 방법을 알아봅니다.
Python v1 Dapr화된 Python 애플리케이션을 실행하고 Azure Functions Python v1 프로그래밍 모델을 사용하여 Dapr 구성 요소와 통합합니다.
Python v2 Azure Functions Python v2 프로그래밍 모델을 사용하여 Dapr 애플리케이션을 시작하여 Dapr 구성 요소와 통합합니다.

문제 해결

이 섹션에서는 Azure Functions용 Dapr 확장을 사용할 때 발생할 수 있는 문제를 해결하는 방법을 설명합니다.

사용자의 환경에서 Dapr이 사용하도록 설정되어 있는지 확인

Azure Functions에서 Dapr 바인딩 및 트리거를 사용 중이고 Dapr이 사용자 환경에서 사용하도록 설정되지 않은 경우 다음 오류 메시지가 표시될 수 있습니다. Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information. 사용자 환경에서 Dapr을 사용하도록 설정하려면 다음을 수행합니다.

  • Azure 함수가 Azure Container Apps에 배포된 경우 Azure Functions용 Dapr 확장에 대한 Dapr 사용 지침을 참조하세요.

  • Azure 함수가 Kubernetes에 배포된 경우 배포의 YAML 구성에 다음 주석이 있는지 확인합니다.

    annotations:
      ...
      dapr.io/enabled: "true"
      dapr.io/app-id: "functionapp"
      # You should only set app-port if you are using a Dapr trigger in your code.
      dapr.io/app-port: "<DAPR_APP_PORT>"
      ...
    
  • Azure Function을 로컬에서 실행하는 경우 다음 명령을 실행하여 Dapr을 사용하여 함수 앱을 실행하는지 확인합니다.

    dapr run --app-id functionapp --app-port <DAPR_APP_PORT>  --components-path <COMPONENTS_PATH> -- func host start 
    

Dapr 구성에서 앱 포트 값 확인

Azure Functions용 Dapr 확장은 기본적으로 포트 3001에서 HTTP 서버를 시작합니다. DAPR_APP_PORT 환경 변수를 사용하여 이 포트를 구성할 수 있습니다.

Azure Functions 앱을 실행할 때 잘못된 앱 포트 값을 제공하면 다음 오류 메시지가 표시될 수 있습니다. The Dapr sidecar is configured to listen on port {portInt}, but the app server is running on port {appPort}. This may cause unexpected behavior. For more information, visit [this link](https://aka.ms/azfunc-dapr-app-config-error). 이 오류 메시지를 해결하려면 다음을 수행합니다.

  1. 컨테이너 앱의 Dapr 설정에서:

    • 코드에서 Dapr 트리거를 사용하는 경우 앱 포트가 3001 또는 DAPR_APP_PORT 환경 변수의 값으로 설정되어 있는지 확인합니다.

    • 코드에서 Dapr 트리거를 사용하지 않는 경우 앱 포트가 설정되지 않았는지 확인합니다. 이 컨테이너는 비어 있어야 합니다.

  2. Dapr 구성에 올바른 앱 포트 값을 제공했는지 확인합니다.

    • Azure Container Apps를 사용하는 경우 Bicep에서 앱 포트를 지정합니다.

      DaprConfig: {
         ...
         appPort: <DAPR_APP_PORT>
         ...
      }
      
    • Kubernetes 환경을 사용하는 경우 dapr.io/app-port 주석을 설정합니다.

      annotations:
         ...
         dapr.io/app-port: "<DAPR_APP_PORT>"
         ...
      
    • 로컬에서 개발하는 경우 Dapr을 사용하여 함수 앱을 실행할 때 --app-port를 설정했는지 확인합니다.

      dapr run --app-id functionapp --app-port <DAPR_APP_PORT> --components-path <COMPONENTS_PATH> -- func host start 
      

다음 단계

Dapr에 대해 자세히 알아봅니다.