Azure Functions에 대한 Azure Event Grid 출력 바인딩

Event Grid 출력 바인딩을 사용하여 사용자 지정 토픽에 이벤트를 작성합니다. 사용자 지정 항목에 대한 유효한 액세스 키가 있어야 합니다. Event Grid 출력 바인딩은 SAS(공유 액세스 서명) 토큰을 지원하지 않습니다.

설정 및 구성 세부 정보에 대한 자세한 내용은 Azure Functions에서 Event Grid 트리거 및 바인딩을 사용하는 방법을 참조하세요.

Important

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

Azure Functions는 Python에 대해 두 가지 프로그래밍 모델을 지원합니다. 바인딩을 정의하는 방법은 선택한 프로그래밍 모델에 따라 달라집니다.

Python v2 프로그래밍 모델을 사용하면 Python 함수 코드에서 직접 데코레이터를 사용하여 바인딩을 정의할 수 있습니다. 자세한 내용은 Python 개발자 가이드참조하세요.

이 문서에서는 두 프로그래밍 모델을 모두 지원합니다.

Important

Event Grid 출력 바인딩은 Functions 2.x 이상에서만 사용할 수 있습니다.

예시

Event Grid 출력 바인딩과 함께 사용되는 출력 매개 변수의 형식은 Functions 런타임 버전, 바인딩 확장 버전 및 C# 함수의 형식에 따라 다릅니다. C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.

다음 예제에서는 트리거 및 Event Grid 출력 바인딩 모두에서 사용자 지정 형식이 사용되는 방법을 보여 줍니다.

using System;
using System.Collections.Generic;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace SampleApp
{
    public static class EventGridFunction
    {
        [Function(nameof(EventGridFunction))]
        [EventGridOutput(TopicEndpointUri = "MyEventGridTopicUriSetting", TopicKeySetting = "MyEventGridTopicKeySetting")]
        public static MyEventType Run([EventGridTrigger] MyEventType input, FunctionContext context)
        {
            var logger = context.GetLogger(nameof(EventGridFunction));

            logger.LogInformation(input.Data.ToString());

            var outputEvent = new MyEventType()
            {
                Id = "unique-id",
                Subject = "abc-subject",
                Data = new Dictionary<string, object>
                {
                    { "myKey", "myValue" }
                }
            };

            return outputEvent;
        }
    }

    public class MyEventType
    {
        public string Id { get; set; }

        public string Topic { get; set; }

        public string Subject { get; set; }

        public string EventType { get; set; }

        public DateTime EventTime { get; set; }

        public IDictionary<string, object> Data { get; set; }
    }
}

다음 예제에서는 Event Grid 사용자 지정 토픽에 메시지를 쓰는 Java 함수를 보여 줍니다. 이 함수는 바인딩의 setValue 메서드를 사용하여 문자열을 출력합니다.

public class Function {
    @FunctionName("EventGridTriggerTest")
    public void run(@EventGridTrigger(name = "event") String content,
            @EventGridOutput(name = "outputEvent", topicEndpointUri = "MyEventGridTopicUriSetting", topicKeySetting = "MyEventGridTopicKeySetting") OutputBinding<String> outputEvent,
            final ExecutionContext context) {
        context.getLogger().info("Java EventGrid trigger processed a request." + content);
        final String eventGridOutputDocument = "{\"id\": \"1807\", \"eventType\": \"recordInserted\", \"subject\": \"myapp/cars/java\", \"eventTime\":\"2017-08-10T21:03:07+00:00\", \"data\": {\"make\": \"Ducati\",\"model\": \"Monster\"}, \"dataVersion\": \"1.0\"}";
        outputEvent.setValue(eventGridOutputDocument);
    }
}

POJO 클래스를 사용하여 Event Grid 메시지를 보낼 수도 있습니다.

