자습서: 이벤트 구독을 사용하여 Blob 컨테이너에서 Azure Functions 트리거

Azure Functions에서 이전 버전의 Blob Storage 트리거를 사용하는 경우 트리거가 Blob 컨테이너에 업데이트를 폴링하기 때문에 실행이 지연되는 경우가 많습니다. 동일한 컨테이너의 이벤트 구독을 사용하여 함수를 트리거하면 대기 시간을 줄일 수 있습니다. 이벤트 구독은 Event Grid 인프라를 사용하여 발생하는 컨테이너의 변경 내용을 전달합니다. 최신 Azure Functions 확장을 사용하여 이 기능을 구현할 수 있습니다.

이 문서에서는 Blob이 컨테이너에 추가될 때 발생하는 이벤트를 기반으로 실행하는 함수를 만드는 방법을 보여 줍니다. 로컬 개발에 Visual Studio Code를 사용하고 Azure에 프로젝트를 배포하기 전에 함수가 로컬로 작동하는지 확인합니다.

  • Azure Storage에서 범용 스토리지 v2 계정을 만듭니다.
  • 컨테이너를 Blob 스토리지에 만듭니다.
  • 이벤트 기반 Blob Storage 트리거 함수를 만듭니다.
  • Blob 컨테이너에 대한 이벤트 구독을 만듭니다.
  • 파일을 업로드하여 ngrok에서 로컬로 디버그합니다.
  • Azure에 배포하고 필터링된 이벤트 구독을 만듭니다.

Important

이 문서에서는 탭을 사용하여 여러 버전의 Node.js 프로그래밍 모델을 지원합니다. v4 모델은 일반적으로 사용 가능하며 JavaScript 및 TypeScript 개발자를 위해 보다 유연하고 직관적인 환경을 제공하도록 설계되었습니다. v4 모델의 작동 방식에 대한 자세한 내용은 Azure Functions Node.js 개발자 가이드를 참조하세요. v3과 v4의 차이점에 대해 자세히 알아보려면 마이그레이션 가이드를 참조하세요.

필수 조건

  • ngrok 유틸리티 - Azure가 로컬로 실행되는 함수를 호출할 수 있는 방법을 제공합니다.

  • Visual Studio Code용 Azure Storage 확장(최소 버전 5.x)

참고 항목

Visual Studio Code용 Azure Storage 확장은 현재 미리 보기에 있습니다.

저장소 계정 만들기

Azure Storage에서 이벤트 구독을 사용하려면 범용 v2 스토리지 계정이 필요합니다. 기본적으로 Azure Storage 확장이 설치된 경우 Visual Studio Code 프로젝트에서 이 스토리지 계정을 만들 수 있습니다.

  1. Visual Studio Code에서 명령 팔레트를 열고(F1 키 누름) Azure Storage: Create Storage Account...를 입력합니다. 프롬프트에서 다음 정보를 제공합니다.

    프롬프트 작업
    새 스토리지 계정의 이름 입력 전역적으로 고유한 이름을 제공합니다. 스토리지 계정 이름은 길이가 3~24자여야 하고 소문자와 숫자만 있어야 합니다. 보다 쉽게 식별할 수 있도록 리소스 그룹과 함수 앱 이름으로 동일한 이름을 사용합니다.
    새 리소스의 위치 선택 성능을 향상시키려면 근처에 있는 지역을 선택합니다.

    확장은 사용자가 제공한 이름의 범용 v2 스토리지 계정을 만듭니다. 스토리지 계정을 포함하는 리소스 그룹에도 동일한 이름이 사용됩니다.

  2. 스토리지 계정을 만든 후 명령 팔레트를 열고(F1 키를 누르고) Azure Storage: Create Blob Container...를 입력합니다. 프롬프트에서 다음 정보를 제공합니다.

    프롬프트 작업
    리소스 선택 만든 스토리지 계정을 선택합니다.
    새 Blob 컨테이너 이름 입력 코드 프로젝트에서 참조되는 컨테이너 이름인 samples-workitems를 입력합니다.

이제 Blob 컨테이너를 만들었으므로 이 컨테이너에서 트리거하는 함수와 이벤트를 함수에 전달하는 이벤트 구독을 모두 만들 수 있습니다.

Blob 트리거 함수 만들기

