Standard workflows for Azure Logic Apps에서 로컬 함수를 만들고 실행하세요

적용 대상: Azure Logic Apps(표준)

통합 워크플로우가 내장 연산과 사전 구축된 커넥터를 넘어선 논리가 필요할 때, 코드가 로직 앱 솔루션에 특화된 로컬 함수 를 만드세요. 이 로컬 함수는 사용자 지정 .NET 코드로, 사용자가 작성, 실행, 디버깅, 배포하는 동일한 Azure Logic Apps 프로젝트 내에서 호출자 워크플로우와 동일하게 배포됩니다. 함수를 로컬로 유지함으로써 워크플로우와 그 맞춤형 코드를 하나의 앱으로 개발, 보호, 배포, 확장, 운영할 수 있습니다.

로컬 함수는 워크플로우가 다음과 같은 작업을 수행하도록 돕습니다:

  • 맞춤형 비즈니스 로직과 계산을 구현하세요.
  • 독점 또는 복잡한 인바운드 메시지를 파싱하세요.
  • 데이터에 대한 검증, 강화 또는 간단한 변환을 수행합니다.
  • API, 커넥터 또는 파트너 시스템에 맞게 아웃바운드 메시지를 형성하세요.
  • 기존 통합 솔루션에서 적합한 .NET 보조 로직을 재사용하며, BizTalk Server 마이그레이션 시나리오도 포함됩니다.

로컬 함수를 통해 다음과 같은 목표를 달성할 수 있습니다:

목표 Capability
하나의 솔루션을 개발하고 디버깅하세요 워크플로우와 로컬 함수를 같은 Visual Studio Code 작업 공간에서 생성하고, 한 번의 디버깅 세션에서 두 기능을 단계별로 진행하세요.
함께 배치하세요 별도의 서비스 계획을 프로비저닝하지 않고 콜러 워크플로우와 함께 로컬 기능을 구축하고 배포하세요.
서비스 경계 축소 워크플로우별 코드에 따라 별도의 함수 앱, HTTP 엔드포인트, 인증 흐름, 네트워크 홉을 피하세요.
로우코드 도구와 프로코드 도구를 결합하세요 통합 흐름에는 커넥터와 워크플로우 오케스트레이션을 사용하세요. 특수한 .NET 논리를 위해 로컬 함수를 사용하세요.

로컬 함수는 Azure Functions 내 별도의 함수 앱에 호스팅된 함수와 다릅니다. Azure Functions는 코드가 독립적인 엔드포인트를 노출하거나, 앱 간에 공유되어야 하거나, 자체 배포 및 버전 관리 수명 주기를 따르거나, 독립적으로 확장해야 할 때 가장 잘 작동합니다. 코드가 특정 Azure Logic Apps Standard 솔루션 내에서 작동하고 애플리케이션 라이프사이클을 호출자 워크플로우와 공유해야 할 때는 로컬 함수를 사용하세요.

이 가이드는 Visual Studio Code를 사용하여 표준 워크플로우를 위한 로컬 .NET 함수를 생성, 빌드, 호출, 디버깅 및 배포하는 방법을 보여줍니다.

참고

로컬 함수는 다음 상황에 적합하지 않습니다:

  • 10분을 초과할 수 있는 실행 중인 프로세스입니다.
  • 스트리밍을 구현하는 BizTalk Server 파이프라인 컴포넌트를 사용하세요.

자세한 내용은 제한 사항을 참조하세요.

필수 구성 요소

  • Azure 계정 및 구독입니다. 무료 Azure 계정을 만듭니다.

  • Azure Logic Apps(표준) 확장의 가장 최근 Visual Studio Code.

    필수 구성 요소는 Visual Studio Code 사용하여 단일 테넌트 Azure Logic Apps 표준 워크플로 만들기를 참조하세요.

    확장은 다음과 같은 기능과 이점을 제공합니다.

    • 가장 어려운 통합 문제를 해결하기 위해 유연성과 제어가 가능한 함수를 만들어 사용자 고유의 코드를 작성합니다.
    • Visual Studio Code 로컬로 코드를 디버그합니다. 동일한 디버깅 세션에서 코드 및 워크플로를 단계별로 실행합니다.
    • 워크플로와 함께 코드를 배포합니다. 다른 서비스 계획은 필요하지 않습니다.
    • 사용자 지정 .NET 투자를 온-프레미스에서 클라우드로 전환할 수 있도록 BizTalk Server 마이그레이션 시나리오를 지원합니다.
  • 코드 프로젝트에 사용할 로컬 폴더입니다.

