Azure İşlevleri için Azure Event Grid çıkış bağlaması

Olayları özel bir konuya yazmak için Event Grid çıkış bağlamasını kullanın. Özel konu için geçerli bir erişim anahtarınız olmalıdır. Event Grid çıkış bağlaması paylaşılan erişim imzası (SAS) belirteçlerini desteklemez.

Kurulum ve yapılandırma ayrıntıları hakkında bilgi için bkz. Azure İşlevleri'da Event Grid tetikleyicileri ve bağlamalarıyla çalışma.

Önemli

Bu makalede, Node.js programlama modelinin birden çok sürümünü desteklemek için sekmeler kullanılır. Genel kullanıma sunulan v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır. v4 modelinin nasıl çalıştığı hakkında daha fazla bilgi için Azure İşlevleri Node.js geliştirici kılavuzuna bakın. v3 ile v4 arasındaki farklar hakkında daha fazla bilgi edinmek için geçiş kılavuzuna bakın.

Azure İşlevleri, Python için iki programlama modelini destekler. Bağlamalarınızı tanımlama şekliniz seçtiğiniz programlama modeline bağlıdır.

Python v2 programlama modeli, doğrudan Python işlev kodunuzda dekoratörleri kullanarak bağlamaları tanımlamanıza olanak tanır. Daha fazla bilgi için bkz . Python geliştirici kılavuzu.

Bu makale her iki programlama modelini de destekler.

Önemli

Event Grid çıkış bağlaması yalnızca İşlevler 2.x ve üzeri için kullanılabilir.

Örnek

Event Grid çıkış bağlamasıyla kullanılan çıkış parametresinin türü İşlevler çalışma zamanı sürümüne, bağlama uzantısı sürümüne ve C# işlevinin modalitesine bağlıdır. C# işlevi aşağıdaki C# modlarından biri kullanılarak oluşturulabilir:

Aşağıdaki örnekte, özel türün hem tetikleyicide hem de Event Grid çıkış bağlamasında nasıl kullanıldığı gösterilmektedir:

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; }
    }
}

Aşağıdaki örnekte, Event Grid özel konusuna ileti yazan bir Java işlevi gösterilmektedir. işlevi, bir dizenin çıkışını almak için bağlamanın setValue yöntemini kullanır.

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);
    }
}

Event Grid iletileri göndermek için POJO sınıfını da kullanabilirsiniz.

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;
    }  
}

Aşağıdaki örnekte tek bir olayın çıkışını veren, zamanlayıcı tarafından tetiklenen TypeScript işlevi gösterilmektedir:

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,
});

Birden çok olay çıktısı almak için tek bir nesne yerine bir dizi döndürebilirsiniz. Örneğin:

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,
    },
];

Aşağıdaki örnekte, tek bir olayın çıkışını veren zamanlayıcı tarafından tetiklenen JavaScript işlevi gösterilmektedir:

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,
        };
    },
});

Birden çok olay çıktısı almak için tek bir nesne yerine bir dizi döndürebilirsiniz. Örneğin:

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,
    },
];

Aşağıdaki örnekte, Event Grid olay iletisinin çıkışını almak için bir işlevin nasıl yapılandırılır gösterilmektedir. Event Grid çıkış bağlaması oluşturmak için eventGrid gereken değerleri yapılandıracak şekilde ayarlandığı type bölüm.

{
  "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"
    }
  ]
}

İşlevinizde, Event Grid çıkış bağlaması aracılığıyla özel bir konuya olay göndermek için öğesini kullanın Push-OutputBinding .

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"
})

Aşağıdaki örnekte bir tetikleyici bağlaması ve bağlamayı kullanan bir Python işlevi gösterilmektedir. Ardından, tarafından belirtildiği topicEndpointUrigibi özel konuya bir olay gönderir. Örnek, v1 veya v2 Python programlama modelini kullanıp kullanmadığınıza bağlıdır.

function_app.py dosyasındaki işlev şu şekildedir:

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"))

Özellikler

Hem işlem içi hem de yalıtılmış çalışan işlemi C# kitaplıkları bağlamayı yapılandırmak için özniteliğini kullanır. Bunun yerine C# betiği, C# betik kılavuzunda açıklandığı gibi bir function.json yapılandırma dosyası kullanır.

Özniteliğin oluşturucu, özel konunun adını içeren bir uygulama ayarının adını ve konu anahtarını içeren bir uygulama ayarının adını alır.

Aşağıdaki tabloda için parametreleri EventGridOutputAttributeaçıklanmaktadır.

Parametre Açıklama
TopicEndpointUri Gibi MyTopicEndpointUriözel konu için URI'yi içeren bir uygulama ayarının adı.
TopicKeySetting Özel konu için erişim anahtarı içeren bir uygulama ayarının adı.
bağlantı* Konu uç noktası URI'sini içeren ayarın ortak ön ekinin değeri. Bu uygulama ayarının adlandırma biçimi hakkında daha fazla bilgi için bkz . Kimlik tabanlı kimlik doğrulaması.

