Share via


자습서: Azure Cache for Redis에서 Azure Functions 트리거 및 바인딩 시작

이 자습서에서는 Azure Cache for Redis 및 Azure Functions를 사용하여 기본 트리거를 구현하는 방법을 보여 줍니다. VS Code(Visual Studio Code)를 사용하여 C#에서 Azure 함수를 작성하고 배포하는 방법을 안내합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 필요한 도구를 설정합니다.
  • 캐시를 구성하고 연결합니다.
  • Azure 함수를 만들고 코드를 배포합니다.
  • 트리거의 로깅을 확인합니다.

필수 구성 요소

Azure Cache for Redis 인스턴스 설정

Azure Portal 또는 선호하는 CLI 도구를 사용하여 새 Azure Cache for Redis 인스턴스를 만듭니다. 이 자습서에서는 좋은 시작점인 표준 C1 인스턴스를 사용합니다. 빠른 시작 가이드를 사용하여 시작합니다.

Azure Portal에서 캐시를 만드는 스크린샷.

기본 설정으로 충분합니다. 이 자습서에서는 데모에 퍼블릭 엔드포인트를 사용하지만 프로덕션의 모든 항목에 프라이빗 엔드포인트를 사용하는 것이 좋습니다.

VM을 만드는 데 몇 분 정도 걸릴 수 있습니다. 프로세스가 완료되는 동안 다음 섹션으로 이동할 수 있습니다.

Visual Studio Code 설정

  1. VS Code용 Azure Functions 확장을 아직 설치하지 않은 경우 EXTENSIONS 메뉴에서 Azure Functions를 검색한 다음 설치를 선택합니다. C# 확장이 설치되어 있지 않은 경우 설치합니다.

    VS Code에 설치된 필수 확장의 스크린샷.

  2. Azure 탭으로 이동합니다. Azure 계정에 로그인합니다.

  3. 빌드 중인 프로젝트를 저장하려면 컴퓨터에 새 로컬 폴더를 만듭니다. 이 자습서에서는 RedisAzureFunctionDemo를 예로 사용합니다.

  4. Azure 탭에서 작업 영역 탭의 오른쪽 위에 있는 번개 아이콘을 선택하여 새 함수 앱을 만듭니다.

  5. 함수 만들기...를 선택합니다.

    VS Code에서 새 함수를 추가하기 위한 아이콘을 보여 주는 스크린샷.

  6. 만든 폴더를 선택하여 새 Azure Functions 프로젝트 만들기를 시작합니다. 여러 화면 프롬프트가 표시됩니다. 선택:

    • C#: 언어
    • .NET 8.0 격리된 LTS를 .NET 런타임으로 사용합니다.
    • 지금은 건너뛰기: 프로젝트 템플릿

    .NET Core SDK가 설치되어 있지 않으면 설치하라는 메시지가 표시됩니다.

    Important

    .NET 함수의 경우 In Process 모델보다 격리된 작업자 모델을 사용하는 것이 좋습니다. In Process 및 격리된 작업자 모델을 비교하려면 Azure Functions의 .NET용 격리된 작업자 모델과 In Process 모델 간의 차이점을 참조하세요. 이 샘플은 격리된 작업자 모델을 사용합니다.

  7. 탐색기 창에 새 프로젝트가 표시되는지 확인합니다.

    VS Code의 작업 영역 스크린샷.

필요한 NuGet 패키지 설치

Redis 키스페이스 알림을 Azure Functions에서 트리거로 사용할 수 있도록 하는 Redis용 NuGet 패키지 확장인 Microsoft.Azure.Functions.Worker.Extensions.Redis를 설치해야 합니다.

VS Code의 터미널 탭으로 이동한 후 다음 명령을 입력하여 이 패키지를 설치합니다.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Redis --prerelease

참고 항목

Microsoft.Azure.Functions.Worker.Extensions.Redis 패키지는 .NET 격리된 작업자 프로세스 함수에 사용됩니다. .NET In Process 함수 및 기타 모든 언어는 대신 Microsoft.Azure.WebJobs.Extensions.Redis 패키지를 사용합니다.