Visual Studio Code를 사용하여 Blob Storage 트리거 함수를 만드는 경우 새 프로젝트도 만듭니다. 폴링된 일반 컨테이너를 사용하는 대신 이벤트 구독을 원본으로 사용하도록 함수를 편집해야 합니다.

  1. Visual Studio Code에서 함수 앱을 엽니다.

  2. 명령 팔레트를 열고(F1 키 누름), Azure Functions: Create Function...을 입력하고, 새 프로젝트 만들기를 선택합니다.

  3. 프로젝트 작업 영역에서 디렉터리 위치를 선택합니다. 새 폴더를 만들거나 프로젝트 작업 영역에 대한 빈 폴더를 선택해야 합니다.

    이미 작업 영역의 일부인 프로젝트 폴더를 선택하지 마세요.

  4. 프롬프트에서 다음 정보를 제공합니다.

    프롬프트 작업
    언어 선택 C#를 선택합니다.
    .NET 런타임 선택 격리된 작업자 프로세스에서 .NET 6.0 Isolated LTS을(를) 실행하거나 In Process에 대해 .NET 6.0 LTS을(를) 선택합니다.
    프로젝트의 첫 번째 함수에 사용할 템플릿 선택 Azure Blob Storage trigger를 선택합니다.
    함수 이름 입력 BlobTriggerEventGrid를 입력합니다.
    네임스페이스 입력 My.Functions를 입력합니다.
    "local.settings.json"에서 설정 선택 Create new local app setting를 선택합니다.
    스토리지 계정 선택 목록에서 만든 스토리지 계정을 선택합니다.
    트리거가 모니터링할 스토리지 계정 내의 경로입니다. 기본값(samples-workitems)을 적용합니다.
    프로젝트를 여는 방법 선택 Open in current window를 선택합니다.
    프롬프트 작업
    언어 선택 Python를 선택합니다.
    가상 환경을 만들 Python 인터프리터 선택 선호하는 Python 인터프리터를 선택합니다. 옵션이 표시되지 않으면 Python 이진에 대한 전체 경로를 입력합니다.
    프로젝트의 첫 번째 함수에 사용할 템플릿 선택 Azure Blob Storage trigger를 선택합니다.
    함수 이름 입력 BlobTriggerEventGrid를 입력합니다.
    "local.settings.json"에서 설정 선택 Create new local app setting를 선택합니다.
    스토리지 계정 선택 목록에서 만든 스토리지 계정을 선택합니다.
    트리거가 모니터링할 스토리지 계정 내의 경로입니다. 기본값(samples-workitems)을 적용합니다.
    프로젝트를 여는 방법 선택 Open in current window를 선택합니다.
    프롬프트 작업
    언어 선택 Java를 선택합니다.
    Java 버전 선택 Azure에서 함수가 실행되고 로컬로 확인된 Java 버전인 Java 11 또는 Java 8를 선택합니다.
    그룹 ID 제공 com.function를 선택합니다.
    아티팩트 ID 제공 BlobTriggerEventGrid를 선택합니다.
    버전 제공 1.0-SNAPSHOT를 선택합니다.
    패키지 이름 제공 com.function를 선택합니다.
    앱 이름 제공 BlobTriggerEventGrid로 시작하여 생성된 이름을 수락합니다.
    Java 프로젝트에 대한 빌드 도구 선택 Maven를 선택합니다.
    프로젝트를 여는 방법 선택 Open in current window를 선택합니다.
    프롬프트 작업
    함수 프로젝트에 대한 언어 선택 TypeScript를 선택합니다.
    TypeScript 프로그래밍 모델 선택 Model V4를 선택합니다.
    프로젝트의 첫 번째 함수에 사용할 템플릿 선택 Azure Blob Storage trigger를 선택합니다.
    함수 이름 입력 BlobTriggerEventGrid를 입력합니다.
    "local.settings.json"에서 설정 선택 Create new local app setting를 선택합니다.
    스토리지 계정 선택 만든 스토리지 계정을 선택합니다.
    트리거가 모니터링할 스토리지 계정 내의 경로입니다. 기본값(samples-workitems)을 적용합니다.
    프로젝트를 여는 방법 선택 Open in current window를 선택합니다.
    프롬프트 작업
    함수 프로젝트에 대한 언어 선택 JavaScript를 선택합니다.
    JavaScript 프로그래밍 모델 선택 Model V4를 선택합니다.
    프로젝트의 첫 번째 함수에 사용할 템플릿 선택 Azure Blob Storage trigger를 선택합니다.
    함수 이름 입력 BlobTriggerEventGrid를 입력합니다.
    "local.settings.json"에서 설정 선택 Create new local app setting를 선택합니다.
    스토리지 계정 선택 만든 스토리지 계정을 선택합니다.
    트리거가 모니터링할 스토리지 계정 내의 경로입니다. 기본값(samples-workitems)을 적용합니다.
    프로젝트를 여는 방법 선택 Open in current window를 선택합니다.
    프롬프트 작업
    함수 프로젝트에 대한 언어 선택 PowerShell를 선택합니다.
    프로젝트의 첫 번째 함수에 사용할 템플릿 선택 Azure Blob Storage trigger를 선택합니다.
    함수 이름 입력 BlobTriggerEventGrid를 입력합니다.
    "local.settings.json"에서 설정 선택 Create new local app setting를 선택합니다.
    스토리지 계정 선택 만든 스토리지 계정을 선택합니다.
    트리거가 모니터링할 스토리지 계정 내의 경로입니다. 기본값(samples-workitems)을 적용합니다.
    프로젝트를 여는 방법 선택 Open in current window를 선택합니다.
  5. 프롬프트가 나타나면 스토리지 계정 선택> 작업작업 영역에 추가를 선택합니다.

