다음을 통해 공유


Azure Logic Apps에 대한 표준 워크플로와 함께 C# 스크립트 인라인으로 추가 및 실행(미리 보기)

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

참고 항목

이 기능은 미리 보기로 제공되고 Microsoft Azure 미리 보기의 추가 사용 약관이 적용됩니다.

Azure Logic Apps에서 표준 워크플로와 인라인으로 사용자 지정 통합 작업을 수행하려면 워크플로 내에서 C# 스크립트를 직접 추가하고 실행할 수 있습니다. 이 작업의 경우 CSharp 스크립트 코드 실행이라는 인라인 코드 작업을 사용합니다. 이 작업은 워크플로의 후속 작업에서 이 출력을 사용할 수 있도록 스크립트의 결과를 반환합니다.

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

  • Azure Functions를 사용하지 않고도 더 복잡한 통합 문제를 해결할 수 있도록 워크플로 디자이너 내에서 고유한 스크립트를 작성합니다. 다른 서비스 계획은 필요하지 않습니다.

    이 혜택은 워크플로 개발을 간소화하고 더 많은 서비스를 관리하는 복잡성과 비용을 줄입니다.

  • 워크플로 내에서 개인 설정된 스크립팅 공간을 제공하는 전용 코드 파일을 생성합니다.

  • 워크플로와 함께 스크립트를 배포합니다.

이 가이드에서는 워크플로에 작업을 추가하고 실행하려는 C# 스크립트 코드를 추가하는 방법을 보여 줍니다.

필수 조건

  • Azure 계정 및 구독 구독이 없는 경우 Azure 체험 계정에 등록합니다.

  • C# 스크립트를 추가하려는 표준 논리 앱 워크플로입니다. 워크플로는 이미 트리거로 시작해야 합니다. 자세한 내용은 예제 표준 논리 앱 워크플로 만들기를 참조하세요.

    시나리오에 대해 모든 트리거를 사용할 수 있지만, 예를 들어 이 가이드에서는 http 요청이 수신될 때 명명된 요청 트리거와 응답 작업을 사용합니다. 워크플로는 다른 애플리케이션 또는 워크플로가 트리거의 엔드포인트 URL에 요청을 보낼 때 실행됩니다. 샘플 스크립트는 코드 실행의 결과를 후속 작업에서 사용할 수 있는 출력으로 반환합니다.

예제 시나리오

다음 목록에서는 스크립트를 사용하여 특정 통합 작업에 도움이 되는 몇 가지 예제 시나리오를 설명합니다.

  • 기본 제공 식 및 데이터 작업 기능을 넘어 페이로드에서 변환 또는 조작을 구문 분석하고 수행합니다. 예를 들어 스크립트를 사용하여 다운스트림 처리를 위해 수정된 스키마를 반환할 수 있습니다.

  • 가상 머신과 같은 Azure 리소스를 관리하고 일부 비즈니스 논리에 따라 시작하거나 단계별로 실행합니다.

  • 일정에 따라 실행해야 하는 SQL Server에서 저장 프로시저를 실행하고 결과를 SharePoint에 저장합니다.

  • Azure Storage에 저장하거나 팀에 전자 메일을 보내거나 알려 자세한 정보를 사용하여 워크플로 오류를 기록합니다.

  • API 보안 표준을 준수하도록 데이터를 암호화하고 암호 해독합니다.

  • HTTP 요청에 대한 압축 또는 압축을 풀기 위해 스크립트에 파일을 전달합니다.

  • 다양한 API 및 파일의 데이터를 집계하여 일간 보고서 만들기

고려 사항

  • Azure Portal은 스크립트를 workflow.json 파일과 동일한 폴더에 C# 스크립트 파일(.csx)로 저장하고, 워크플로에 대한 JSON 정의를 저장하고, 워크플로 정의와 함께 논리 앱 리소스에 파일을 배포합니다. Azure Logic Apps는 스크립트를 실행할 준비가 되도록 이 파일을 컴파일합니다.

    .csx 파일 형식을 사용하면 "상용구"를 적게 쓰고 C# 함수 작성에만 집중할 수 있습니다. 배포하는 동안 보다 쉽게 관리할 수 있는 .csx 파일의 이름을 바꿀 수 있습니다. 그러나 스크립트 이름을 바꿀 때마다 새 버전이 이전 버전을 덮어씁니다.

  • 스크립트는 워크플로에 로컬입니다. 다른 워크플로에서 동일한 스크립트를 사용하려면 KuduPlus에서 콘솔 스크립트 파일을 확인한 다음 스크립트를 복사하여 다른 워크플로에서 다시 사용합니다.

제한 사항