제한 사항

  • 로컬 함수는 Windows에서 실행되는 Visual Studio Code에서만 작성할 수 있습니다. 이 기능은 Workflow Service Plan, App Service Environment v3(ASE v3), 또는 Hybrid에서 호스팅되는 표준 워크플로우를 위한 .NET Framework 및 .NET 8을 지원합니다.

  • Azure 포털에서는 사용자 지정 함수 작성을 사용할 수 없습니다. 그러나 워크플로에서 사용자 지정 함수의 출력을 사용하려면 다음 단계를 수행합니다.

    1. 함수를 Azure에 배포한 후, Azure 포털에서 제공하는 워크플로에서 코드 호출 단계를 따르세요.

    2. 이 논리 앱에서 로컬 함수 호출이라는 기본 제공 작업을 워크플로에 추가합니다. 원하는 배포된 사용자 지정 함수를 선택하고 코드를 실행합니다.

    3. 다른 워크플로에서처럼 후속 워크플로 작업을 사용하여 사용자 지정 함수 출력을 참조합니다. 기본 제공 작업의 실행 기록, 입력 및 출력을 볼 수 있습니다.

일반적인 제한 사항은 Azure Logic Apps의 제한 및 구성 참조를 참조하십시오.

1: 코드 프로젝트 만들기

Visual Studio Code Azure Logic Apps(표준) 확장에는 워크플로를 사용하여 사용자 고유의 코드를 작성, 디버깅 및 배포하기 위한 간소화된 환경을 제공하는 코드 프로젝트 템플릿이 포함되어 있습니다. 이 프로젝트 템플릿은 작업 영역 파일과 두 개의 샘플 프로젝트를 만듭니다. 하나는 코드를 작성할 프로젝트이고 다른 프로젝트는 워크플로를 만듭니다.

참고

코드와 워크플로 모두에 동일한 프로젝트 폴더를 사용할 수 없습니다.