작업을 간소화하기 위해 이 자습서에서는 동일한 스토리지 계정을 함수 앱에 다시 사용합니다. 하지만, 프로덕션 환경에서는 별도의 스토리지 계정을 함수 앱에 사용할 수 있습니다. 자세한 내용은 Azure Functions의 스토리지 고려 사항을 참조하세요.

Storage 확장 업그레이드

Event Grid 기반 Blob Storage 트리거를 사용하려면 함수에 스토리지 확장을 위해 버전 5.x 이상이 필요합니다.

필요한 확장 버전으로 프로젝트를 업그레이드하려면 터미널 창에서 dotnet add package 명령을 실행합니다.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs --version 6.1.0
  1. host.json 프로젝트 파일을 열고, extensionBundle 요소를 검사합니다.

  2. extensionBundle.version이(가) 3.3.0 이상이 아닌 경우 extensionBundle을(를) 다음 버전으로 바꿉니다.

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

이벤트를 사용하도록 함수 업데이트

BlobTriggerEventGrid.cs 파일에서 Blob 트리거 특성에 대한 매개 변수에 Source = BlobTriggerSource.EventGrid를 추가합니다. 예를 들면 다음과 같습니다.

[Function("BlobTriggerCSharp")]
public async Task Run([BlobTrigger("samples-workitems/{name}", Source = BlobTriggerSource.EventGrid, Connection = "<NAMED_STORAGE_CONNECTION>")] Stream myBlob, string name, FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("BlobTriggerCSharp");
    logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Size: {myBlob.Length} Bytes");
}

함수를 만든 후 function.json 구성 파일에서 myBlob 바인딩에 "source": "EventGrid"를 추가합니다. 예를 들면 다음과 같습니다.

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myblob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "samples-workitems/{name}",
      "source": "EventGrid",
      "connection": "<NAMED_STORAGE_CONNECTION>"
    }
  ]
}
  1. 생성된 Function.java 파일에서 내용을 다음 코드로 바꾸고, 파일 이름을 BlobTriggerEventGrid.java로 바꿉니다.

    package com.function;
    
    import com.microsoft.azure.functions.annotation.*;
    import com.microsoft.azure.functions.*;
    
    /**
    * Azure Functions with Azure Blob trigger.
    */
    public class BlobTriggerEventGrid {
        /**
        * This function will be invoked when a new or updated blob is detected at the specified path. The blob contents are provided as input to this function.
        */
        @FunctionName("BlobTriggerEventGrid")
        @StorageAccount("glengatesteventgridblob_STORAGE")
        public void run(
            @BlobTrigger(name = "content", path = "samples-workitems/{name}", dataType = "binary", source = "EventGrid" ) byte[] content,
            @BindingName("name") String name,
            final ExecutionContext context
        ) {
              context.getLogger().info("Java Blob trigger function processed a blob. Name: " + name + "\n  Size: " + content.length + " Bytes");
          }
    }
    
  2. 새 트리거 유형에 더 이상 적용되지 않는 연결된 단위 테스트 파일을 제거합니다.