속성 한도 주의
스크립트 실행 기간 10분 더 긴 기간이 필요한 시나리오가 있는 경우 제품 피드백 옵션을 사용하여 요구 사항에 대한 자세한 정보를 제공합니다.
출력 크기 100MB 출력 크기는 일반적으로 100MB인 작업의 출력 크기 제한에 따라 달라집니다.

CSharp 스크립트 코드 실행 작업 추가

  1. Azure Portal의 디자이너에서 표준 논리 앱 리소스 및 워크플로를 엽니다.

  2. 디자이너에서 다음 일반 단계에 따라 CSharp 스크립트 코드 실행이라는 인라인 코드 작업 작업을 워크플로에 추가합니다.

  3. 작업 정보 창이 열리면 매개 변수 탭의 코드 파일 상자에서 미리 채워진 샘플 코드를 사용자 고유의 스크립트 코드로 업데이트합니다.

    다음 예제에서는 샘플 스크립트 코드가 있는 작업의 매개 변수 탭을 보여 줍니다.

    스크린샷은 Azure Portal, 표준 워크플로 디자이너, 요청 트리거, 정보 창이 열려 있는 CSharp 스크립트 코드 실행 작업 및 응답 작업을 보여줍니다. 정보 창에는 샘플 C# 스크립트가 표시됩니다.

    다음 예제에서는 샘플 스크립트 코드를 보여줍니다.

    /// Add the required libraries.
    #r "Newtonsoft.Json"
    #r "Microsoft.Azure.Workflows.Scripting"
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Workflows.Scripting;
    using Newtonsoft.Json.Linq;
    
    /// <summary>
    /// Executes the inline C# code.
    /// </summary>
    /// <param name="context">The workflow context.</param>
    /// <remarks> The entry-point to your code. The function signature should remain unchanged.</remarks>
    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
        var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs;
    
        /// Dereferences the 'name' property from the trigger payload.
        var name = triggerOutputs?["body"]?["name"]?.ToString();
    
        /// To get the outputs from a preceding action, you can uncomment and repurpose the following code.
        // var actionOutputs = (await context.GetActionResults("<action-name>").ConfigureAwait(false)).Outputs;
    
        /// The following logs appear in the Application Insights traces table.
        // log.LogInformation("Outputting results.");
        // var name = null;
    
        return new Results
        {
            Message = !string.IsNullOrEmpty(name) ? $"Hello {name} from CSharp action" : "Hello from CSharp action."
        };
    }
    
    public class Results
    {
        public string Message {get; set;}
    }
    

    자세한 내용은 "#r" - 외부 어셈블리 참조를 참조하세요.

  4. 완료되면 워크플로를 저장합니다.

워크플로를 실행한 후 사용하도록 설정된 경우 Application Insights에서 워크플로 출력을 검토할 수 있습니다. 자세한 내용은 Application Insights에서 로그 보기를 참조하세요.

네임스페이스 가져오기

네임스페이스를 가져오려면 평소와 같이 using 절을 사용합니다. 다음 목록에는 자동으로 가져온 네임스페이스가 포함되어 있으므로 스크립트에 포함할 수 있는 선택 사항입니다.

System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host

외부 어셈블리에 참조 추가

.NET Framework 어셈블리를 참조하려면 다음 예제와 같이 #r "<assembly-name> 지시문을 사용합니다.

/// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Workflows.Scripting;
using Newtonsoft.Json.Linq;

public static async Task<Results> Run(WorkflowContext context)
{
    <...>
}

public class Results
{
    <...>
}

다음 목록에는 Azure Functions 호스팅 환경에서 자동으로 추가되는 어셈블리가 포함됩니다.

mscorlib
System
System.Core
System.Xml
System.Net.Http
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Microsoft.Azure.WebJobs.Extensions
System.Web.Http
System.Net.Http.Formatting
Newtonsoft.Json

스트림에 출력 기록

Run 메서드에서 다음과 같이 ILogger 유형과 log을(를) 이름으로 하는 매개 변수를 포함합니다.

public static void Run(WorkflowContext context, ILogger log)
{
    log.LogInformation($"C# script successfully executed.");
}

Application Insights에 로그 출력

Application Insights에서 사용자 지정 메트릭을 만들려면 ILoggerLogMetric 확장 메서드를 사용합니다.

다음 예제에서는 샘플 메서드 호출을 보여줍니다.

logger.LogMetric("TestMetric", 1234);

스크립트에서 워크플로 트리거 및 작업 출력에 액세스

