Visual Studio를 사용하여 로컬로 간단한 Azure Function 만들기 및 테스트

완료됨

사용자는 Azure Portal 내에서 Azure 함수를 작성, 디버그, 배포할 수 있습니다. 그러나 프로덕션, 스테이징 또는 테스트 환경에서 직접 함수를 작성하는 것은 적합하지 않을 수 있습니다. 예를 들어, Azure Functions에 대한 자동화된 단위 테스트를 작성하거나 Azure에서 함수 앱에 Azure Functions의 주문형 배포를 사용하는 경우입니다. 일반적으로 개발자는 Azure Portal에서 제공하는 환경보다 코드 편집기와 개발 도구를 사용하려고 합니다. Visual Studio를 사용하면 단일 프로젝트에서 다른 코드와 서비스를 사용하여 Azure Functions 코드를 개발하고 관리할 수 있습니다.

온라인 고급 시계 시나리오에서 개발자들이 이미 Visual Studio 2022에 익숙합니다. 따라서 Visual Studio를 Azure Functions를 만들기 위한 기본 개발 환경으로 사용하도록 결정했습니다. 또한 Visual Studio는 함수를 Azure에 배포하기 전에 로컬로 테스트할 수 있는 훌륭한 환경을 제공합니다.

이 단원에서는 로컬 컴퓨터에서 Azure 함수를 빌드하고 테스트하는 데 Visual Studio에서 제공되는 도구를 사용하는 방법을 알아봅니다.

Important

이 문서에서는 런타임과 함께 In Process를 실행하는 .NET 클래스 라이브러리 함수를 지원합니다. C# 함수는 Out-of-process를 실행되고 Functions 런타임에서 격리될 수도 있습니다. 격리된 작업자 프로세스 모델은 현재 버전의 Functions 런타임에서 LTS가 아닌 버전의 .NET 및 .NET Framework 앱을 실행하는 유일한 방법입니다. 자세히 알아보려면 .NET 격리 작업자 프로세스 함수를 참조하세요.

Visual Studio 설치 수정

먼저 개발 환경에 필요한 웹 및 클라우드 도구를 사용하여 Visual Studio를 설정해 보겠습니다.

  1. 로컬로 설치된 Visual Studio 2022를 사용하여 Visual Studio 설치 관리자를 열고 Visual Studio Community 2022에서 수정을 선택합니다.

    수정이 강조 표시된 Visual Studio 설치 관리자의 스크린샷

  2. 수정 - Visual Studio 페이지가 나타납니다.

    .

  3. 워크로드 탭에서 ASP.NET 및 웹 개발Azure 개발 확인란을 선택한 다음, 수정을 선택합니다.

  4. 확인 대화 상자에서 를 선택합니다. Visual Studio 설치 관리자 페이지가 나타나고 설치 중인 패키지의 진행률을 표시합니다.

Visual Studio용 Azure Functions 도구 확장

Azure Functions 도구는 로컬 개발 환경에서 Azure Functions를 만들고, 테스트하고, 배포할 수 있는 Visual Studio 확장입니다. 이 확장은 새 Azure 함수 앱을 빠르게 만들기 위해 Visual Studio에서 Azure 함수를 빌드한 다음 Azure에 직접 배포하기 위한 템플릿을 제공합니다.

Azure Functions 및 웹 작업 도구 확장이 Visual Studio 2022에 포함되어 있습니다.

Azure 함수 앱

함수 앱은 하나 이상의 함수를 호스트합니다. 함수 코드 환경과 런타임을 제공합니다.

