Azure Service Bus kimeneti kötés az Azure Functionshez

Üzenetsor- vagy témakörüzenetek küldéséhez használja az Azure Service Bus kimeneti kötését.

A beállítással és a konfigurációval kapcsolatos információkért tekintse meg az áttekintést.

Fontos

Ez a cikk lapokat használ a Node.js programozási modell több verziójának támogatásához. A v4-modell általánosan elérhető, és úgy lett kialakítva, hogy rugalmasabb és intuitívabb felhasználói élményt nyújtson JavaScript- és TypeScript-fejlesztők számára. A v4-modell működésével kapcsolatos további információkért tekintse meg az Azure Functions Node.js fejlesztői útmutatóját. A v3 és a v4 közötti különbségekről a migrálási útmutatóban olvashat bővebben.

Az Azure Functions két Python-programozási modellt támogat. A kötések definiálásának módja a választott programozási modelltől függ.

A Python v2 programozási modell lehetővé teszi, hogy a kötéseket dekorátorokkal definiálja közvetlenül a Python-függvénykódban. További információt a Python fejlesztői útmutatójában talál.

Ez a cikk mindkét programozási modellt támogatja.

Példa

A C#-függvények a következő C#-módok egyikével hozhatók létre:

  • Izolált feldolgozómodell: Lefordított C# függvény, amely a futtatókörnyezettől elkülönített feldolgozói folyamatban fut. Izolált feldolgozói folyamat szükséges az LTS- és nem LTS-verziókon futó C#-függvények támogatásához .NET és .NET-keretrendszer. Az izolált feldolgozói folyamatfüggvények bővítményei névtereket használnak Microsoft.Azure.Functions.Worker.Extensions.* .
  • Folyamaton belüli modell: Lefordított C# függvény, amely ugyanabban a folyamatban fut, mint a Functions-futtatókörnyezet. A modell egy változatában a Functions C#-szkriptekkel futtatható, amely elsősorban a C#-portál szerkesztéséhez támogatott. A folyamaton belüli függvények bővítményei névtereket használnak Microsoft.Azure.WebJobs.Extensions.* .

Ez a kód határozza meg és inicializálja a következőt ILogger:

private readonly ILogger<ServiceBusReceivedMessageFunctions> _logger;

public ServiceBusReceivedMessageFunctions(ILogger<ServiceBusReceivedMessageFunctions> logger)
{
    _logger = logger;
}

Ez a példa egy C# függvényt mutat be, amely egy üzenetet fogad, és egy második üzenetsorba írja:

[Function(nameof(ServiceBusReceivedMessageFunction))]
[ServiceBusOutput("outputQueue", Connection = "ServiceBusConnection")]
public string ServiceBusReceivedMessageFunction(
    [ServiceBusTrigger("queue", Connection = "ServiceBusConnection")] ServiceBusReceivedMessage message)
{
    _logger.LogInformation("Message ID: {id}", message.MessageId);
    _logger.LogInformation("Message Body: {body}", message.Body);
    _logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);

    var outputMessage = $"Output message created at {DateTime.Now}";
    return outputMessage;
}

 


Ez a példa egy HTTP-eseményindítót használ egy OutputType objektummal a HTTP-válasz elküldéséhez és a kimeneti üzenet megírásához.

[Function("HttpSendMsg")]
public async Task<OutputType> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req, FunctionContext context)
{
   _logger.LogInformation($"C# HTTP trigger function processed a request for {context.InvocationId}.");

   HttpResponseData response = req.CreateResponse(HttpStatusCode.OK);
   await response.WriteStringAsync("HTTP response: Message sent");

   return new OutputType()
   {
       OutputEvent = "MyMessage",
       HttpResponse = response
   };
}

Ez a kód határozza meg a több kimeneti típust OutputType, amely tartalmazza a Service Bus kimeneti kötésdefinícióját a következőn OutputEvent:

 public class OutputType
{
   [ServiceBusOutput("TopicOrQueueName", Connection = "ServiceBusConnection")]
   public string OutputEvent { get; set; }

   public HttpResponseData HttpResponse { get; set; }
}

Az alábbi példa egy Java-függvényt mutat be, amely egy HTTP-kérés aktiválásakor üzenetet küld egy Service Bus-üzenetsornak myqueue .