함수를 만든 후 TypeScript 파일의 options 개체에 source: "EventGrid"을(를) 추가합니다. 예를 들면 다음과 같습니다.

import { app, InvocationContext } from '@azure/functions';

export async function storageBlobTrigger1(blob: Buffer, context: InvocationContext): Promise<void> {
    context.log(
        `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
    );
}

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    source: 'EventGrid',
    handler: storageBlobTrigger1,
});

함수를 만든 후 JavaScript 파일의 options 개체에 source: "EventGrid"을(를) 추가합니다. 예를 들면 다음과 같습니다.

const { app } = require('@azure/functions');

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    source: 'EventGrid',
    handler: (blob, context) => {
        context.log(
            `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
        );
    },
});

함수를 만든 후 function.json 구성 파일에서 myBlob 바인딩에 "source": "EventGrid"를 추가합니다. 예를 들면 다음과 같습니다.

{
    "bindings": [
        {
            "name": "myblob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "source": "EventGrid",
            "connection": "<NAMED_STORAGE_CONNECTION>"
        }
    ]
}

로컬 디버깅 시작

Azure Portal에서 이벤트 구독을 만드는 경우 Event Grid에서 엔드포인트 URL의 유효성을 검사합니다. 이 유효성 검사는 로컬 디버깅에 대한 이벤트 구독을 만들기 전에 먼저 ngrok 유틸리티에서 사용하도록 설정된 원격 액세스를 사용하여 서버를 로컬로 실행해야 함을 의미합니다. 로컬 함수 코드가 실행되고 Azure에 액세스할 수 없으면 이벤트 구독을 만들 수 없습니다.

Blob 트리거 엔드포인트 확인

함수가 로컬로 실행되는 경우 이벤트 기반 Blob Storage 트리거에 사용되는 기본 엔드포인트는 다음 URL과 같습니다.

http://localhost:7071/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid
http://localhost:7071/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid

이 경로를 저장합니다. 나중에 이벤트 구독에 대한 엔드포인트 URL을 만드는 데 사용됩니다. 다른 이름을 Blob Storage 트리거 함수에 사용한 경우 쿼리 문자열에서 functionName 값을 변경해야 합니다.

참고 항목

엔드포인트가 Blob Storage 트리거에 대한 이벤트를 처리하므로 blobs가 엔드포인트 경로에 포함됩니다. 대신 Event Grid 트리거에 대한 엔드포인트 URL의 경로에는 eventgrid가 있습니다.

ngrok 실행

컴퓨터에서 디버그되는 함수를 중단하려면 Azure Event Grid가 로컬 컴퓨터에서 실행되는 함수와 통신할 수 있는 방법을 제공해야 합니다.

ngrok 유틸리티는 임의로 생성된 프록시 서버 주소에 대한 외부 요청을 로컬 컴퓨터의 특정 주소 및 포트에 전달하여 컴퓨터에서 실행되는 함수의 웹후크 엔드포인트를 호출합니다.

  1. 다음 명령을 사용하여 ngrok를 시작합니다.

    ngrok.exe http http://localhost:7071
    

    유틸리티가 시작되면 명령 창이 다음 스크린샷과 비슷하게 표시됩니다.

    Screenshot that shows the Command Prompt after starting the

  2. ngrok가 실행될 때 생성된 HTTPS URL을 복사합니다. 이 값은 ngrok를 사용하여 공개된 컴퓨터의 웹후크 엔드포인트를 확인하는 데 사용됩니다.

Important

이 시점에서 ngrok를 중지하지 마세요. ngrok를 시작할 때마다 HTTPS URL이 다른 값으로 다시 생성됩니다. 이벤트 구독의 엔드포인트는 수정할 수 없으므로 ngrok를 실행할 때마다 새 이벤트 구독을 만들어야 합니다.

ngrok 계정을 만드는 경우를 제외하고는 최대 ngrok 세션 시간이 2시간으로 제한됩니다.

엔드포인트 URL 빌드

이벤트 구독에 사용되는 엔드포인트는 접두사가 붙은 서버 이름, 경로 및 쿼리 문자열의 세 부분으로 구성됩니다. 다음 표에서는 이러한 부분에 대해 설명합니다.