코드 프로젝트를 만들려면 다음 단계를 수행합니다.

  1. Visual Studio Code에서 Azure 계정에 로그인하세요.

    로그인 시간이 평소보다 오래 걸리면 Visual Studio Code 디바이스 코드를 제공하여 Microsoft 인증 웹 사이트를 통해 로그인하라는 메시지를 표시합니다. 대신 코드를 사용하여 로그인하려면 다음 단계를 수행합니다.

    1. 디바이스 코드 사용을 선택한 다음 복사 및 열기를 선택합니다.

    2. 링크 열기를 선택하여 새 브라우저 창을 열고 인증 웹 사이트로 계속 진행합니다.

    3. 계정에 로그인 페이지에서 인증 코드를 입력하고, 다음을 선택합니다.

  2. 작업 표시줄에서 Azure 아이콘을 선택합니다.

  3. Azure 창에서 Workspace 섹션으로 이동합니다. 도구 모음이 표시되도록 포인터를 제목 영역 위로 이동합니다.

  4. Azure Logic Apps 메뉴에서 새 논리 앱 작업 영역 만들기를 선택합니다.

    Visual Studio Code, Azure 창, Workspace 툴바 메뉴를 보여주는 스크린샷으로, Create new logic app workspace가 선택되어 있습니다.

  5. 폴더 선택 창에서 로컬 프로젝트 폴더로 이동하여 폴더를 선택한 다음 선택합니다.

  6. 새 논리 앱 작업 영역 만들기 창에서 작업 영역 이름 프롬프트에 대해 작업 영역의 이름을 입력한 다음 Enter 키를 누릅니다.

    이 예제에서는 작업 영역 이름으로 사용합니다 weather-app .

    작업 공간 이름 입력 프롬프트를 보여주는 스크린샷입니다.

  7. 새 프로젝트 프롬프트 에 대한 템플릿 선택 에서 사용자 지정 코드 프로젝트가 있는 논리 앱을 선택합니다.

    템플릿 목록과 '사용자 지정 코드가 포함된 Logic App 프로젝트'에 대해 선택된 옵션이 표시된 새 Logic App 작업 영역 만들기 화면을 보여주는 스크린샷입니다.

  8. 대상 프레임워크 선택 프롬프트에서 .NET Framework 또는 .NET 8 선택합니다.

  9. 다음 프롬프트에 따라 다음 정보를 제공합니다.

    프롬프트 예제 값
    논리 앱 이름 weather-logic-app
    .NET 함수 프로젝트의 기능 이름 WeatherForecast
    .NET 함수 프로젝트의 Namespace Contoso.Enterprise
    프로젝트의 첫 번째 워크플로에 대한 템플릿을 선택합니다.

    - 상태 저장 워크플로
    - 무상태 워크플로
    - 자율 에이전트
    - 대화형 에이전트
    - 지금은 건너뛰기
    스테이트풀 워크플로
    워크플로 이름 weather-workflow
  10. 프로젝트 프롬프트 를 여는 방법을 선택하려면현재 창에서 열기를 선택합니다.

    이 단계를 완료한 후 Visual Studio Code .NET 함수 프로젝트와 논리 앱 프로젝트를 포함하는 작업 영역을 만듭니다. 예를 들면 다음과 같습니다.

    로직 앱 프로젝트와 .NET 함수 프로젝트가 포함된 생성된 작업 공간을 보여주는 스크린샷입니다.

    탐색기 창에서 작업 영역의 다음 폴더를 확인합니다.

    Folder 설명
    < 작업 공간-이름> .NET 함수 프로젝트와 논리 앱 워크플로 프로젝트를 모두 포함합니다.
    < 논리-앱-이름> 논리 앱 프로젝트에 대한 파일 및 기타 아티팩트가 포함됩니다. 예를 들어 workflow.json 파일은 워크플로를 빌드할 수 있는 워크플로 정의 파일입니다.
    < 함수명(function-name)> .NET 함수 프로젝트에 대한 파일 및 기타 아티팩트가 포함되어 있습니다. 예를 들어 <function-name.cs> 파일은 코드를 작성할 수 있는 코드 파일입니다.
  11. Azure Logic Apps에 대한 커넥터를 활성화<logic-app-name> 프롬프트에서 Azure에서 커넥터 사용을 선택합니다.

  12. 구독 선택 프롬프트에서 원하는 Azure 구독을 선택합니다.

  13. 새 리소스에 대한 리소스 그룹 선택 프롬프트의 경우 원하는 리소스 그룹을 선택하거나 새 리소스 그룹을 만듭니다.

  14. 새 리소스의 위치 선택 프롬프트에서 배포할 Azure 지역을 선택합니다.

  15. Azure 커넥터에 대한 인증 방법 선택 인증이 필요한 연결에 사용할 인증 유형을 선택합니다.

    인증 유형 설명
    관리형 아이덴티티 논리 앱 리소스에서 시스템 할당 또는 사용자 할당 ID를 사용하려면 관리 서비스 ID를 선택합니다.

    기본적으로 표준 논리 앱 리소스에는 이미 시스템 할당 ID가 사용하도록 설정되어 있습니다. 그러나 대상 리소스에 대한 역할 액세스 권한과 기타 요구 사항을 사용하여 ID를 설정해야 합니다.

    자세한 내용은 관리 ID에 대한 역할 기반 액세스 할당을 참조하세요.
    연결 키 연결 문자열 및 액세스 키를 사용하여 대상 리소스에 대한 액세스를 설정합니다.

이러한 단계를 완료한 후 코드를 작성할 수 있도록 다음 섹션으로 계속 진행합니다.