public class Function {
    @FunctionName("EventGridTriggerTest")
    public void run(@EventGridTrigger(name = "event") String content,
            @EventGridOutput(name = "outputEvent", topicEndpointUri = "MyEventGridTopicUriSetting", topicKeySetting = "MyEventGridTopicKeySetting") OutputBinding<EventGridEvent> outputEvent,
            final ExecutionContext context) {
        context.getLogger().info("Java EventGrid trigger processed a request." + content);

        final EventGridEvent eventGridOutputDocument = new EventGridEvent();
        eventGridOutputDocument.setId("1807");
        eventGridOutputDocument.setEventType("recordInserted");
        eventGridOutputDocument.setEventTime("2017-08-10T21:03:07+00:00");
        eventGridOutputDocument.setDataVersion("1.0");
        eventGridOutputDocument.setSubject("myapp/cars/java");
        eventGridOutputDocument.setData("{\"make\": \"Ducati\",\"model\":\"monster\"");

        outputEvent.setValue(eventGridOutputDocument);
    }
}

class EventGridEvent {
    private String id;
    private String eventType;
    private String subject;
    private String eventTime;
    private String dataVersion;
    private String data;

    public String getId() {
        return id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getDataVersion() {
        return dataVersion;
    }

    public void setDataVersion(String dataVersion) {
        this.dataVersion = dataVersion;
    }

    public String getEventTime() {
        return eventTime;
    }

    public void setEventTime(String eventTime) {
        this.eventTime = eventTime;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getEventType() {
        return eventType;
    }

    public void setEventType(String eventType) {
        this.eventType = eventType;
    }

    public void setId(String id) {
        this.id = id;
    }  
}

다음 예에서는 단일 이벤트를 출력하는 타이머 트리거 TypeScript 함수를 보여 줍니다.

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

export async function timerTrigger1(myTimer: Timer, context: InvocationContext): Promise<EventGridPartialEvent> {
    const timeStamp = new Date().toISOString();
    return {
        id: 'message-id',
        subject: 'subject-name',
        dataVersion: '1.0',
        eventType: 'event-type',
        data: {
            name: 'John Henry',
        },
        eventTime: timeStamp,
    };
}

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: output.eventGrid({
        topicEndpointUri: 'MyEventGridTopicUriSetting',
        topicKeySetting: 'MyEventGridTopicKeySetting',
    }),
    handler: timerTrigger1,
});

여러 이벤트를 출력하려면 단일 개체 대신 배열을 반환합니다. 예시:

const timeStamp = new Date().toISOString();
return [
    {
        id: 'message-id',
        subject: 'subject-name',
        dataVersion: '1.0',
        eventType: 'event-type',
        data: {
            name: 'John Henry',
        },
        eventTime: timeStamp,
    },
    {
        id: 'message-id-2',
        subject: 'subject-name',
        dataVersion: '1.0',
        eventType: 'event-type',
        data: {
            name: 'John Doe',
        },
        eventTime: timeStamp,
    },
];

다음 예에서는 단일 이벤트를 출력하는 타이머 트리거 JavaScript 함수를 보여 줍니다.

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

const eventGridOutput = output.eventGrid({
    topicEndpointUri: 'MyEventGridTopicUriSetting',
    topicKeySetting: 'MyEventGridTopicKeySetting',
});

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: eventGridOutput,
    handler: (myTimer, context) => {
        const timeStamp = new Date().toISOString();
        return {
            id: 'message-id',
            subject: 'subject-name',
            dataVersion: '1.0',
            eventType: 'event-type',
            data: {
                name: 'John Henry',
            },
            eventTime: timeStamp,
        };
    },
});

여러 이벤트를 출력하려면 단일 개체 대신 배열을 반환합니다. 예시:

const timeStamp = new Date().toISOString();
return [
    {
        id: 'message-id',
        subject: 'subject-name',
        dataVersion: '1.0',
        eventType: 'event-type',
        data: {
            name: 'John Henry',
        },
        eventTime: timeStamp,
    },
    {
        id: 'message-id-2',
        subject: 'subject-name',
        dataVersion: '1.0',
        eventType: 'event-type',
        data: {
            name: 'John Doe',
        },
        eventTime: timeStamp,
    },
];

다음 예제에서는 Event Grid 이벤트 메시지를 출력하도록 함수를 구성하는 방법을 보여 줍니다. Event Grid 출력 바인딩을 설정하는 데 필요한 값을 구성하도록 eventGrid 설정된 섹션 type 입니다.