URL 부분 설명
접두사 및 서버 이름 함수가 로컬로 실행되면 https:// 접두사가 있는 서버 이름은 ngrok에서 생성된 전달 URL에서 가져옵니다. localhost URL에서 ngrok URL은 http://localhost:7071을 대체합니다. Azure에서 실행하는 경우 일반적으로 https://<FUNCTION_APP_NAME>.azurewebsites.net 형식인 게시된 함수 앱 서버를 대신 사용합니다.
Path 엔드포인트 URL의 경로 부분은 이전에 복사한 localhost URL에서 가져오며, Blob Storage 트리거의 경우 /runtime/webhooks/blobs와 비슷합니다. Event Grid 트리거의 경로는 /runtime/webhooks/EventGrid입니다.
쿼리 문자열 쿼리 문자열에서 functionName=BlobTriggerEventGrid이어야 하는 .NET In-process를 제외한 .NET Isolated를 포함한 모든 언어에 대해 functionName=Host.Functions.BlobTriggerEventGrid 매개 변수가 이벤트를 처리하는 함수의 이름을 설정합니다. 다른 이름을 함수에 사용한 경우 이 값을 변경해야 합니다. 로컬로 실행하는 경우 액세스 키는 필요하지 않습니다. Azure에서 실행하는 경우 포털에서 가져올 수 있는 키가 포함된 code= 매개 변수도 URL에 포함해야 합니다.

다음 스크린샷에서는 BlobTriggerEventGrid라는 Blob Storage 트리거를 사용할 때 표시되는 최종 엔드포인트 URL에 대한 예제를 보여 줍니다.

Endpoint selection

디버그 시작

ngrok가 이미 실행 중인 상태에서 로컬 프로젝트를 다음과 같이 시작합니다.

  1. 로깅을 처리하는 줄에서 함수의 중단점을 설정합니다.

  2. 디버깅 세션을 시작합니다.

    새 터미널을 열고, 다음 mvn 명령을 실행하여 디버깅 세션을 시작합니다.

    mvn azure-functions:run -DenableDebug
    

    F5 키를 눌러 디버깅 세션을 시작합니다.

코드가 실행되고 ngrok 전달 요청이 있으면 Blob 컨테이너에 대한 이벤트 구독을 만들어야 합니다.

이벤트 구독 만들기

Azure Event Grid에서 구동되는 이벤트 구독은 연결된 Blob 컨테이너의 변경 내용에 따라 이벤트를 발생시킵니다. 그런 다음, 이 이벤트는 함수 트리거의 웹후크 엔드포인트로 보내집니다. 이벤트 구독이 만들어지면 엔드포인트 URL을 변경할 수 없습니다. 즉, 로컬 디버깅을 완료한 후(또는 ngrok를 다시 시작하는 경우) 이벤트 구독을 삭제하고 다시 만들어야 합니다.

  1. Visual Studio Code의 작업 막대에서 Azure 아이콘을 선택합니다. 리소스에서 구독, 스토리지 계정을 차례로 펼치고, 마우스 오른쪽 단추로 이전에 만든 스토리지 계정을 클릭하고, 포털에서 열기를 선택합니다.

  2. Azure Portal에 로그인하고, 스토리지 계정에 대한 리소스 그룹을 적어 둡니다. 완료되면 리소스를 더 쉽게 정리할 수 있도록 다른 리소스를 동일한 그룹에 만듭니다.

  3. 왼쪽 메뉴에서 이벤트 옵션을 선택합니다.

    Add storage account event

  4. 이벤트 창에서 + 이벤트 구독 단추를 선택하고, 다음 표의 값을 기본 탭에 제공합니다.

    설정 제안 값 Description
    이름 myBlobLocalNgrokEventSub 이벤트 구독을 식별하는 이름입니다. 이 이름을 사용하여 이벤트 구독을 빠르게 찾을 수 있습니다.
    이벤트 스키마 Event Grid 스키마 기본 스키마를 이벤트에 사용합니다.
    시스템 토픽 이름 samples-workitems-Blobs 컨테이너를 나타내는 토픽의 이름입니다. 토픽은 첫 번째 구독으로 만들어지며 이후 이벤트 구독에 사용됩니다.
    이벤트 유형 필터 만든 Blob
    엔드포인트 유형 웹후크 Blob 스토리지 트리거는 웹후크 엔드포인트를 사용합니다. Azure Functions를 Event Grid 트리거에 사용합니다.
    엔드포인트 ngrok 기반 URL 엔드포인트 이전에 확인한 ngrok 기반 URL 엔드포인트를 사용합니다.
  5. 선택 확인을 선택하여 엔드포인트 URL의 유효성을 검사합니다.

  6. 만들기를 선택하여 이벤트 구독을 만듭니다.