2: 코드 작성

  1. 탐색기 창에서 함수 프로젝트 폴더를 확장하고 <.cs 파일을 엽니다>.

    이 파일에는 이전에 제공한 값이 포함된 샘플 코드 및 특정 코드 요소가 포함되어 있습니다.

    이 예제에서 WeatherForecast.cs 함수 파일에는 예제 값이 포함된 다음 코드 요소가 포함되어 있습니다.

    코드 요소 가치
    네임스페이스 이름 Contoso.Enterprise
    클래스 이름 WeatherForecast
    함수 이름 WeatherForecast
    함수 매개 변수 zipCode, temperatureScale
    반환 형식 Task<Weather>
    복합 형식 Weather

    다음 예제에서는 전체 샘플 코드를 보여줍니다.

    //------------------------------------------------------------
    // Copyright (c) Microsoft Corporation. All rights reserved.
    //------------------------------------------------------------
    
    namespace Contoso.Enterprise
    {
        using System;
        using System.Collections.Generic;
        using System.Threading.Tasks;
        using Microsoft.Azure.Functions.Extensions.Workflows;
        using Microsoft.Azure.WebJobs;
        using Microsoft.Extensions.Logging;
    
        /// <summary>
        /// Represents the WeatherForecast flow invoked function.
        /// </summary>
        public class WeatherForecast
        {
    
            private readonly ILogger<WeatherForecast> logger;
    
            public WeatherForecast(ILoggerFactory loggerFactory)
            {
                logger = loggerFactory.CreateLogger<WeatherForecast>();
            }
    
            /// <summary>
            /// Executes the logic app workflow.
            /// </summary>
            /// <param name="zipCode">The zip code.</param>
            /// <param name="temperatureScale">The temperature scale (e.g., Celsius or Fahrenheit).</param>
            [FunctionName("WeatherForecast")]
            public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
            {
    
                this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
                // Generate random temperature within a range based on the temperature scale
                Random rnd = new Random();
                var currentTemp = temperatureScale == "Celsius" ? rnd.Next(1, 30) : rnd.Next(40, 90);
                var lowTemp = currentTemp - 10;
                var highTemp = currentTemp + 10;
    
                // Create a Weather object with the temperature information
                var weather = new Weather()
                {
                    ZipCode = zipCode,
                    CurrentWeather = $"The current weather is {currentTemp} {temperatureScale}",
                    DayLow = $"The low for the day is {lowTemp} {temperatureScale}",
                    DayHigh = $"The high for the day is {highTemp} {temperatureScale}"
                };
    
                return Task.FromResult(weather);
            }
    
            /// <summary>
            /// Represents the weather information for WeatherForecast.
            /// </summary>
            public class Weather
            {
                /// <summary>
                /// Gets or sets the zip code.
                /// </summary>
                public int ZipCode { get; set; }
    
                /// <summary>
                /// Gets or sets the current weather.
                /// </summary>
                public string CurrentWeather { get; set; }
    
                /// <summary>
                /// Gets or sets the low temperature for the day.
                /// </summary>
                public string DayLow { get; set; }
    
                /// <summary>
                /// Gets or sets the high temperature for the day.
                /// </summary>
                public string DayHigh { get; set; }
            }
        }
    }
    

    함수 정의에는 시작하는 데 사용할 수 있는 기본 Run 메서드가 포함되어 있습니다. 이 샘플 Run 메서드는 복잡한 .NET 형식을 포함하여 다양한 입력 및 출력 전달과 같은 사용자 지정 함수 기능에서 사용할 수 있는 몇 가지 기능을 보여 줍니다.

    < .cs 파일에는> Application Insights 리소스에 이벤트 로깅을 지원하는 인터페이스도 포함되어 ILogger 있습니다. Application Insights에 추적 정보를 보내고 워크플로의 추적 정보를 사용하여 해당 정보를 저장할 수 있습니다. 예를 들면 다음과 같습니다.

    private readonly ILogger<WeatherForecast> logger;
    
    public WeatherForecast(ILoggerFactory loggerFactory)
    {
        logger = loggerFactory.CreateLogger<WeatherForecast>();
    }
    
    [FunctionName("WeatherForecast")]
    public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
    {
    
        this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
        <...>
    
    }
    
  2. 샘플 함수 코드를 사용자 고유의 코드로 바꾸고 특정 시나리오에 대한 기본 Run 메서드를 편집합니다. 또는 [FunctionName("<function-name>")] 선언을 포함하여 함수를 복사한 다음 고유한 이름으로 함수의 이름을 바꿀 수 있습니다. 그런 다음, 필요에 맞게 이름이 바뀐 함수를 편집할 수 있습니다.

이 예제에서는 변경 내용이 없다고 가정하여 원래 샘플 코드를 계속 사용합니다.

3: 코드 컴파일 및 빌드