{
  "bindings": [
    {
      "type": "eventGrid",
      "name": "outputEvent",
      "topicEndpointUri": "MyEventGridTopicUriSetting",
      "topicKeySetting": "MyEventGridTopicKeySetting",
      "direction": "out"
    },
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}

함수 Push-OutputBinding 에서 Event Grid 출력 바인딩을 통해 이벤트를 사용자 지정 토픽으로 보냅니다.

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$message = $Request.Query.Message

Push-OutputBinding -Name outputEvent -Value  @{
    id = "1"
    eventType = "testEvent"
    subject = "testapp/testPublish"
    eventTime = "2020-08-27T21:03:07+00:00"
    data = @{
        Message = $message
    }
    dataVersion = "1.0"
}

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = 200
    Body = "OK"
})

다음 예제에서는 바인딩을 사용하는 트리거 바인딩 및 Python 함수를 보여줍니다. 그런 다음 , 에 지정된 대로 이벤트를 사용자 지정 토픽으로 topicEndpointUri보냅니다. 이 예제는 v1 또는 v2 Python 프로그래밍 모델을 사용하는지 여부에 따라 달라집니다.

function_app.py 파일의 함수는 다음과 같습니다.

import logging
import azure.functions as func
import datetime

app = func.FunctionApp()

@app.function_name(name="eventgrid_output")
@app.event_grid_trigger(arg_name="eventGridEvent")
@app.event_grid_output(
    arg_name="outputEvent",
    topic_endpoint_uri="MyEventGridTopicUriSetting",
    topic_key_setting="MyEventGridTopicKeySetting")
def eventgrid_output(eventGridEvent: func.EventGridEvent, 
         outputEvent: func.Out[func.EventGridOutputEvent]) -> None:

    logging.log("eventGridEvent: ", eventGridEvent)

    outputEvent.set(
        func.EventGridOutputEvent(
            id="test-id",
            data={"tag1": "value1", "tag2": "value2"},
            subject="test-subject",
            event_type="test-event-1",
            event_time=datetime.datetime.utcnow(),
            data_version="1.0"))

특성

In Process격리된 작업자 프로세스 C# 라이브러리는 모두 특성을 사용하여 바인딩을 구성합니다. 대신 C# 스크립트는 C# 스크립팅 가이드에 설명된 대로 function.json 구성 파일을 사용합니다.

특성의 생성자는 사용자 지정 항목의 이름을 포함하는 애플리케이션 설정의 이름과 항목 키를 포함하는 애플리케이션 설정의 이름을 사용합니다.

다음 표에서는 EventGridOutputAttribute에 대한 매개 변수를 설명합니다.

매개 변수 설명
TopicEndpointUri MyTopicEndpointUri와 같이 사용자 지정 항목에 대한 URI를 포함하는 앱 설정의 이름입니다.
TopicKeySetting 사용자 지정 항목에 대한 액세스 키가 포함된 앱 설정의 이름입니다.
connection* 토픽 엔드포인트 URI를 포함하는 설정에 대한 공통 접두사 값입니다. 이 애플리케이션 설정의 명명 형식에 대한 자세한 내용은 ID 기반 인증을 참조하세요.

주석

Java 클래스의 경우 EventGridAttribute 특성을 사용합니다.

특성의 생성자는 사용자 지정 항목 이름이 포함된 앱 설정 이름과 항목 키가 포함된 앱 설정 이름을 사용합니다. 이러한 설정에 대한 자세한 내용은 출력 - 구성을 참조하세요. 특성 예제는 EventGridOutput 다음과 같습니다.

public class Function {
    @FunctionName("EventGridTriggerTest")
    public void run(@EventGridTrigger(name = "event") String content,
            @EventGridOutput(name = "outputEvent", topicEndpointUri = "MyEventGridTopicUriSetting", topicKeySetting = "MyEventGridTopicKeySetting") OutputBinding<String> outputEvent, final ExecutionContext context) {
            ...
    }
}

구성

다음 표에서는 output.eventGrid() 메서드에 전달된 options 개체에 설정할 수 있는 속성에 대해 설명합니다.

속성 설명
topicEndpointUri MyTopicEndpointUri와 같이 사용자 지정 항목에 대한 URI를 포함하는 앱 설정의 이름입니다.
topicKeySetting 사용자 지정 항목에 대한 액세스 키가 포함된 앱 설정의 이름입니다.
connection* 토픽 엔드포인트 URI를 포함하는 설정에 대한 공통 접두사 값입니다. 속성을 topicEndpointUri 설정할 connection 때는 속성과 topicKeySetting 속성을 설정하면 안 됩니다. 이 애플리케이션 설정의 명명 형식에 대한 자세한 내용은 ID 기반 인증을 참조하세요.