워크플로에서 데이터에 액세스하려면 WorkflowContext 컨텍스트 개체에 사용할 수 있는 다음 메서드를 사용합니다.

  • GetTriggerResults 메서드

    트리거 출력에 액세스하려면 이 메서드를 사용하여 Outputs 속성을 통해 사용할 수 있는 트리거 및 해당 출력을 나타내는 개체를 반환합니다. 이 개체에는 JObject 형식이 있으며 대괄호([])를 인덱서로 사용하여 트리거 출력의 다양한 속성에 액세스할 수 있습니다.

    다음 예제에서는 트리거 출력의 body 속성에서 데이터를 가져옵니다.

    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
    
        var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs;
        var body = triggerOutputs["body"];
    
        return new Results;
    
    }
    
    public class Results
    {
        <...>
    }
    
  • GetActionResults 메서드

    작업 출력에 액세스하려면 이 메서드를 사용하여 Outputs 속성을 통해 사용할 수 있는 작업 및 해당 출력을 나타내는 개체를 반환합니다. 이 메서드는 작업 이름을 매개 변수로 허용합니다. 다음 예제에서는 action-name이라는 작업에서 출력의 body 속성에서 데이터를 가져옵니다.

    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
    
        var actionOutputs = (await context.GetActionResults("action-name").ConfigureAwait(false)).Outputs;
        var body = actionOutputs["body"];
    
        return new Results;
    
    }
    
    public class Results
    {
        <...>
    }
    

환경 변수 또는 앱 설정 값에 액세스

환경 변수 또는 앱 설정 값을 가져오려면 다음 예제와 같이 System.Environment.GetEnvironmentVariable 메서드를 사용합니다.

public static void Run(WorkflowContext context, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
    System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

워크플로에 데이터 반환

이 작업의 경우 반환 형식 및 return 문을 사용하여 Run 메서드를 구현합니다. 비동기 버전을 원하는 경우 Task<return-type> 특성과 async 키워드를 사용하여 Run 메서드를 구현합니다. 반환 값은 스크립트 동작의 출력 body 속성으로 설정되며, 이후의 워크플로 작업에서 참조할 수 있습니다.

다음 예제에서는 Task<Results> 특성, async 키워드 및 return 문이 있는 Run 메서드를 보여 줍니다.

public static async Task<Results> Run(WorkflowContext context, ILogger log)
{
    return new Results
    {
        Message = !string.IsNullOrEmpty(name) ? $"Returning results with status message."
    };
}

public class Results
{
    public string Message {get; set;}
}

스크립트 파일 보기

  1. Azure Portal에서 원하는 워크플로가 있는 표준 논리 앱 리소스를 엽니다.

  2. 논리 앱 리소스 메뉴의 개발 도구에서 고급 도구를 선택합니다.

  3. 고급 도구 페이지에서 이동을 선택하여 KuduPlus 콘솔을 엽니다.

  4. 디버그 콘솔 메뉴를 열고 CMD를 선택합니다.

  5. 논리 앱의 루트 위치인 site/wwwroot로 이동합니다.

  6. .csx 파일이 포함된 워크플로의 폴더로 이동하여 site/wwwroot/{workflow-name} 경로를 따라 이동합니다.

  7. 파일 이름 옆에 있는 편집을 선택하여 파일을 열고 봅니다.

Application Insights에서 로그 보기

  1. Azure Portal의 논리 앱 리소스 메뉴의 설정아래에서 Application Insights를 선택한 다음 논리 앱을 선택합니다.

  2. Application Insights 메뉴의 모니터링에서 로그를 선택합니다.

  3. 예를 들어 쿼리를 만들어 워크플로 실행에서 추적 또는 오류를 찾습니다.

    union traces, errors
    | project TIMESTAMP, message
    

컴파일 오류

이 릴리스에서 웹 기반 편집기는 제한된 IntelliSense 지원을 포함하고 있으며, 아직 개선되고 있습니다. 워크플로를 저장할 때 컴파일 오류가 검색되고 Azure Logic Apps 런타임이 스크립트를 컴파일합니다. 이러한 오류는 논리 앱의 오류 로그에 표시됩니다.

런타임 오류

스크립트가 실행될 때 오류가 발생하면 Azure Logic Apps는 다음 단계를 수행합니다.

  • 오류를 워크플로에 다시 전달합니다.
  • 스크립트 동작을 실패로 표시합니다.
  • 스크립트에서 throw된 예외를 나타내는 오류 개체를 제공합니다.

다음 예제에서는 샘플 오류를 보여줍니다.

'CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx' 함수가 '워크플로에 '존재하지 않는' 작업이 없습니다.' 오류와 함께 실패했습니다. 실행 중일 때. 함수 코드가 유효한지 확인하세요.

예제 스크립트

다음 예제 스크립트는 사용자가 수행할 수 있는 다양한 작업을 수행합니다.

HTTP 작업에서 텍스트 파일이 있는 ZIP 파일을 문자열 배열로 압축 해제

// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Azure.Workflows.Scripting;
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Collections.Generic;

/// <summary>
/// Executes the inline C# code.
/// </summary>
/// <param name="context">The workflow context.</param>
public static async Task<List<string>> Run(WorkflowContext context)
{

    var outputs = (await context.GetActionResults("HTTP_1").ConfigureAwait(false)).Outputs;
    var base64zipFileContent = outputs["body"]["$content"].ToString();

    // Decode base64 to bytes.
    byte[] zipBytes = Convert.FromBase64String(base64zipFileContent);

    List<string> fileContents = new List<string>();

    // Creates an in-memory stream from the zip bytes.
    using (MemoryStream zipStream = new MemoryStream(zipBytes))
    {

        // Extracts files from the zip archive.
        using (ZipArchive zipArchive = new ZipArchive(zipStream))
        {

            foreach (ZipArchiveEntry entry in zipArchive.Entries)
            {

                // Read each file's content.
                using (StreamReader reader = new StreamReader(entry.Open()))
                {
                    string fileContent = reader.ReadToEnd();
                    fileContents.Add(fileContent);
                }
            }
        }
    }

    return fileContents;
}

앱 설정에서 키를 사용하여 데이터 암호화

// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Azure.Workflows.Scripting;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// Executes the inline csharp code.
/// </summary>
/// <param name="context">The workflow context.</param>
public static async Task<string> Run(WorkflowContext context)
{

    var compose = (await context.GetActionResults("compose").ConfigureAwait(false)).Outputs;
    var text = compose["sampleData"].ToString();

    return EncryptString(text);

}

public static string EncryptString(string plainText)
{

    var key = Environment.GetEnvironmentVariable("app-setting-key");
    var iv = Environment.GetEnvironmentVariable("app-setting-iv");

    using (Aes aesAlg = Aes.Create())
    {

        aesAlg.Key = Encoding.UTF8.GetBytes(key);
        aesAlg.IV = Encoding.UTF8.GetBytes(iv);
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

        using (MemoryStream msEncrypt = new MemoryStream())
        {

            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {

                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(plainText);
                }

            }

             return Convert.ToBase64String(msEncrypt.ToArray());

        }
    }
}