@FunctionName("httpToServiceBusQueue")
@ServiceBusQueueOutput(name = "message", queueName = "myqueue", connection = "AzureServiceBusConnection")
public String pushToQueue(
  @HttpTrigger(name = "request", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
  final String message,
  @HttpOutput(name = "response") final OutputBinding<T> result ) {
      result.setValue(message + " has been sent.");
      return message;
 }

A Java-függvények futtatókörnyezeti kódtárában használja a jegyzetet olyan @QueueOutput függvényparamétereken, amelyek értékét egy Service Bus-üzenetsorba írná. A paramétertípusnak a POJO bármely natív Java-típusának kell lennieOutputBinding<T>T.

A Java-függvények a Service Bus-témakörbe is írhatnak. Az alábbi példa a @ServiceBusTopicOutput széljegyzet használatával írja le a kimeneti kötés konfigurációját.

@FunctionName("sbtopicsend")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @ServiceBusTopicOutput(name = "message", topicName = "mytopicname", subscriptionName = "mysubscription", connection = "ServiceBusConnection") OutputBinding<String> message,
            final ExecutionContext context) {

        String name = request.getBody().orElse("Azure Functions");

        message.setValue(name);
        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();

    }

Az alábbi példa egy időzítő által aktivált TypeScript-függvényt mutat be, amely 5 percenként küld üzenetsort.

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

export async function timerTrigger1(myTimer: Timer, context: InvocationContext): Promise<string> {
    const timeStamp = new Date().toISOString();
    return `Message created at: ${timeStamp}`;
}

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: output.serviceBusQueue({
        queueName: 'testqueue',
        connection: 'MyServiceBusConnection',
    }),
    handler: timerTrigger1,
});

Több üzenet kimenetéhez egyetlen objektum helyett egy tömböt kell visszaadnia. Példa:

const timeStamp = new Date().toISOString();
const message = `Message created at: ${timeStamp}`;
return [`1: ${message}`, `2: ${message}`];

Az alábbi példa egy időzítő által aktivált JavaScript-függvényt mutat be, amely 5 percenként küld üzenetsort.

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

const serviceBusOutput = output.serviceBusQueue({
    queueName: 'testqueue',
    connection: 'MyServiceBusConnection',
});

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: serviceBusOutput,
    handler: (myTimer, context) => {
        const timeStamp = new Date().toISOString();
        return `Message created at: ${timeStamp}`;
    },
});

Több üzenet kimenetéhez egyetlen objektum helyett egy tömböt kell visszaadnia. Példa:

const timeStamp = new Date().toISOString();
const message = `Message created at: ${timeStamp}`;
return [`1: ${message}`, `2: ${message}`];

Az alábbi példa egy Service Bus kimeneti kötést mutat be egy function.json fájlban és egy PowerShell-függvényben , amely a kötést használja.

A kötési adatok a function.json fájlban:

{
  "bindings": [
    {
      "type": "serviceBus",
      "direction": "out",
      "connection": "AzureServiceBusConnectionString",
      "name": "outputSbMsg",
      "queueName": "outqueue",
      "topicName": "outtopic"
    }
  ]
}

Itt található a PowerShell, amely egy üzenetet hoz létre a függvény kimeneteként.

param($QueueItem, $TriggerMetadata) 

Push-OutputBinding -Name outputSbMsg -Value @{ 
    name = $QueueItem.name 
    employeeId = $QueueItem.employeeId 
    address = $QueueItem.address 
} 

Az alábbi példa bemutatja, hogyan írhat ki egy Service Bus-üzenetsort a Pythonban. A példa attól függ, hogy a v1 vagy v2 Python programozási modellt használja-e.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.route(route="put_message")
@app.service_bus_topic_output(arg_name="message",
                              connection="<CONNECTION_SETTING>",
                              topic_name="<TOPIC_NAME>")
def main(req: func.HttpRequest, message: func.Out[str]) -> func.HttpResponse:
    input_msg = req.params.get('message')
    message.set(input_msg)
    return 'OK'

Attribútumok

A folyamaton belüli és az izolált feldolgozói folyamat C#-kódtárai attribútumokkal határozzák meg a kimeneti kötést. A C#-szkript ehelyett egy function.json konfigurációs fájlt használ a C#-szkriptelési útmutatóban leírtak szerint.

A C#-osztálytárakban a ServiceBusOutputAttribute használatával határozza meg a kimenet által írt üzenetsort vagy témakört.

Az alábbi táblázat az attribútum használatával beállítható tulajdonságokat ismerteti:

Tulajdonság Leírás
EntityType Az entitástípust úgy állítja be, hogy Queue üzeneteket küldjön egy üzenetsorba, vagy Topic amikor üzeneteket küld egy témakörbe.
QueueOrTopicName Annak a témakörnek vagy üzenetsornak a neve, amelybe üzeneteket szeretne küldeni. A céltípus beállítására használható EntityType .
Kapcsolat A Service Bushoz való csatlakozás módját meghatározó alkalmazásbeállítás vagy beállításgyűjtemény neve. Lásd: Csatlakozás ions.