캐시 구성

  1. 새로 만든 Azure Cache for Redis 인스턴스로 이동합니다.

  2. Azure Portal에서 캐시로 이동한 다음, 다음을 수행합니다.

    1. 리소스 메뉴에서 고급 설정을 선택합니다.

    2. notify-keyspace-events 상자까지 아래로 스크롤하고 KEA를 입력합니다.

      KEA는 모든 키 및 이벤트에 대해 키스페이스 알림을 사용하도록 설정하는 구성 문자열입니다. 키스페이스 구성 문자열에 대한 자세한 내용은 Redis 설명서를 참조하세요.

    3. 창 위쪽에서 저장을 선택합니다.

    포털의 Azure Cache for Redis에 대한 고급 설정 스크린샷.

  3. 리소스 메뉴에서 액세스 키를 선택한 다음, 기본 연결 문자열 상자의 내용을 적어 두거나 복사합니다. 이 문자열은 캐시에 연결하는 데 사용됩니다.

    액세스 키에 대한 기본 연결 문자열을 보여 주는 스크린샷.

Redis 트리거에 대한 코드 예 설정

  1. VS Code에서 프로젝트에 Common.cs라는 파일을 추가합니다. 이 클래스는 PubSubTrigger에 대한 JSON 직렬 응답을 구문 분석하는 데 사용됩니다.

  2. 다음 코드를 복사하여 Common.cs 파일에 붙여넣습니다.

    public class Common
    {
        public const string connectionString = "redisConnectionString";
    
        public class ChannelMessage
        {
            public string SubscriptionChannel { get; set; }
            public string Channel { get; set; }
            public string Message { get; set; }
        }
    }
    
  3. 프로젝트에 RedisTriggers.cs라는 파일을 추가합니다.

  4. 다음 코드 샘플을 복사하여 새 파일에 붙여넣습니다.

    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Extensions.Redis;
    
    public class RedisTriggers
    {
        private readonly ILogger<RedisTriggers> logger;
    
        public RedisTriggers(ILogger<RedisTriggers> logger)
        {
            this.logger = logger;
        }
    
        // PubSubTrigger function listens to messages from the 'pubsubTest' channel.
        [Function("PubSubTrigger")]
        public void PubSub(
        [RedisPubSubTrigger(Common.connectionString, "pubsubTest")] Common.ChannelMessage channelMessage)
        {
        logger.LogInformation($"Function triggered on pub/sub message '{channelMessage.Message}' from channel '{channelMessage.Channel}'.");
        }
    
        // KeyeventTrigger function listens to key events from the 'del' operation.
        [Function("KeyeventTrigger")]
        public void Keyevent(
            [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:del")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' deleted.");
        }
    
        // KeyspaceTrigger function listens to key events on the 'keyspaceTest' key.
        [Function("KeyspaceTrigger")]
        public void Keyspace(
            [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:keyspaceTest")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key 'keyspaceTest' was updated with operation '{channelMessage.Message}'");
        }
    
        // ListTrigger function listens to changes to the 'listTest' list.
        [Function("ListTrigger")]
        public void List(
            [RedisListTrigger(Common.connectionString, "listTest")] string response)
        {
            logger.LogInformation(response);
        }
    
        // StreamTrigger function listens to changes to the 'streamTest' stream.
        [Function("StreamTrigger")]
        public void Stream(
            [RedisStreamTrigger(Common.connectionString, "streamTest")] string response)
        {
            logger.LogInformation(response);
        }
    }
    
  5. 이 자습서에서는 Redis 활동을 트리거하는 여러 가지 방법을 보여 줍니다.

    • PubSubTrigger- 활동이 pubsubTest라는 Pub/Sub 채널에 게시될 때 트리거됩니다.
    • KeyspaceTrigger- Pub/Sub 트리거를 기준으로 합니다. keyspaceTest 키에 대한 변경 내용을 찾는 데 사용합니다.
    • KeyeventTrigger- Pub/Sub 트리거를 기준으로 합니다. DEL 명령이 사용되는 경우를 찾는 데 사용합니다.
    • ListTrigger- listTest 목록의 변경 내용을 찾습니다.
    • StreamTrigger- streamTest 스트림에 대한 변경 내용을 찾습니다.

캐시에 연결

  1. Redis 활동을 트리거하려면 캐시 인스턴스의 연결 문자열을 전달해야 합니다. 이 정보는 폴더에 자동으로 만들어진 local.settings.json 파일에 저장됩니다. 보안 모범 사례로 로컬 설정 파일을 사용하는 것이 좋습니다.

  2. 캐시에 연결하려면 local.settings.json 파일에 ConnectionStrings 섹션을 추가한 다음, redisConnectionString 매개 변수를 사용하여 연결 문자열을 추가합니다. 이 섹션은 다음 예제와 같습니다.

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "redisConnectionString": "<your-connection-string>"
      }
    }
    

    Common.cs의 코드는 로컬에서 실행될 때 이 값을 찾습니다.

    public const string connectionString = "redisConnectionString";
    