WorkflowContext 클래스

워크플로 컨텍스트를 나타냅니다.

메서드

GetActionResult(string actionName)

워크플로의 특정 작업에서 결과를 가져옵니다.

비동기 버전은 다음과 같이 작업<>을 반환 형식으로 사용합니다.

Task<WorkflowOperationResult> GetActionResult(string actionName)

매개 변수

actionName: 작업 이름.

반품

비동기 버전은 비동기 작업을 나타내는 Task 개체를 반환합니다. 작업 결과에는 WorkflowOperationResult 개체가 포함됩니다. WorkflowOperationResult 개체 속성에 대한 자세한 내용은 WorkflowOperationResult 클래스를 참조하세요.

RunTriggerResult()

워크플로의 트리거에서 결과를 가져옵니다.

비동기 버전은 다음과 같이 작업<>을 반환 형식으로 사용합니다.

Task<WorkflowOperationResult> RunTriggerResult()

매개 변수

없음

반품

비동기 버전은 비동기 작업을 나타내는 Task 개체를 반환합니다. 작업 결과에는 WorkflowOperationResult 개체가 포함됩니다. WorkflowOperationResult 개체 속성에 대한 자세한 내용은 WorkflowOperationResult 클래스를 참조하세요.

WorkflowOperationResult 클래스

워크플로 작업의 결과를 나타냅니다.

속성

속성 형식 Description
이름 문자열 작업 이름을 가져오거나 설정합니다.
입력 JToken 작업 실행 입력을 가져오거나 설정합니다.
Outputs JToken 작업 실행 출력을 가져오거나 설정합니다.
StartTime DateTime? 작업 시작 시간을 가져오거나 설정합니다.
EndTime DateTime? 작업 종료 시간을 가져오거나 설정합니다.
OperationTrackingId 문자열 작업 추적 ID를 가져오거나 설정합니다.
‘코드’ 문자열 작업의 상태 코드를 가져오거나 설정합니다.
상태 문자열 작업의 상태를 가져오거나 설정합니다.
오류 JToken 작업에 대한 오류를 가져오거나 설정합니다.
TrackedProperties JToken 작업의 추적된 속성을 가져오거나 설정합니다.

JavaScript 코드 조각 추가 및 실행