코드를 다 작성한 후에는 빌드 오류가 없는지 컴파일하세요. .NET 함수 프로젝트에는 자동으로 코드를 컴파일하고 로직 앱 프로젝트의 lib\custom 폴더에 추가하는 빌드 작업이 포함되어 있습니다. 워크플로우는 이 폴더에서 사용자 지정 함수를 찾습니다. .NET 버전에 따라 이러한 작업은 어셈블리를 lib\custom\net472 또는 lib\custom\net8 폴더에 배치합니다.

아래 단계를 수행하세요.

  1. Visual Studio Code 작업 모음에서 Explorer 선택합니다.

  2. 탐색기 창에서 함수 프로젝트 폴더의 바로 가기 메뉴를 열고 함수 프로젝트 빌드를 선택합니다.

    Build functions 프로젝트 옵션을 선택한 함수 프로젝트 바로가기 메뉴를 보여주는 스크린샷입니다.

    빌드 작업은 함수 프로젝트에 대해 실행됩니다. 빌드에 성공하면 터미널 창에 빌드 성공 메시지가 표시됩니다.

  3. 논리 앱 프로젝트에 다음 항목이 있는지 확인합니다.

    • 작업 공간에서 다음 폴더를 확장합니다: <your-logic-app>>lib\custom>net472 또는 net8, 사용하는 .NET 버전에 따라 다릅니다. net472 또는 net8 하위 폴더에 코드 실행에 필요한 어셈블리(DLL) 파일과 function-name>.dll이라는 파일이<포함되어 있는지 확인하세요.

    • 작업 영역에서 다음 폴더를 확장하세요: <사용자 논리 앱>, >lib\custom>, <function-name>. 함수명> 하위 폴더에< 작성한 함수 코드에 대한 메타데이터가 포함된 function.json 파일이 있는지 확인하세요. 워크플로 디자이너는 이 파일을 사용하여 코드를 호출할 때 필요한 입력 및 출력을 결정합니다.

    다음 예제에서는 논리 앱 프로젝트에서 생성된 샘플 어셈블리 및 기타 파일을 보여줍니다.

    .NET 함수와 Logic 앱 프로젝트가 포함된 Logic App 작업 공간의 스크린샷입니다. 새로 생성된 어셈블리와 기타 필수 파일들이 보입니다.

4: 워크플로에서 코드 호출

코드가 컴파일되고 논리 앱 프로젝트에 코드를 실행하는 데 필요한 파일이 포함되어 있는지 확인한 후 코드를 호출하도록 워크플로를 설정합니다.

  1. 탐색기 창에서 <workspace-name>, <logic-app-name>, 그리고 <workflow-name>을(를) 확장합니다.

  2. workflow.json대한 바로 가기 메뉴를 열고 디자이너 열기를 선택합니다.

    워크플로 디자이너가 열리고 다음 트리거 및 작업이 포함된 기본 워크플로가 표시됩니다.

    Operation 설명
    Trigger 기본으로 제공되는 요청 트리거의 명칭은 HTTP 요청이 수신되었을 때입니다.
    조치 이 논리 앱에서 로컬 함수 호출이라는 기본 제공 작업입니다.
    조치 Response라는 기본 제공 응답 작업은 요청 트리거를 사용할 때만 호출자에게 회신하는데 사용됩니다.
  3. 디자이너에서 이 논리 앱에서 로컬 함수를 호출하라는 작업을 선택합니다.

    작업 정보 창이 열리므로 사용자 지정 함수 호출을 설정할 수 있습니다. 예를 들면 다음과 같습니다.

    기본 워크플로우와 그 트리거, 워크플로우 디자이너에서 열린 액션을 보여주는 스크린샷입니다.

  4. 함수 이름 매개 변수 값이 실행하려는 함수로 설정되어 있는지 검토하고 확인합니다. 함수에서 사용하는 다른 매개 변수 값을 검토하거나 변경합니다.