함수는 앱에서 직접 호출되지 않고 이벤트를 통해 트리거됩니다. Azure 함수 앱에서 각 함수를 트리거하는 이벤트의 유형을 지정합니다. 사용할 수 있는 이벤트는 다음과 같습니다.

  • Blob 트리거. Azure Blob 스토리지에서 파일이 업로드되거나 수정되면 이 유형의 함수가 실행됩니다.
  • 이벤트 허브 트리거. Event Hub에서 메시지를 받으면 Event Hubs 트리거에서 함수를 실행합니다.
  • Azure Cosmos DB 트리거. Azure Cosmos DB 데이터베이스에서 문서가 추가되거나 수정되면 이 트리거가 실행됩니다. 이 트리거를 사용하여 Azure Cosmos DB를 다른 서비스와 통합할 수 있습니다. 예를 들어 고객의 주문을 나타내는 문서가 데이터베이스에 추가되면 트리거를 사용하여 주문 복사본을 처리하기 위해 큐에 보낼 수 있습니다.
  • HTTP 트리거. 웹앱에서 HTTP 요청이 발생하면 HTTP 트리거에서 함수를 실행합니다. 이 트리거를 사용하여 웹후크에 응답할 수도 있습니다. 웹후크는 웹 사이트에서 호스팅하는 항목을 수정할 때 발생하는 콜백입니다. 예를 들어 리포지토리의 항목이 변경될 때 GitHub 리포지토리의 웹후크에 의해 트리거되는 함수를 만들 수 있습니다.
  • 큐 트리거. 새 항목이 Azure Storage 큐에 추가되면 이 트리거에서 함수를 시작합니다.
  • Service Bus 큐 트리거. 새 항목이 Azure Service Bus 큐에 추가되면 이 트리거에서 함수를 실행합니다.
  • Service Bus 토픽 트리거. 이 트리거는 Service Bus 토픽에 도착하는 새 메시지에 대한 응답으로 함수를 실행합니다.
  • 타이머 트리거. 사용자가 정의한 일정에 따라 일정한 간격으로 이 이벤트는 실행됩니다.

사용 가능한 Azure 함수 트리거를 보여 주고 HTTP 트리거가 강조 표시된 스크린샷

다음 표는 특정 버전의 함수와 함께 사용할 수 있는 가장 높은 수준의 .NET Core 또는 .NET Framework를 보여 줍니다.

Functions 런타임 버전 In-Process 격리된 작업자 프로세스
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions 1.x .NET Framework 4.8 해당 없음

Azure 함수 앱은 관리 정보, 코드, 로그를 Azure Storage에 저장합니다. 이 데이터를 저장하려면 스토리지 계정을 만듭니다. 스토리지 계정은 Azure Blob, Queue, Files, Table Storage를 지원해야 합니다. 일반적인 Azure Storage 계정을 이 용도로 사용합니다. 이전에 표시된 대화 상자를 통해 함수에 사용할 스토리지 계정을 지정합니다.

함수는 권한이 있거나 민감한 작업을 수행할 수 있습니다. HTTP 요청으로 트리거된 함수는 공개적으로 노출될 수 있습니다. 이 함수를 실행하는 기능을 선택한 사용자 그룹으로 제한해야 할 수도 있습니다. 함수를 트리거하는 데 필요한 액세스 권한을 지정하여 함수를 보호합니다. HTTP 요청으로 트리거되는 함수에서 지원하는 세 가지 액세스 권한은 다음과 같습니다.

  • 익명. 인증이 필요하지 않으며, 모든 사용자가 함수를 트리거할 수 있습니다.
  • 함수. HTTP 요청은 Azure Function 런타임에서 요청을 승인할 수 있게 하는 키를 제공해야 합니다. 이 키는 별도로 만들고, Azure Portal을 사용하여 이 키를 유지 관리할 수 있습니다.
  • 관리자. 함수와 비슷합니다. 사용자가 함수를 트리거하는 HTTP 요청에 키를 지정해야 합니다. 차이점은 키가 admin(관리자) 키라는 것입니다. 이 키는 함수 앱의 모든 함수에 액세스하는 데 사용할 수 있으며, function(함수) 키와 마찬가지로 별도로 만듭니다.

HTTP 요청 이외의 이벤트에서 트리거되는 함수를 만드는 경우, 함수 앱에서 이벤트를 트리거하는 리소스에 액세스하는 데 필요한 연결 문자열과 기타 세부 정보를 제공해야 합니다. 예를 들어 Blob Storage 이벤트에서 트리거되는 함수를 작성하는 경우 해당 Blob Storage 계정에 대한 연결 문자열을 지정해야 합니다.

Azure Function의 구조

Azure Function은 정적 클래스로 구현됩니다. 클래스는 클래스의 진입점 역할을 하는 Run이라는 정적 비동기 메서드를 제공합니다.