Important

이 예제는 자습서용으로 간소화되었습니다. 프로덕션 용도의 경우 Azure Key Vault를 사용하여 연결 문자열 정보를 저장하거나 EntraID를 사용하여 Redis 인스턴스에 인증하는 것이 좋습니다.

로컬로 코드 빌드 및 실행

  1. VS Code에서 실행 및 디버그 탭으로 전환하고 녹색 화살표를 선택하여 코드를 로컬로 디버그합니다. Azure Functions 핵심 도구가 설치되어 있지 않으면 설치하라는 메시지가 표시됩니다. 이 경우 설치 후에 VS Code를 다시 시작해야 합니다.

  2. 코드가 성공적으로 빌드됩니다. 터미널 출력에서 진행률을 추적할 수 있습니다.

  3. 트리거 기능을 테스트하려면 keyspaceTest 키를 만들었다가 삭제해 보세요.

    원하는 방법으로 캐시에 연결할 수 있습니다. 쉬운 방법은 Azure Cache for Redis 포털에서 기본 제공 콘솔 도구를 사용하는 것입니다. Azure Portal에서 캐시 인스턴스로 이동한 다음, 콘솔을 선택하여 엽니다.

    C-Sharp 코드 및 연결 문자열의 스크린샷.

    콘솔이 열리면 다음 명령을 시도합니다.

    • SET keyspaceTest 1
    • SET keyspaceTest 2
    • DEL keyspaceTest
    • PUBLISH pubsubTest testMessage
    • LPUSH listTest test
    • XADD streamTest * name Clippy

    콘솔과 일부 Redis 명령 및 결과의 스크린샷.

  4. 트리거가 터미널에서 활성화되고 있는지 확인합니다.

    코드가 실행 중인 VS Code 편집기의 스크린샷.

Redis 바인딩 추가

바인딩은 Redis 인스턴스에 저장된 데이터를 읽거나 쓰는 간소화된 방법을 추가합니다. 바인딩의 이점을 보여 주기 위해 두 가지 다른 함수를 추가합니다. 그 중 하나는 SetGetter라고 하며, 키가 설정될 때마다 트리거되고 입력 바인딩을 사용하여 키의 새 값을 반환합니다. 다른 하나는 StreamSetter라고 하며, 새 항목이 스트림 myStream에 추가될 때 트리거되고 출력 바인딩을 사용하여 true 값을 키 newStreamEntry에 씁니다.

  1. 프로젝트에 RedisBindings.cs라는 파일을 추가합니다.

  2. 다음 코드 샘플을 복사하여 새 파일에 붙여넣습니다.

    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Extensions.Redis;
    
    public class RedisBindings
    {
        private readonly ILogger<RedisBindings> logger;
    
        public RedisBindings(ILogger<RedisBindings> logger)
        {
            this.logger = logger;
        }
    
        //This example uses the PubSub trigger to listen to key events on the 'set' operation. A Redis Input binding is used to get the value of the key being set.
        [Function("SetGetter")]
        public void SetGetter(
            [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:set")] Common.ChannelMessage channelMessage,
            [RedisInput(Common.connectionString, "GET {Message}")] string value)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' was set to value '{value}'");
        }
    
        //This example uses the PubSub trigger to listen to key events to the key 'key1'. When key1 is modified, a Redis Output binding is used to set the value of the 'key1modified' key to 'true'.
        [Function("SetSetter")]
        [RedisOutput(Common.connectionString, "SET")]
        public string SetSetter(
            [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:key1")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' was updated. Setting the value of 'key1modified' to 'true'");
            return $"key1modified true";
        }
    }
    
  3. VS Code에서 실행 및 디버그 탭으로 전환하고 녹색 화살표를 선택하여 코드를 로컬로 디버그합니다. 코드가 성공적으로 빌드됩니다. 터미널 출력에서 진행률을 추적할 수 있습니다.

  4. 입력 바인딩 기능을 테스트하려면 예를 들어, SET hello world 명령을 사용하여 키에 대해 새 값을 설정해 보세요. SetGetter 기능이 업데이트된 값을 트리거하고 반환하는 것을 확인해야 합니다.

  5. 출력 바인딩 기능을 테스트하려면 XADD myStream * item Order1 명령을 사용하여 myStream 스트림에 새 항목을 추가해 보세요. StreamSetter 함수는 새 스트림 항목에서 트리거되고 true 값을 newStreamEntry라는 다른 키로 설정합니다. 이 set 명령은 SetGetter 함수도 트리거합니다.