5: 코드 및 워크플로 디버그

  1. 다음 각 Azure Storage 서비스에 대해 Azurite 스토리지 에뮬레이터를 시작합니다.

    • Azure Blob Service
    • Azure Queue Service
    • Azure Table 서비스
    1. Visual Studio Code View 메뉴에서 커먼드 팔레트 선택합니다.

    2. 표시되는 프롬프트에서 목록에서 Azurite: Blob 서비스 시작을 선택합니다.

    3. 표시되는 작업 디렉터리 목록에서 논리 앱을 선택합니다.

    4. Azurite: 큐 서비스 시작Azurite: 테이블 서비스 시작에 대해 다음 단계를 반복합니다.

    성공하면 화면 아래쪽의 Visual Studio Code 작업 표시줄에 실행 중인 세 개의 스토리지 서비스가 표시됩니다.

  2. 다음 단계를 수행하여 논리 앱 프로젝트와 .NET 함수 프로젝트 모두에 디버거를 연결합니다.

    1. Visual Studio Code 작업 모음에서 런 및 디버그(키보드: Ctrl+Shift+D)를 선택합니다.

      실행과 디버그가 선택된 Visual Studio Code 활동 바를 보여주는 스크린샷입니다.

    2. 실행 및 디버그 목록에서 로컬 함수(<논리 앱>)로 논리 앱 실행/디버그를 선택한 다음, 재생(녹색 화살표)을 선택합니다.

      Run/Debug 로직 앱의 로컬 기능이 있는 실행 및 디버그 리스트와 선택 옵션을 보여주는 스크린샷입니다.

      다음 이벤트가 발생합니다.

      • 터미널 창이 열리고 시작된 디버깅 프로세스가 표시됩니다.
      • 디버그 콘솔 창이 열리며 디버깅 상태를 보여줍니다.
      • Visual Studio Code 아래쪽에서 작업 표시줄이 주황색으로 바뀌어 .NET 디버거가 로드되었음을 나타냅니다.
  3. 중단점을 설정하려면 함수 정의(<function-name>.cs) 또는 워크플로 정의(workflow.json)에서 중단점을 원하는 줄 번호를 찾고 인접한 열을 선택합니다. 예를 들면 다음과 같습니다.

    코드 라인에 브레이크포인트가 설정된 함수 코드 파일을 보여주는 스크린샷입니다.

  4. 워크플로에서 요청 트리거를 수동으로 실행하려면 워크플로의 개요 페이지를 엽니다.

    1. 논리 앱 프로젝트에서 workflow.json 파일의 바로 가기 메뉴를 열고 개요를 선택합니다.

      워크플로의 개요 페이지에서 워크플로를 수동으로 시작하려는 경우 트리거 실행 단추를 사용할 수 있습니다. 워크플로 속성에서 콜백 URL 값은 워크플로의 요청 트리거에 의해 생성된 호출 가능한 엔드포인트의 URL입니다. 다른 논리 앱 워크플로를 포함하여 다른 앱에서 워크플로를 트리거하기 위해 이 URL에 요청을 보낼 수 있습니다.

    2. 개요 페이지 도구 모음에서 트리거 실행을 선택합니다.

      Visual Studio Code와 워크플로우가 열린 개요 페이지를 보여주는 스크린샷입니다.

      워크플로가 실행하기 시작하면 디버거가 첫 번째 중단점을 활성화합니다.

    3. 실행 메뉴 또는 디버거 도구 모음에서 디버그 작업을 선택합니다.

    워크플로 실행이 완료되면 개요 페이지에 완료된 실행과 해당 실행에 대한 기본 세부 정보가 표시됩니다.

  5. 워크플로 실행에 대한 자세한 내용을 검토하려면 완료된 실행을 선택합니다. 또는 기간 열 옆의 목록에서 실행 표시를 선택합니다.

    Visual Studio Code와 완료된 워크플로우 실행을 보여주는 스크린샷입니다.

6: 코드 배포

논리 앱 프로젝트를 배포하는 것과 동일한 방식으로 사용자 지정 함수를 배포합니다. Visual Studio Code에서 배포하든 CI/CD DevOps 프로세스를 사용하든, 배포 전에 반드시 코드를 작성하세요. 또한, 배포 전에 모든 의존 어셈블리가 다음 로직 앱 프로젝트 폴더에 존재하는지 확인하세요:

  • .NET 4.7.2: lib/custom/net472 폴더

  • .NET 8: lib/custom/net8 폴더