Dekorátorok

Csak a Python v2 programozási modellre vonatkozik.

A dekoratőrrel definiált Python v2-függvények esetében a következő tulajdonságok a service_bus_topic_outputkövetkezők:

Tulajdonság Leírás
arg_name Annak a változónak a neve, amely az üzenetsort vagy a témakörüzenetet jelöli a függvénykódban.
queue_name Az üzenetsor neve. Csak akkor állítsa be, ha üzenetsor-üzeneteket küld, nem témakörhöz.
topic_name A témakör neve. Csak akkor állítsa be, ha témakörüzeneteket küld, nem üzenetsorhoz.
connection A Service Bushoz való csatlakozás módját meghatározó alkalmazásbeállítás vagy beállításgyűjtemény neve. Lásd: Csatlakozás ions.

A function.json használatával definiált Python-függvények esetében lásd a Konfiguráció szakaszt.

Jegyzetek

A ServiceBusQueueOutput jegyzetek és ServiceBusTopicOutput a széljegyzetek függvénykimenetként is írhatóak. Az ezekkel a széljegyzetekkel díszített paramétert az üzenet típusának megfelelő típusként OutputBinding<T>T kell deklarálni.

Helyi fejlesztéskor adja hozzá az alkalmazásbeállításokat a gyűjtemény local.settings.json fájljáhozValues.

Konfiguráció

Csak a Python v1 programozási modellre vonatkozik.

Az alábbi táblázat a metódusnak output.serviceBusQueue() átadott objektumon options beállítható tulajdonságokat ismerteti.

Tulajdonság Leírás
queueName Az üzenetsor neve.
Kapcsolat A Service Bushoz való csatlakozás módját meghatározó alkalmazásbeállítás vagy beállításgyűjtemény neve. Lásd: Csatlakozás ions.

Az alábbi táblázat a metódusnak output.serviceBusTopic() átadott objektumon options beállítható tulajdonságokat ismerteti.

Tulajdonság Leírás
topicName A témakör neve.
Kapcsolat A Service Bushoz való csatlakozás módját meghatározó alkalmazásbeállítás vagy beállításgyűjtemény neve. Lásd: Csatlakozás ions.

Helyi fejlesztéskor adja hozzá az alkalmazásbeállításokat a gyűjtemény local.settings.json fájljáhozValues.

Az alábbi táblázat a function.json fájlban és az ServiceBus attribútumban beállított kötéskonfigurációs tulajdonságokat ismerteti.

function.json tulajdonság Leírás
type A "serviceBus" értéket kell beállítani. Ez a tulajdonság automatikusan be van állítva, amikor létrehozza az eseményindítót az Azure Portalon.
direction "Out" értékre kell állítani. Ez a tulajdonság automatikusan be van állítva, amikor létrehozza az eseményindítót az Azure Portalon.
név Annak a változónak a neve, amely az üzenetsort vagy a témakörüzenetet jelöli a függvénykódban. Állítsa be a "$return" értéket a függvény visszatérési értékére való hivatkozáshoz.
queueName Az üzenetsor neve. Csak akkor állítsa be, ha üzenetsor-üzeneteket küld, nem témakörhöz.
topicName A témakör neve. Csak akkor állítsa be, ha témakörüzeneteket küld, nem üzenetsorhoz.
Kapcsolat A Service Bushoz való csatlakozás módját meghatározó alkalmazásbeállítás vagy beállításgyűjtemény neve. Lásd: Csatlakozás ions.
accessRights (csak v1) A kapcsolati sztring hozzáférési jogosultságai. A rendelkezésre álló értékek és listena manage . Az alapértelmezett érték azmanage, amely azt jelzi, hogy a connection kezelés engedéllyel rendelkezik. Ha olyan kapcsolati sztring használ, amely nem rendelkezik a Kezelés engedéllyel, állítsa be a "figyelés" elemetaccessRights. Ellenkező esetben előfordulhat, hogy a Functions-futtatókörnyezet nem próbál meg olyan műveleteket végrehajtani, amelyek felügyeleti jogosultságokat igényelnek. Az Azure Functions 2.x és újabb verziójában ez a tulajdonság nem érhető el, mert a Service Bus SDK legújabb verziója nem támogatja a műveletek kezelését.