컨테이너에 파일 업로드

이벤트 구독이 준비되고 코드 프로젝트와 ngrok가 계속 실행되고 있으면 이제 파일을 스토리지 컨테이너에 업로드하여 함수를 트리거할 수 있습니다. Visual Studio Code를 사용하여 파일을 컴퓨터에서 Blob Storage 컨테이너로 업로드할 수 있습니다.

  1. Visual Studio Code에서 명령 팔레트를 열고(F1 키 누름) Azure Storage: Upload Files...를 입력합니다.

  2. 열기 대화 상자에서 파일, 되도록이면 너무 크지 않은 이진 이미지 파일을 선택하고, 업로드를 선택합니다.

  3. 프롬프트에서 다음 정보를 제공합니다.

    설정 제안 값 설명
    리소스 선택 스토리지 계정 이름 이전 단계에서 만든 스토리지 계정의 이름을 선택합니다.
    리소스 종류 선택 Blob 컨테이너 Blob 컨테이너에 업로드합니다.
    Blob 컨테이너 선택 samples-workitems 이 값은 이전 단계에서 만든 컨테이너의 이름입니다.
    이 업로드의 대상 디렉터리 입력 default 컨테이너 루트인 /의 기본값을 그대로 적용합니다.

이 명령은 파일을 컴퓨터에서 Azure의 스토리지 컨테이너로 업로드합니다. 이 시점에서 실행 중인 ngrok 인스턴스에서 요청이 전달되었음을 보고합니다. 또한 디버깅 세션에 대한 func.exe 출력에서 ​​함수가 시작되었음을 알 수 있습니다. 이 시점에서 디버그 세션이 중단점을 설정한 위치에서 대기하고 있기를 바랍니다.

Azure에 프로젝트 게시

이제 함수 코드의 유효성이 로컬로 성공적으로 검사되었으므로 프로젝트를 Azure의 새 함수 앱에 게시해야 합니다.

함수 앱 만들기

다음 단계에서는 Azure에 필요한 리소스를 만들고 프로젝트 파일을 배포합니다.

  1. 명령 팔레트에서 Azure Functions: Azure에서 함수 앱 만들기... (고급)를 입력합니다.

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

    프롬프트 선택 사항
    새 함수 앱의 전역적으로 고유한 이름을 입력합니다. 새 함수 앱을 식별하는 전역적으로 고유한 이름을 입력한 다음, Enter를 선택합니다. 함수 앱 이름에 대한 유효한 문자는 a-z, 0-9-입니다. 이 이름을 적어 둡니다. 나중에 새 엔드포인트 URL을 빌드할 때 필요합니다.
    런타임 스택을 선택하세요. 로컬로 실행한 언어 버전을 선택합니다.
    OS를 선택합니다. Linux 또는 Windows를 선택합니다. Python 앱은 Linux에서 실행해야 합니다.
    새 리소스에 대한 리소스 그룹을 선택합니다. 포털에서 이전에 적어 둔 스토리지 계정을 사용하여 만든 리소스 그룹의 이름을 선택합니다.
    새 리소스의 위치를 선택합니다. 사용자 또는 함수가 액세스하는 기타 서비스에 가까운 지역의 위치를 선택합니다.
    호스팅 플랜을 선택합니다. 함수가 실행될 때만 요금이 청구되는 서버리스 소비 계획 호스팅에 대한 소비를 선택합니다.
    스토리지 계정을 선택합니다.: 사용하고 있는 기존 스토리지 계정의 이름을 선택합니다.
    앱의 Application Insights 리소스를 선택합니다. 새 Application Insights 리소스 만들기를 선택하고 프롬프트에서 함수에서 런타임 데이터를 저장하는 데 사용되는 인스턴스의 이름을 입력합니다.

    함수 앱을 만들고 배포 패키지가 적용된 후 알림이 표시됩니다. 이 알림에서 출력 보기를 선택하여 사용자가 만든 Azure 리소스를 포함한 만들기 및 배포 결과를 표시합니다.