자세한 내용은 "Visual Studio Code에서 Azure로 표준 워크플로 배포하기"를 참조하세요.

종속성 주입

.NET 8을 선택하면 표준 워크플로의 사용자 지정 .NET 코드에서 DI( 종속성 주입) 지원합니다. 이 기능을 사용하면 서비스를 한 번 등록할 수 있으므로 각 함수 내에 종속성을 만드는 대신 런타임에 사용자 지정 코드 함수에서 자동으로 사용할 수 있습니다.

참고

.NET 8 사용자 지정 코드 프로젝트는 Visual Studio Code에서 종속성 주입을 지원합니다.

종속성 주입이 없으면 사용자 지정 코드가 자주 작동합니다.

  • 함수에서 직접 서비스 인스턴스를 만듭니다.
  • 여러 함수 또는 워크플로에서 논리를 복제합니다.
  • 비즈니스 논리를 설정 및 구성 코드와 혼합합니다.

워크플로가 증가함에 따라 사용자 지정 코드는 테스트, 재사용 및 유지 관리가 더 어려워집니다. 의존성 주입을 사용하면 다음과 같은 효과를 낼 수 있습니다:

  • 워크플로 실행과 비즈니스 논리를 구분합니다.
  • 여러 사용자 지정 코드 함수에서 공유 서비스를 다시 사용합니다.
  • 표준 .NET 개발 패턴에 사용자 지정 코드를 맞춥니다.

사용자 지정 코드는 특히 여러 워크플로가 동일한 논리를 사용하는 경우 프로덕션 워크플로에서 관리가 더 쉬워집니다.

종속성 주입을 사용하는 경우

단순 또는 일회성 사용자 지정 코드 함수가 있는 경우 종속성 주입이 필요하지 않을 수 있습니다. 하지만 만약 귀하의 커스텀 코드에 다음과 같은 요구사항이 있다면, 의존성 주입(dependency injection) 사용을 고려해 보십시오:

  • 여러 워크플로에서 동일한 사용자 지정 코드 함수를 사용하거나 공유합니다.
  • 사용자 지정 코드 함수에는 시간이 지남에 따라 변경되는 비즈니스 또는 라우팅 논리가 포함됩니다.
  • 더 나은 테스트 용이성 또는 장기 유지 관리가 필요합니다.

종속성 주입이 사용자 지정 .NET 함수에 미치는 영향

종속성 주입은 사용자 지정 .NET 함수 또는 워크플로 동작을 호출하는 방법을 변경하지 않습니다. 이 기능은 기본 사용자 지정 코드 구조만 변경하지만 동일한 결과를 생성합니다. 다음 단계에서는 이 프로세스를 설명합니다.

  1. Azure Logic Apps 사용자 지정 코드 프로젝트를 로드합니다.
  2. Azure Logic Apps 필요한 서비스를 인스턴스화, 등록 및 함수에 삽입합니다.
  3. 함수는 삽입된 종속성을 사용하여 실행됩니다.

종속성 주입 사용

사용자 지정 .NET 코드와 함께 종속성 주입을 사용하려면 다음 요구 사항을 완료합니다.

  1. 사용자 지정 코드 프로젝트를 만들 때 .NET 8 선택합니다.

    .NET 8개의 사용자 지정 코드 프로젝트만 종속성 주입을 지원합니다.

  2. 프로젝트에서 종속성 목록을 정의하는 클래스를 추가 StartupConfiguration 합니다. 인터페이스를 IConfigureStartup 구현하고, 예를 들어 IServiceCollection을(를) 사용하여 종속성을 등록합니다.

    using Microsoft.Azure.Functions.Extensions.Workflows;
    using Microsoft.Extensions.DependencyInjection;
    
    public class StartupConfiguration : IConfigureStartup
    {
        /// <summary>
        /// Configures services for the custom code function to use.
        /// </summary>
        /// <param name="services">The service collection to configure.</param>
        public void Configure(IServiceCollection services)
        {
            // Register the routing service with dependency injection
            services.AddSingleton<IRoutingService, OrderRoutingService>();
            services.AddSingleton<IDiscountService, DiscountService>();
        }
    }
    

    IConfigureStartup 인터페이스는 Microsoft.Azure.Functions.Extensions.Workflows에 정의되어 있으며, IServiceCollectionMicrosoft.Extensions.DependencyInjection에 정의되어 있습니다. 자세한 내용은 StartupConfiguration.cs를 참조하세요.

  3. 사용자 지정 코드 함수 클래스 생성자에서 등록된 서비스를 함수 내에서 만드는 대신 생성자 매개 변수로 정의하여 초기화합니다. 예를 들면 다음과 같습니다.

    public class MySampleFunction
    {
        private readonly ILogger<MySampleFunction> logger;
        private readonly IRoutingService routingService;
        private readonly IDiscountService discountService;
    
        public MySampleFunction(ILoggerFactory loggerFactory, IRoutingService routingService, IDiscountService discountService)
        {
            this.logger = loggerFactory.CreateLogger<MySampleFunction>();
            this.routingService = routingService;
            this.discountService = discountService;
        }
    
        // Add your function logic here
    
    } 
    