Run 메서드에 전달된 매개 변수는 트리거에 대한 컨텍스트를 제공합니다. HTTP 트리거인 경우 함수는 HttpRequest 개체를 받습니다. 이 개체에는 요청의 헤더와 본문이 포함되어 있습니다. HTTP 앱에서 사용할 수 있는 것과 동일한 기술을 사용하여 요청의 데이터에 액세스할 수 있습니다. 이 함수에 적용된 특성은 인증 요구 사항(이 경우 익명)과 함수에서 응답하는 HTTP 작업(GETPOST)을 지정합니다.

Visual Studio에서 생성된 다음 코드 예제에서는 요청 URL의 일부로 제공된 쿼리 문자열을 검사하고, name이라는 매개 변수를 찾습니다. 또한 이 코드는 StreamReader를 사용하여 요청 본문을 역직렬화하고, 요청에서 name이라는 속성 값도 읽으려고 시도합니다. 이름이 쿼리 문자열 또는 요청 본문에 있으면 이름 값이 응답에 반환됩니다. 그렇지 않으면 함수가 메시지와 함께 오류 응답을 생성합니다. 쿼리 문자열이나 요청 본문에 이름을 전달하세요.

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

이 함수는 IActionResult 개체에 래핑된 출력 데이터와 결과를 포함한 값을 반환합니다. 이 값은 요청에 대한 HTTP 응답 본문에 반환됩니다.

다른 유형의 트리거는 다른 입력 매개 변수와 반환 형식을 받습니다. 다음 예제에서는 Blob 트리거에 대해 생성된 코드를 보여 줍니다. 이 예제에서는 Blob의 콘텐츠가 Stream 개체를 통해 반환되며 Blob의 이름도 제공됩니다. 이 트리거는 명명된 Blob의 데이터를 읽고 처리하는 데 사용되므로 데이터를 반환하지 않습니다.

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

모든 경우에서 ILogger 매개 변수가 함수에 전달됩니다. 함수는 이 매개 변수를 사용하여 로그 메시지를 작성할 수 있으며, 나중의 분석을 위해 함수 앱에서 스토리지에 씁니다.

또한 함수에는 트리거 유형, 보안 요구 사항, 기타 관련 정보 요구 사항을 지정하는 메타데이터가 포함됩니다. 메타데이터는 예제와 같이 HttpTrigger, BlobTrigger 또는 다른 트리거 특성을 사용하여 수정할 수 있습니다. 함수 앞에 나오는 FunctionName 특성은 함수 앱에서 사용하는 함수에 대한 식별자입니다. 이 이름은 함수 이름과 같을 필요는 없지만, 혼동을 방지하기 위해 동기화 상태를 유지하는 것이 좋습니다.

로컬로 Azure 함수 앱 테스트

Visual Debugger를 사용하여 Azure 함수 앱을 로컬로 빌드하고 테스트할 수 있습니다. 디버거를 시작하려면 F5 키를 누르거나 디버그 메뉴에서 디버깅 시작을 선택합니다. 함수 런타임의 로컬 버전이 시작됩니다. 함수를 테스트에 사용할 수 있습니다. 이 예시에서는 HTTP 이벤트에 의해 트리거되는 함수인 Function1을 호스팅하는 런타임을 보여줍니다. URL은 함수가 현재 연결되어 있는 엔드포인트를 나타냅니다.

Azure Function 런타임을 보여 주는 스크린샷 - 예 1.

웹 브라우저를 열고 이 URL을 방문하면 함수가 트리거됩니다. 다음 이미지는 본문이 포함되지 않은 HTTP GET 요청으로 생성된 응답을 보여 줍니다. 함수에서 BadRequestObjectResult 개체를 반환하는 코드에서 생성된 메시지를 볼 수 있습니다.

Azure Function 런타임을 보여 주는 스크린샷.

name 매개 변수가 포함된 쿼리 문자열을 제공하는 경우 함수가 해당 값을 읽고 처리합니다.

Azure Function 런타임을 보여 주는 스크린샷 - 예 2.

코드가 실행되는 동안 함수 런타임 창에 추적 메시지가 표시됩니다. 함수에서 중단점을 설정하고 제어 흐름을 검사해야 하는 경우 Visual Studio에서 표준 디버깅 기능을 사용할 수 있습니다.