구성

다음 표에서는 function.json 파일에 설정된 바인딩 구성 속성을 설명합니다.

function.json 속성 설명
type eventGrid로 설정해야 합니다.
direction out로 설정해야 합니다. 이 매개 변수는 사용자가 Azure Portal에서 바인딩을 만들 때 자동으로 설정됩니다.
이름 이벤트를 나타내는 함수 코드에서 사용되는 변수 이름입니다.
topicEndpointUri MyTopicEndpointUri와 같이 사용자 지정 항목에 대한 URI를 포함하는 앱 설정의 이름입니다.
topicKeySetting 사용자 지정 항목에 대한 액세스 키가 포함된 앱 설정의 이름입니다.
connection* 토픽 엔드포인트 URI를 포함하는 설정에 대한 공통 접두사 값입니다. 이 애플리케이션 설정의 명명 형식에 대한 자세한 내용은 ID 기반 인증을 참조하세요.

*ID 기반 연결을 지원하려면 버전 3.3.x 이상의 확장이 필요합니다.

로컬에서 개발하는 경우 Values 컬렉션의 local.settings.json 파일에 애플리케이션 설정을 추가합니다.

Important

TopicEndpointUri 값을 사용자 지정 항목의 URI가 포함된 앱 설정 이름으로 설정했는지 확인합니다. 이 속성에서 직접 사용자 지정 항목의 URI를 지정하지 마세요. Connection을 사용하는 경우에도 마찬가지입니다.

전체 예제는 예제 섹션을 참조하세요.

사용

Event Grid 출력 바인딩에서 지원하는 매개 변수 형식은 Functions 런타임 버전, 확장 패키지 버전 및 사용된 C# 형식에 따라 다릅니다.

함수가 단일 이벤트를 작성하도록 하려는 경우 Event Grid 출력 바인딩은 다음 형식에 바인딩될 수 있습니다.

Type 설명
string 이벤트를 문자열로 지정합니다.
byte[] 이벤트 메시지의 바이트입니다.
JSON 직렬화 가능 형식 JSON 이벤트를 나타내는 개체입니다. 함수는 POCO(Plain Old CLR Object) 형식을 JSON 데이터로 직렬화하려고 시도합니다.

함수가 여러 이벤트를 작성하도록 하려는 경우 Event Grid 출력 바인딩을 다음 형식에 바인딩할 수 있습니다.

Type 설명
T이(가) 단일 이벤트 유형 중 하나인 T[] 여러 이벤트를 포함하는 배열입니다. 각 항목은 하나의 이벤트를 나타냅니다.

다른 출력 시나리오의 경우 Azure.Messaging.EventGrid에서 직접 형식을 만들고 사용합니다.

out EventGridOutput paramName과 같은 메서드 매개 변수를 호출하여 개별 메시지를 보내고 ICollector<EventGridOutput>으로 여러 메시지를 작성합니다.

값을 직접 반환하거나 context.extraOutputs.set()를 사용하여 출력 메시지에 액세스합니다.

Event Grid 출력 바인딩에 이벤트를 보내려면 Push-OutputBinding cmdlet을 사용하여 출력 이벤트에 액세스합니다.

함수에서 Event Grid 메시지를 출력하는 두 가지 옵션이 있습니다.

  • 반환 값: function.json$return속성을 .로 설정합니다name. 이 구성을 사용하면 함수의 반환 값이 Event Grid 메시지로 유지됩니다.
  • 명령적: Out 형식으로 선언된 매개 변수의 set 메서드에 값을 전달합니다. set에 전달된 값은 Event Grid 메시지로 유지됩니다.

연결

Event Grid 출력 바인딩을 사용할 때 Event Grid 토픽에서 인증을 받는 방법에는 다음 두 가지가 있습니다.

인증 방법 설명
토픽 키 사용 토픽 키 사용에 설명된 대로 TopicEndpointUriTopicKeySetting 속성을 설정합니다.
ID 사용 Connection 속성을 ID 기반 연결을 함께 정의하는 여러 애플리케이션 설정에 대한 공유 접두사의 이름으로 설정해야 합니다. 이 메서드는 확장 버전 3.3.x 이상을 사용할 때 지원됩니다.