Helyi fejlesztéskor adja hozzá az alkalmazásbeállításokat a gyűjtemény local.settings.json fájljáhozValues.

A teljes példákért tekintse meg a Példa szakaszt .

Használat

Az alábbi kimeneti paramétertípusokat minden C# mód és bővítményverzió támogatja:

Típus Leírás
System.String Akkor használható, ha az üzenet írása egyszerű szöveg. Ha a paraméter értéke null, amikor a függvény kilép, a Functions nem hoz létre üzenetet.
bájt[] Bináris adatüzenetek írására használható. Ha a paraméter értéke null, amikor a függvény kilép, a Functions nem hoz létre üzenetet.
Objektum Ha egy üzenet JSON-t tartalmaz, a Functions egy JSON-üzenet hasznos adatává szerializálja az objektumot. Ha a paraméter értéke null, amikor a függvény kilép, a Functions egy null objektummal rendelkező üzenetet hoz létre.

Az üzenetspecifikus paramétertípusok további üzenet metaadatokat tartalmaznak. A kimeneti kötés által támogatott konkrét típusok a Functions futtatókörnyezet verziójától, a bővítménycsomag verziójától és a használt C# módtól függnek.

Ha azt szeretné, hogy a függvény egyetlen üzenetet írjon, a Service Bus kimeneti kötése a következő típusokhoz kapcsolódhat:

Típus Leírás
string Az üzenet sztringként. Akkor használja, ha az üzenet egyszerű szöveg.
byte[] Az üzenet bájtja.
JSON szerializálható típusok Az üzenetet jelképező objektum. A Functions egy egyszerű régi CLR-objektum (POCO) típust próbál JSON-adatokká szerializálni.

Ha azt szeretné, hogy a függvény több üzenetet írjon, a Service Bus kimeneti kötése a következő típusokhoz kapcsolódhat:

Típus Leírás
T[] hol T található az egyetlen üzenettípus Több üzenetet tartalmazó tömb. Minden bejegyzés egy üzenetet jelöl.

Egyéb kimeneti forgatókönyvek esetén közvetlenül hozzon létre és használjon típusokat az Azure.Messaging.ServiceBus szolgáltatásból.

Az Azure Functions 1.x-ben a futtatókörnyezet létrehozza az üzenetsort, ha nem létezik, és ön a következőre managevan állítvaaccessRights: . Az Azure Functions 2.x és újabb verziójában az üzenetsornak vagy a témakörnek már léteznie kell; ha olyan üzenetsort vagy témakört ad meg, amely nem létezik, a függvény meghiúsul.

A beépített kimeneti kötés helyett használja az Azure Service Bus SDK-t .

A kimeneti üzenet eléréséhez adja vissza az értéket közvetlenül vagy a használatával context.extraOutputs.set().

A Service Bus kimenete a parancsmagon keresztül Push-OutputBinding érhető el, ahol olyan argumentumokat ad át, amelyek megfelelnek a kötés névparamétere által a function.json fájlban megadott névnek.

A beépített kimeneti kötés helyett használja az Azure Service Bus SDK-t .

A teljes példáért tekintse meg a példák szakaszt.

Kapcsolatok

A connection tulajdonság a környezeti konfigurációra mutató hivatkozás, amely meghatározza, hogy az alkalmazásnak hogyan kell csatlakoznia a Service Bushoz. A következőt határozhatja meg:

Ha a konfigurált érték egy adott beállítás pontos egyezése, a többi beállítás előtagja pedig egyezik, akkor a rendszer a pontos egyezést használja.

Kapcsolati sztring

A kapcsolati sztring beszerzéséhez kövesse a felügyeleti hitelesítő adatok lekérése című témakörben ismertetett lépéseket. A kapcsolati sztring egy Service Bus-névtérhez kell, hogy legyen, nem csak egy adott üzenetsorhoz vagy témakörhöz.

Ezt a kapcsolati sztring a kötéskonfiguráció tulajdonsága által connection megadott értéknek megfelelő névvel rendelkező alkalmazásbeállításban kell tárolni.

Ha az alkalmazásbeállítás neve az "AzureWebJobs" névvel kezdődik, csak a név fennmaradó részét adhatja meg. Ha például a "MyServiceBus" értékre van állítva connection , a Functions-futtatókörnyezet egy "AzureWebJobsMyServiceBus" nevű alkalmazásbeállítást keres. Ha üresen hagyjaconnection, a Functions-futtatókörnyezet az alapértelmezett Service Bus-kapcsolati sztring használja az "AzureWebJobsServiceBus" nevű alkalmazásbeállításban.

Identitásalapú kapcsolatok