함수 코드 배포

Important

기존 함수 앱에 배포하면 항상 Azure에서 해당 앱의 콘텐츠를 덮어씁니다.

  1. Azure 작업의 리소스 영역에서 방금 만든 함수 앱 리소스를 찾아 마우스 오른쪽 단추로 클릭한 다음 함수 앱에 배포...를 선택합니다.

  2. 이전 배포를 덮어쓰라는 메시지가 표시되면 배포를 선택하여 함수 코드를 새 함수 앱 리소스에 배포합니다.

  3. 배포가 완료되면 출력 보기를 선택하여 사용자가 만든 Azure 리소스를 포함한 만들기 및 배포 결과를 봅니다. 알림이 누락된 경우 오른쪽 아래 모서리에 있는 종 모양 아이콘을 선택하여 다시 확인합니다.

    Screenshot of the View Output window.

애플리케이션 설정 게시

local.settings.json의 로컬 설정은 자동으로 게시되지 않으므로 함수가 Azure에서 올바르게 실행되도록 지금 업로드해야 합니다.

명령 팔레트에서 Azure Functions: 로컬 설정 업로드...를 입력하고, 리소스 선택 프롬프트에서 함수 앱의 이름을 선택합니다.

이벤트 구독 다시 만들기

이제 함수 앱이 Azure에서 실행되고 있으므로 새 이벤트 구독을 만들어야 합니다. 이 새 이벤트 구독은 Azure에서 함수의 엔드포인트를 사용합니다. JPEG(.jpg) 파일이 컨테이너에 추가될 때만 함수가 트리거되도록 필터도 이벤트 구독에 추가합니다. 또한 Azure에서 엔드포인트 URL에는 Event Grid 이외의 행위자가 엔드포인트에 액세스하지 못하도록 차단하는 데 도움이 되는 액세스 키가 포함되어 있습니다.

Blob 확장 키 가져오기

  1. Visual Studio Code의 작업 막대에서 Azure 아이콘을 선택합니다. 리소스에서 구독, 함수 앱을 차례로 펼치고, 마우스 오른쪽 단추로 만든 함수 앱을 클릭하고, 포털에서 열기를 선택합니다.

  2. 왼쪽 메뉴의 함수에서 앱 키를 선택합니다.

  3. 시스템 키 아래에서 blobs_extension이라는 키를 선택하고, 키를 복사합니다.

이 값은 새 엔드포인트 URL의 쿼리 문자열에 포함됩니다.

엔드포인트 URL 빌드

다음 예제를 기반으로 하여 Blob Storage 트리거에 대한 새 엔드포인트 URL을 만듭니다.

https://<FUNCTION_APP_NAME>.azurewebsites.net/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid&code=<BLOB_EXTENSION_KEY>
https://<FUNCTION_APP_NAME>.azurewebsites.net/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid&code=<BLOB_EXTENSION_KEY>

이 예제에서 <FUNCTION_APP_NAME>을 함수 앱의 이름으로 바꾸고, <BLOB_EXTENSION_KEY>를 포털에서 가져온 값으로 바꿉니다. 다른 이름을 함수에 사용한 경우 필요에 따라 functionName 쿼리 문자열도 변경해야 합니다.

필터링된 이벤트 구독 만들기

이벤트 구독의 엔드포인트 URL은 변경할 수 없으므로 새 이벤트 구독을 만들어야 합니다. 또한 이전 이벤트 구독은 다시 사용할 수 없으므로 이 시점에서 삭제해야 합니다.