Azure 함수에 코드 배포

  1. 새 Azure 함수를 만듭니다.

    1. Azure 탭으로 돌아가서 구독을 확장합니다.

    2. 함수 앱을 마우스 오른쪽 단추로 클릭한 다음, Azure에서 함수 앱 만들기(고급)를 선택합니다.

    VS Code에서 함수 앱을 만들기 위한 선택 항목의 스크린샷.

  2. 새 함수 앱을 구성하는 방법에 대한 정보를 묻는 몇 가지 프롬프트가 표시됩니다.

    • 고유한 이름을 입력합니다.
    • 런타임 스택으로 .NET 8 격리됨을 선택합니다.
    • Linux 또는 Windows(둘 다 가능)를 선택합니다.
    • 함수 앱을 저장할 기존 또는 새 리소스 그룹을 선택합니다.
    • 캐시 인스턴스와 동일한 지역을 선택합니다.
    • 호스팅 계획으로 프리미엄을 선택합니다.
    • 새 Azure App Service 플랜을 만듭니다.
    • EP1 가격 책정 계층을 선택합니다.
    • 기존 스토리지 계정을 선택하거나 새 스토리지 계정을 만듭니다.
    • 새 Application Insights 리소스를 만듭니다. 리소스를 사용하여 트리거가 작동하는지 확인합니다.

    Important

    Redis 트리거는 현재 소비 함수에서 지원되지 않습니다.

  3. 새 함수 앱이 만들어질 때까지 몇 분 정도 기다립니다. 구독의 함수 앱 아래에 표시됩니다. 새 함수 앱을 마우스 오른쪽 단추로 클릭한 다음, 함수 앱에 배포를 선택합니다.

    VS Code에서 함수 앱에 배포하기 위한 선택 항목의 스크린샷.

  4. 앱이 빌드되고 배포를 시작합니다. 출력 창에서 진행률을 추적할 수 있습니다.

연결 문자열 정보 추가

  1. Azure Portal에서 새 함수 앱으로 이동하고 리소스 메뉴에서 환경 변수를 선택합니다.

  2. 작업 창에서 앱 설정으로 이동합니다.

  3. 이름으로 redisConnectionString을 입력합니다.

  4. 으로 연결 문자열을 입력합니다.

  5. 확인하려면 페이지에서 적용을 선택합니다.

  6. 개요 창으로 이동하고 다시 시작을 선택하여 연결 문자열 정보로 함수 앱을 다시 부팅합니다.

트리거 및 바인딩 테스트

  1. 배포가 완료되고 연결 문자열 정보가 추가되면 Azure Portal에서 함수 앱을 엽니다. 그런 다음, 리소스 메뉴에서 로그 스트림을 선택합니다.

  2. Log Analytics가 연결될 때까지 기다린 다음, Redis 콘솔을 사용하여 트리거를 활성화합니다. 트리거가 여기에 기록되고 있는지 확인합니다.

    리소스 메뉴의 함수 앱 리소스에 대한 로그 스트림 스크린샷.

리소스 정리

이 문서에서 만든 리소스를 계속 사용하려면 리소스 그룹을 유지합니다.

그렇지 않고 리소스 사용을 완료하는 경우 요금이 부과되지 않도록 하려면 만든 Azure 리소스 그룹을 삭제하면 됩니다.

Important

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹을 삭제하는 경우 그 안의 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다. 유지하려는 리소스가 포함된 기존 리소스 그룹 내에서 리소스를 만든 경우 리소스 그룹을 삭제하는 대신 각 리소스를 개별적으로 삭제할 수 있습니다.

리소스 그룹을 삭제하려면

  1. Azure Portal에 로그인한 다음, 리소스 그룹을 선택합니다.

  2. 삭제하려는 리소스 그룹을 선택합니다.

    리소스 그룹이 많은 경우 필드 필터링... 상자를 사용하여 이 문서에 대해 만든 리소스 그룹의 이름을 입력합니다. 결과 목록에서 리소스 그룹을 선택합니다.

    작업 창에서 삭제할 리소스 그룹 목록을 보여 주는 스크린샷.

  3. 리소스 그룹 삭제를 선택합니다.

  4. 리소스 그룹 삭제를 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 입력하여 확인한 다음, 삭제를 선택합니다.

    삭제를 확인하기 위해 리소스 이름이 필요한 양식을 보여 주는 스크린샷.

잠시 후, 리소스 그룹 및 모든 해당 리소스가 삭제됩니다.