Ek Açıklamalar

Java sınıfları için EventGridAttribute özniteliğini kullanın.

Özniteliğin oluşturucu, özel konunun adını içeren bir uygulama ayarının adını ve konu anahtarını içeren bir uygulama ayarının adını alır. Bu ayarlar hakkında daha fazla bilgi için bkz . Çıkış - yapılandırma. İşte bir EventGridOutput öznitelik örneği:

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) {
            ...
    }
}

Yapılandırma

Aşağıdaki tabloda, yöntemine geçirilen output.eventGrid() nesnede options ayarlayabileceğiniz özellikler açıklanmaktadır.

Özellik Açıklama
topicEndpointUri Gibi MyTopicEndpointUriözel konu için URI'yi içeren bir uygulama ayarının adı.
topicKeySetting Özel konu için erişim anahtarı içeren bir uygulama ayarının adı.
bağlantı* Konu uç noktası URI'sini içeren ayarın ortak ön ekinin değeri. özelliği topicEndpointUri ayarlanırken connection ve topicKeySetting özellikleri ayarlanmamalıdır. Bu uygulama ayarının adlandırma biçimi hakkında daha fazla bilgi için bkz . Kimlik tabanlı kimlik doğrulaması.

Yapılandırma

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır eventGrid.
direction olarak ayarlanmalıdır out. Bağlamayı Azure portalında oluşturduğunuzda bu parametre otomatik olarak ayarlanır.
ad Olayı temsil eden işlev kodunda kullanılan değişken adı.
topicEndpointUri Gibi MyTopicEndpointUriözel konu için URI'yi içeren bir uygulama ayarının adı.
topicKeySetting Özel konu için erişim anahtarı içeren bir uygulama ayarının adı.
bağlantı* Konu uç noktası URI'sini içeren ayarın ortak ön ekinin değeri. Bu uygulama ayarının adlandırma biçimi hakkında daha fazla bilgi için bkz . Kimlik tabanlı kimlik doğrulaması.

*Kimlik tabanlı bağlantılar için destek için uzantının 3.3.x veya üzeri bir sürümü gerekir.

Yerel olarak geliştirme yaparken uygulama ayarlarınızı koleksiyondaki local.settings.json dosyasına Values ekleyin.

Önemli

değerini TopicEndpointUri , özel konunun URI'sini içeren bir uygulama ayarının adına ayarladığınızdan emin olun. Özel konunun URI'sini doğrudan bu özellikte belirtmeyin. aynı durum kullanılırken Connectionde geçerlidir.

Tam örnekler için Örnek bölümüne bakın.

Kullanım

Event Grid çıkış bağlaması tarafından desteklenen parametre türü İşlevler çalışma zamanı sürümüne, uzantı paketi sürümüne ve kullanılan C# modalitesine bağlıdır.

İşlevin tek bir olay yazmasını istediğinizde Event Grid çıkış bağlaması aşağıdaki türlere bağlanabilir:

Type Açıklama
string Dize olarak olay.
byte[] Olay iletisinin baytları.
JSON serileştirilebilir türler JSON olayını temsil eden nesne. İşlevler, düz eski bir CLR nesnesi (POCO) türünü JSON verilerine seri hale getirmeye çalışır.

İşlevin birden çok olay yazmasını istediğinizde Event Grid çıkış bağlaması aşağıdaki türlere bağlanabilir:

Type Açıklama
T[] burada T tek olay türlerinden biridir Birden çok olay içeren bir dizi. Her girdi bir olayı temsil eder.

Diğer çıkış senaryoları için, doğrudan Azure.Messaging.EventGrid'den diğer türlerle bir EventGridPublisherClient oluşturun ve kullanın. Azure SDK'dan bir istemci türü oluşturmak için bağımlılık ekleme kullanma örneği için bkz . Azure istemcilerini kaydetme.

gibi out EventGridOutput paramNamebir yöntem parametresi çağırarak tek tek iletiler gönderin ve ile ICollector<EventGridOutput>birden çok ileti yazın.

Değeri doğrudan döndürerek veya kullanarak context.extraOutputs.set()çıkış iletisine erişin.

Event Grid çıkış bağlamasına Push-OutputBinding bir olay göndermek için cmdlet'ini kullanarak çıkış olayına erişin.

Bir işlevden Event Grid iletisi çıkarmak için iki seçenek vardır:

  • Dönüş değeri: function.json özelliğini olarak $returnayarlayınname. Bu yapılandırmayla işlevin dönüş değeri Event Grid iletisi olarak kalıcı hale getirilir.
  • Kesinlik: Out türü olarak bildirilen parametrenin set yöntemine bir değer geçirin. 'a set geçirilen değer event grid iletisi olarak kalıcıdır.

Bağlantılar

Event Grid çıkış bağlamasını kullanırken Event Grid konusunda kimlik doğrulaması yapmanın iki yolu vardır:

Kimlik doğrulama yöntemi Açıklama
Konu anahtarı kullanma TopicEndpointUri konu anahtarı kullanma bölümünde açıklandığı gibi ve TopicKeySetting özelliklerini ayarlayın.
Kimlik kullanma Connection özelliğini birden çok uygulama ayarı için paylaşılan ön ekin adına ayarlayın ve kimlik tabanlı kimlik doğrulamasını birlikte belirleyin. Bu yöntem, uzantının 3.3.x veya üzeri sürümü kullanılırken desteklenir.

Konu anahtarı kullanma

Konu anahtarını yapılandırmak için aşağıdaki adımları kullanın:

  1. Event Grid konunuzun konu anahtarını almak için Erişim anahtarlarını alma başlığı altındaki adımları izleyin.

  2. Uygulama ayarlarınızda konu anahtarı değerini tanımlayan bir ayar oluşturun. Bağlamanın özelliği için TopicKeySetting bu ayarın adını kullanın.

  3. Uygulama ayarlarınızda konu uç noktasını tanımlayan bir ayar oluşturun. Bağlamanın özelliği için TopicEndpointUri bu ayarın adını kullanın.

Kimlik tabanlı kimlik doğrulaması

Uzantının 3.3.x veya üzeri bir sürümünü kullanırken, konu anahtarlarını almak ve bunlarla çalışmak zorunda kalmamak için Microsoft Entra kimliğini kullanarak bir Event Grid konusuna bağlanabilirsiniz.

Konu uç noktası URI'sini döndüren bir uygulama ayarı oluşturmanız gerekir. Ayarın adı benzersiz bir ortak ön ekini (örneğin, myawesometopic) değeriyle __topicEndpointUribirleştirmelidir. Ardından, bağlamada özelliğini tanımlarken Connection bu ortak ön eki (bu örnekte, myawesometopic) kullanmanız gerekir.

Bu modda uzantı aşağıdaki özellikleri gerektirir:

Özellik Ortam değişkeni şablonu Açıklama Örnek değer
Konu Uç Noktası URI'si <CONNECTION_NAME_PREFIX>__topicEndpointUri Konu uç noktası. https://<topic-name>.centralus-1.eventgrid.azure.net/api/events

Bağlantıyı özelleştirmek için daha fazla özellik kullanılabilir. Bkz. Kimlik tabanlı bağlantılar için ortak özellikler.

Not

Yönetilen kimlik tabanlı bağlantılar için ayarlar sağlamak üzere Azure Uygulaması Yapılandırması veya Key Vault kullanılırken, adların doğru çözümlendiğinden __ emin olmak için adların yerine veya / gibi : geçerli bir anahtar ayırıcı kullanılmalıdır.

Örneğin, <CONNECTION_NAME_PREFIX>:topicEndpointUri.

Azure İşlevleri hizmetinde barındırıldığında, kimlik tabanlı bağlantılar yönetilen kimlik kullanır. Ve özellikleriyle credential clientID kullanıcı tarafından atanan bir kimlik belirtilse de, sistem tarafından atanan kimlik varsayılan olarak kullanılır. Kullanıcı tarafından atanan kimliği kaynak kimliğiyle yapılandırmanın desteklenmediğini unutmayın. Yerel geliştirme gibi diğer bağlamlarda çalıştırıldığında, bunun yerine geliştirici kimliğiniz kullanılır, ancak bu özelleştirilebilir. Bkz. Kimlik tabanlı bağlantılarla yerel geliştirme.

Kimliğe izin verme

Hangi kimlik kullanılıyorsa, hedeflenen eylemleri gerçekleştirmek için izinlere sahip olmalıdır. Çoğu Azure hizmeti için bu, bu izinleri sağlayan yerleşik veya özel rolleri kullanarak Azure RBAC'de bir rol atamanız gerektiği anlamına gelir.

Önemli

Bazı izinler, tüm bağlamlar için gerekli olmayan hedef hizmet tarafından gösterilebilir. Mümkün olduğunda, kimliğe yalnızca gerekli ayrıcalıkları sağlayarak en az ayrıcalık ilkesine uyun. Örneğin, uygulamanın yalnızca bir veri kaynağından okuyabilmesi gerekiyorsa, yalnızca okuma izni olan bir rol kullanın. Okuma işlemi için aşırı izin olduğundan, bu hizmete yazmaya da izin veren bir rol atamak uygun olmaz. Benzer şekilde, rol atamasının kapsamının yalnızca okunması gereken kaynaklara göre ayarlandığından emin olmak istersiniz.

Çalışma zamanında Event Grid konunuza erişim sağlayan bir rol ataması oluşturmanız gerekir. Sahip gibi yönetim rolleri yeterli değildir. Aşağıdaki tabloda, Event Hubs uzantısı normal işlemde kullanılırken önerilen yerleşik roller gösterilmektedir. Uygulamanız, yazdığınız koda göre ek izinler gerektirebilir.

Bağlama türü Örnek yerleşik roller
Çıkış bağlaması EventGrid Katkıda Bulunanı, EventGrid Veri Göndereni

Sonraki adımlar