사용자 지정 코드 프로젝트를 빌드 및 배포하는 것 외에도 다른 단계를 수행하거나 워크플로를 편집하거나 Azure Logic Apps 다른 설정을 변경하여 종속성 주입을 사용하도록 설정할 필요가 없습니다.

자세한 내용은 사용자 지정 코드 종속성 주입 샘플을 참조하세요.

커스텀 코드 프로젝트에 직접 NuGet 패키지를 가져가세요

.NET 8을 사용하는 NuGet 기반 사용자 지정 코드 프로젝트의 경우 언어 작업자 호스트에서 사용하는 종속성과의 충돌을 해결할 필요 없이 고유한 NuGet 패키지를 포함하고 관리할 수 있습니다. 어셈블리 종속성을 프로젝트의 별도 어셈블리 위치에 직접 추가하기만 하면 됩니다. 다음 예외를 제외하고 프로젝트에 필요한 .NET 8 호환 종속 어셈블리 버전을 가져올 수 있습니다.

  • Microsoft.Extensions.Logging.Abstractions
  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Azure.Functions.Extensions.Workflows.Abstractions

문제 해결

작업 정보 창 오류

워크플로 디자이너에서 이 논리 앱에서 로컬 함수 호출이라는 기본 제공 작업을 선택하면 작업의 정보 창에 다음 메시지가 표시됩니다.

Failed to retrieve dynamic inputs. Error details:

이 시나리오에서는 논리 앱 프로젝트를 확인하여 LogicApp\lib\custom 폴더가 비어 있는지 확인합니다. 비어 있는 경우 터미널 메뉴에서 작업>빌드 함수 실행을 선택합니다.

현재 실행 중인 지정된 이름의 프로세스가 없습니다.

워크플로를 실행할 때 이 오류 메시지가 표시되면 논리 앱이 아닌 .NET Functions에 디버거 프로세스를 연결한 것 같습니다.

이 문제를 해결하려면 실행 및 디버그 목록에서 논리 앱(LogicApp)에 연결을 선택한 다음 재생(녹색 삼각형)을 선택합니다.

패키지를 올바르게 가져오지 않음

출력 창에 다음 메시지와 유사한 오류가 표시되면 .NET 6.0 이상이 설치되어 있는지 확인합니다. 이 버전을 설치한 경우 제거한 다음 다시 설치해 보세요.

C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.targets(83,5): warning : The ExtensionsMetadataGenerator package was not imported correctly. Are you missing 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.targets' or 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.props'? [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] WeatherForecast -> C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\\bin\Debug\net472\WeatherForecast.dll C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : It was not possible to find any compatible framework version [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : The specified framework 'Microsoft.NETCore.App', version '6.0.0' was not found. [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : - Check application dependencies and target a framework version installed at: [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj]

CS1031 및 CS1001 오류 발생 시 빌드 실패

함수에 변수가 포함되어 있지 않고 코드를 작성하는 경우 출력 창에 다음 오류 메시지가 표시될 수 있습니다.

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

Build FAILED.

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

0 Warning(s)
2 Error(s)

이 문제를 해결하려면 코드의 Run 메서드에 다음 매개 변수를 추가합니다.

string parameter1 = null

다음 예제에서는 Run 메서드 서명이 표시되는 방법을 보여줍니다.

public static Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale, string parameter1 = null)

Visual Studio Code