토픽 키 사용

다음 단계를 사용하여 토픽 키를 구성합니다.

  1. 액세스 키 가져오기의 단계에 따라 Event Grid 토픽에 대한 토픽 키를 가져옵니다.

  2. 애플리케이션 설정에서 토픽 키 값을 정의하는 설정을 만듭니다. 바인딩의 TopicKeySetting 속성에 이 설정의 이름을 사용합니다.

  3. 애플리케이션 설정에서 토픽 엔드포인트를 정의하는 설정을 만듭니다. 바인딩의 TopicEndpointUri 속성에 이 설정의 이름을 사용합니다.

ID 기반 인증

버전 3.3.x 이상을 사용하는 경우 Microsoft Entra ID를 사용하여 Event Grid 토픽에 연결하여 토픽 키를 가져오고 작업하지 않아도 됩니다.

토픽 엔드포인트 URI를 반환하는 애플리케이션 설정을 만들어야 합니다. 설정의 이름은 고유한 공통 접두사(예: myawesometopic)를 값__topicEndpointUri과 결합해야 합니다. 그런 다음 바인딩에서 속성을 정의 Connection 할 때 공통 접두사(이 경우myawesometopic)를 사용해야 합니다.

이 모드에서 확장에는 다음 속성이 필요합니다.

속성 환경 변수 템플릿 설명 예제 값
토픽 엔드포인트 URI <CONNECTION_NAME_PREFIX>__topicEndpointUri 토픽 엔드포인트. https://<topic-name>.centralus-1.eventgrid.azure.net/api/events

연결을 사용자 지정하는 데 더 많은 속성을 사용할 수 있습니다. ID 기반 연결의 공통 속성을 참조하세요.

참고 항목

Azure App Configuration 또는 Key Vault를 사용하여 관리 ID 기반 연결에 대한 설정을 제공하는 경우 설정 이름은 올바르게 확인되도록 __ 대신 : 또는 /와 같은 유효한 키 구분 기호를 사용해야 합니다.

예들 들어 <CONNECTION_NAME_PREFIX>:topicEndpointUri입니다.

Azure Functions 서비스에서 호스트되는 경우 ID 기반 연결에 관리 ID가 사용됩니다. 사용자가 할당한 ID는 credentialclientID 속성을 사용하여 지정할 수 있지만 기본적으로 시스템 할당 ID가 사용됩니다. 리소스 ID를 사용하여 사용자가 할당한 ID를 구성하는 것은 지원되지 않습니다. 로컬 개발과 같은 다른 컨텍스트에서 실행할 때 사용자 지정할 수 있지만 대신 개발자 ID가 사용됩니다. ID 기반 연결을 사용하여 로컬 개발을 참조하세요.

ID에 권한 부여

사용되는 모든 ID에는 의도한 작업을 수행할 수 있는 권한이 있어야 합니다. 대부분 Azure 서비스의 경우 이는 해당 권한을 제공하는 기본 제공 또는 사용자 지정 역할을 사용하여 Azure RBAC에서 역할을 할당해야 함을 의미합니다.

Important

일부 사용 권한은 모든 컨텍스트에 필요하지 않은 대상 서비스에 의해 노출될 수 있습니다. 가능한 경우 최소 권한 원칙을 준수하여 ID에 필요한 권한만 부여하세요. 예를 들어 앱이 데이터 원본에서 읽을 수만 있으면 되는 경우 읽기 권한만 있는 역할을 사용합니다. 읽기 작업에 대한 과도한 권한이 될 수 있으므로 해당 서비스에 쓰기도 허용하는 역할을 할당하는 것은 부적절합니다. 마찬가지로 역할 할당이 읽어야 하는 리소스에 대해서만 범위가 할당되도록 할 수 있습니다.

런타임 시 Event Grid 항목에 대한 액세스를 제공하는 역할 할당을 만들어야 합니다. 소유자와 같은 관리 역할로는 충분하지 않습니다. 다음 표는 정상 작동에서 Event Hubs 확장을 사용할 때 권장되는 기본 제공 역할을 보여 줍니다. 작성하는 코드에 따라 애플리케이션에 추가 권한이 필요할 수 있습니다.

바인딩 유형 기본 제공 역할 예
출력 바인딩 EventGrid 기여자, EventGrid 데이터 보낸 사람

다음 단계