이번에는 JPEG 파일(*.jpg)만 함수를 트리거하도록 필터를 이벤트 구독에 포함합니다.

  1. Visual Studio Code의 작업 막대에서 Azure 아이콘을 선택합니다. 리소스에서 구독, 스토리지 계정을 차례로 펼치고, 마우스 오른쪽 단추로 이전에 만든 스토리지 계정을 클릭하고, 포털에서 열기를 선택합니다.

  2. Azure Portal의 왼쪽 메뉴에서 이벤트 옵션을 선택합니다.

  3. 이벤트 창에서 이전 ngrok 기반 이벤트 구독을 선택하고, 삭제>저장을 차례로 선택합니다. 이 작업은 이전 이벤트 구독을 제거합니다.

  4. + 이벤트 구독 단추를 선택하고, 다음 표의 값을 기본 탭에 제공합니다.

    설정 제안 값 Description
    이름 myBlobAzureEventSub 이벤트 구독을 식별하는 이름입니다. 이 이름을 사용하여 이벤트 구독을 빠르게 찾을 수 있습니다.
    이벤트 스키마 Event Grid 스키마 기본 스키마를 이벤트에 사용합니다.
    이벤트 유형 필터 만든 Blob
    엔드포인트 유형 웹후크 Blob 스토리지 트리거는 웹후크 엔드포인트를 사용합니다. Azure Functions를 Event Grid 트리거에 사용합니다.
    엔드포인트 새 Azure 기반 URL 엔드포인트 키 값이 포함된 빌드한 URL 엔드포인트를 사용합니다.
  5. 선택 확인을 선택하여 엔드포인트 URL의 유효성을 검사합니다.

  6. 필터 탭을 선택하고, 제목 필터 아래에서 제목 필터링 사용을 선택하고, 제목 종료 문자에서 .jpg를 입력합니다. 이렇게 하면 이벤트를 JPEG 파일로만 필터링합니다.

    Add filter

  7. 만들기를 선택하여 이벤트 구독을 만듭니다.

Azure에서 함수 확인

이제 전체 토폴로지에서 Azure를 실행하고 있으면 모든 항목이 올바르게 작동하는지 확인해야 합니다. 이미 포털에 있으므로 여기서 파일을 업로드하는 것이 가장 쉽습니다.

  1. 포털의 스토리지 계정 페이지에서 컨테이너, samples-workitems 컨테이너를 차례로 선택합니다.

  2. 업로드 단추를 선택하여 오른쪽에서 업로드 페이지를 열고, 로컬 파일 시스템을 탐색하여 업로드할 .jpg 파일을 찾은 다음, 업로드 단추를 선택하여 Blob을 업로드합니다. 이제 컨테이너 업로드 이벤트에 따라 함수가 실행되었는지 확인할 수 있습니다.

  3. 스토리지 계정에서 이벤트 페이지로 돌아가서 이벤트 구독을 선택합니다. 그러면 이벤트가 전달되었음을 알 수 있습니다.

  4. 포털의 함수 앱 페이지로 돌아가고, 함수 아래에서 함수를 선택하고, 함수를 선택합니다. 그러면 하나 이상의 총 실행 횟수가 표시됩니다.

  5. 개발자 아래에서 모니터를 선택합니다. 그러면 성공적인 함수 실행에서 작성된 추적이 표시됩니다. Application Insights에서 이벤트를 처리하므로 최대 5분 동안 지연될 수 있습니다.

리소스 정리

다음 단계를 계속하고 함수에 Azure Storage 큐 바인딩을 추가하는 경우 이미 수행한 작업을 기반으로 모든 리소스를 제자리에 유지해야 합니다.

그렇지 않으면 다음 단계를 수행하여 추가 비용이 발생하지 않도록 함수 앱 및 관련 리소스를 삭제할 수 있습니다.

  1. Visual Studio Code에서 F1을 눌러 명령 팔레트를 엽니다. 명령 팔레트에서 Azure: Open in portal을 검색하여 선택합니다.

  2. 함수 앱을 선택하고 Enter를 누릅니다. 함수 앱 페이지가 Azure Portal에서 열립니다.

  3. 개요 탭에서 리소스 그룹 옆에 있는 명명된 링크를 선택합니다.

    Screenshot of select the resource group to delete from the function app page.

  4. 리소스 그룹 페이지에서 포함된 리소스 목록을 검토하고 삭제하려는 항목인지 확인합니다.

  5. 리소스 그룹 삭제를 선택하고 지시를 따릅니다.

    삭제는 몇 분 정도 소요됩니다. 완료되면 알림이 잠시 표시됩니다. 또한 페이지 위쪽의 종 모양 아이콘을 선택하여 알림을 확인할 수도 있습니다.

Functions 비용에 대한 자세한 내용은 소비 계획 비용 예측을 참조하세요.

다음 단계