Ha a bővítmény 5.x vagy újabb verzióját használja, ahelyett, hogy titkos kapcsolati sztring használ, az alkalmazás Microsoft Entra-identitást használhat. Ehhez meg kell határoznia a beállításokat egy közös előtag alatt, amely leképezi a connection tulajdonságot az eseményindító és a kötés konfigurációjában.

Ebben a módban a bővítményhez a következő tulajdonságok szükségesek:

Tulajdonság Környezeti változó sablonja Leírás Példaérték
Teljes névtér <CONNECTION_NAME_PREFIX>__fullyQualifiedNamespace A teljes Service Bus-névtér. <>service_bus_namespace.servicebus.windows.net

További tulajdonságok is beállíthatók a kapcsolat testreszabásához. Tekintse meg az identitásalapú kapcsolatok gyakori tulajdonságait.

Feljegyzés

Ha Azure-alkalmazás konfigurációt vagy Key Vaultot használ a felügyelt identitáskapcsolatok beállításainak megadásához, a beállítások neveinek egy érvényes kulcselválasztót kell használniuk, például : a __ helyett, / hogy a nevek megfelelően legyenek feloldva.

Például: <CONNECTION_NAME_PREFIX>:fullyQualifiedNamespace.

Az Azure Functions szolgáltatásban üzemeltetett identitásalapú kapcsolatok felügyelt identitást használnak. A rendszer alapértelmezés szerint a rendszer által hozzárendelt identitást használja, bár a felhasználó által hozzárendelt identitás megadható a credential tulajdonságokkal együtt clientID . Vegye figyelembe, hogy a felhasználó által hozzárendelt identitás erőforrás-azonosítóval való konfigurálása nem támogatott. Ha más környezetekben, például helyi fejlesztésben fut, a rendszer ehelyett a fejlesztői identitást használja, bár ez testre szabható. Lásd: Helyi fejlesztés identitásalapú kapcsolatokkal.

Engedély megadása az identitáshoz

Bármilyen identitást is használ, rendelkeznie kell a kívánt műveletek végrehajtásához szükséges engedélyekkel. A legtöbb Azure-szolgáltatás esetében ez azt jelenti, hogy egy szerepkört kell hozzárendelnie az Azure RBAC-ben beépített vagy egyéni szerepkörökkel, amelyek biztosítják ezeket az engedélyeket.

Fontos

A célszolgáltatás bizonyos engedélyeket közzétehet, amelyek nem minden környezethez szükségesek. Ahol lehetséges, tartsa be a minimális jogosultság elvét, és csak az identitáshoz szükséges jogosultságokat adja meg. Ha például az alkalmazásnak csak adatforrásból kell olvasnia, használjon olyan szerepkört, amely csak olvasási engedéllyel rendelkezik. Nem lenne helyénvaló olyan szerepkört hozzárendelni, amely lehetővé teszi az írást is a szolgáltatáshoz, mivel ez túlzott engedély lenne egy olvasási művelethez. Hasonlóképpen meg szeretné győződni arról, hogy a szerepkör-hozzárendelés csak az elolvasandó erőforrásokra terjed ki.

Létre kell hoznia egy szerepkör-hozzárendelést, amely futásidőben hozzáférést biztosít a témakörökhöz és az üzenetsorokhoz. A tulajdonoshoz hasonló felügyeleti szerepkörök nem elegendőek. Az alábbi táblázat olyan beépített szerepköröket mutat be, amelyek a Service Bus-bővítmény normál működésben való használatakor ajánlottak. Előfordulhat, hogy az alkalmazás további engedélyeket igényel az Ön által írt kód alapján.

Kötés típusa Példa beépített szerepkörökre
Trigger1 Azure Service Bus-adatátvevő, Azure Service Bus-adattulajdonos
Kimeneti kötés Azure Service Bus-adatküldő

1 A Service Bus-témakörökből való aktiváláshoz a szerepkör-hozzárendelésnek hatékony hatókörrel kell rendelkeznie a Service Bus-előfizetés erőforrásán. Ha csak a témakört foglalja bele, hibába fog ütközni. Egyes ügyfelek, például az Azure Portal nem teszik közzé a Service Bus-előfizetési erőforrást a szerepkör-hozzárendelés hatóköreként. Ilyen esetekben az Azure CLI használható. További információ: Azure Beépített Azure-szerepkörök az Azure Service Bushoz.

Kivételek és visszatérési kódok

Kötés Referencia
Service Bus Service Bus-hibakódok
Service Bus Service Bus-korlátok

Következő lépések