Fermer

juillet 16, 2018

Triggers et liaisons dans les fonctions Azure


Une plongée profonde dans les déclencheurs et les liaisons dans Azure Functions en utilisant un exemple du monde réel

Je suis content que vous et moi étions sur le même vol pour notre prochaine conférence de développeurs de logiciels. Nous avons commencé à parler de toutes les choses sans serveur et nous avons jeté un coup d'œil à l'offre de cloud sans serveur de Microsoft, Azure Functions. Maintenant que nous avons atterri et atteint notre hôtel, il est temps de se plonger un peu plus dans l'utilisation des fonctions Azure pour construire quelque chose de réel. Et amusez-vous à le faire.

Cela se révèle être une excellente conversation en trois parties:

Laissez-nous plonger un peu plus loin dans la façon d'utiliser Azure Functions pour construire des flux de développement intéressants. Que diriez-vous de construire une application qui fonctionne sans serveur et qui, penchée sur elle-même, provoque nos amis en leur envoyant un texto à chaque fois que notre équipe favorite bat la leur :). Parfois, c'est amusant d'être un peu maléfique, n'est-ce pas?

Je suis un grand fan de Milwaukee Brewers et pour un changement, ils sont finalement en train de gagner des parties. Donc, je veux vraiment construire un flux de travail dans le cloud qui me permet de parler de trash à mes amis fans non-Brewers, sans que je doive vraiment me souvenir de faire la poubelle. Cette application va montrer comment utiliser différents déclencheurs pour lancer les fonctions Azure, et comment les fonctions Azure gère les liaisons à d'autres services, comme Azure Storage Azure Cosmos DB et Twilio – au point où nous n'avons plus à nous inquiéter de leur cycle de vie!

The What

Voici le workflow cloud de base que nous cherchons à construire:

 Les parties de l'application Function

Il y a une applet construite dans IFTTT qui surveille les scores finaux des parties de balle. Une fois le jeu terminé, il fait un appel HTTP. Cet appel HTTP sera le déclencheur de notre première fonction Azure. La première fonction Azure décompose ensuite le message entrant et l'écrit dans une file d'attente de stockage Azure qui lance ensuite une deuxième fonction Azure.

Cette deuxième fonction Azure est associée à plusieurs liaisons. Il est automatiquement configuré pour consulter Azure Cosmos DB afin d'extraire tous les amis dont l'équipe favorite correspond à l'adversaire qui a perdu. Il est également configuré pour avoir une connexion en écriture à Azure Cosmos DB, afin que nous puissions sauvegarder les résultats du jeu. Enfin, il est lié à Twilio – ce qui le rend très facile d'envoyer des messages SMS.

Décompressons les parties constituantes une par une pour voir comment vous pouvez construire une application sans serveur comme celle-ci. [19659003] Vous pouvez trouver tout le code pour les fonctions Azure discutées dans cet article à ce GitHub Repo .

IFTTT Configuration

Les premières choses d'abord. Nous devons configurer quelque chose qui appellera notre fonction Azure déclenchée HTTP, mais qui surveille également les scores des parties de baseball. Pour cela, je me suis tourné vers IFTTT – car ils me permettent de construire une applet qui attend les scores finaux des jeux Brewers en utilisant le service ESPN (c'est la partie If ). La partie Puis est qu'elle appellera un webhook, alias notre fonction Azure

 IFTTT configuration

Dans le cadre de la définition de la partie webhook, j'ai configuré le JSON que IFTTT publiera, et l'URL à laquelle il sera publié. Une fois cela terminé, nous sommes sur notre première fonction Azure – le déclencheur HTTP

HTTP Triggered Function

Toutes les fonctions que je construis dans cet exemple utilisent C #. Vous pouvez également créer des fonctions en utilisant JavaScript ou C # Script. J'utilise C # compilé parce que c'est ce qui me convient le mieux.

Cette première fonction Azure sera déclenchée par un POST HTTP, chargée de prendre le message JSON entrant, de l'analyser, puis de l'écrire à une file d'attente de stockage Azure. Pour ce faire, nous devons à la fois définir la fonction comme ayant un HTTPTrigger et la définir comme ayant une Output Binding d'une file d'attente Azure Storage.

La beauté des fonctions Azure est que la définition de la liaison de déclenchement et de sortie est effectuée dans la définition de la fonction – via les attributs de fonction et de paramètre. Lorsque le moteur d'exécution voit ces attributs, il prend soin d'instancier correctement les écouteurs HTTP appropriés et la connexion de file d'attente pour nous – nous n'avons rien d'autre à faire.

Jetons un coup d'œil à la fonction entière pour mieux illustrer: [19659022] public static GameResult Run (
  [HttpTrigger(AuthorizationLevel.Function, « post », Route = null)]
  Résultat IFTTTGameResult,
  Journal TraceWriter)
{
  // Rompre le texte entrant pour obtenir les scores
  var gameResult = Helpers.BreakIFTTTApart (résultat);

  return gameResult;
}

Ici l'attribut FunctionName détermine le nom de la fonction lorsqu'elle sera affichée dans le portail. La file d'attente ("game-results") attribue une connexion à la connexion Azure Storage appropriée et se connecte à la file d'attente de jeu . Enfin, l'attribut HttpTrigger indique à la fonction Azure de rechercher une méthode POST et le corps entrant doit correspondre à la structure de la classe IFTTTGameResult . comment le déclencheur Queue ("game-results") est préfacé par le mot-clé return . Cela indique à l'exécution que tout ce qui est retourné par la fonction, allez-y et mettez-le simplement dans la file d'attente. Aucune autre action n'est nécessaire de notre part.

Et c'est la toute première fonction Azure – qui est déclenchée par un message HTTP puis écrit dans une file d'attente.

File d'attente déclenchée et Azure Cosmos DB / Twilio Bound

Une fois que l'enregistrement approprié est écrit dans la file d'attente, nous devons agir pour que nous puissions narguer nos amis – en supposant bien sûr, les Brewers gagnent. Et dans cette prochaine fonction Azure, vous verrez le vrai pouvoir des liaisons.

Voici la fonction entière, en entier, en premier. Ensuite, nous parlerons de chaque partie individuelle.

[FunctionName("TalkTrashFunction")]
 Public async static Task Run (
  [QueueTrigger(queueName:"game-results", Connection ="AzureWebJobsStorage")]
    GameResult gameResultFromQueue,
  [CosmosDB(databaseName:dbName, collectionName:collName, ConnectionStringSetting =conxString,
    SqlQuery ="SELECT * FROM c WHERE c.FavoriteTeam = {Opponent}")] IEnumerable  amis,
  [CosmosDB(databaseName:dbName, collectionName:collName, ConnectionStringSetting =conxString)]
    IAsyncCollector  writeResultsToCosmos,
  [TwilioSms(AccountSidSetting ="TwilioAccountSID",AuthTokenSetting ="TwilioAuthKey")]
    IAsyncCollector  smsMessages,
  Journal TraceWriter)
{
  // Ecrit d'abord le résultat du jeu dans Azure Cosmos DB
  attend writeResultsToCosmos.AddAsync (gameResultFromQueue);

  // Assurez-vous que les Brewers ont gagné - si c'est le cas, envoyez un texto à tous nos amis!
  if (! gameResultFromQueue.BrewersWin)
    revenir;

  foreach (var ami chez des amis)
  {
    var msgOptions = new CreateMessageOptions (nouveau PhoneNumber (friend.TelNumber))
    {
      De = new PhoneNumber (GetEnvironmentVariable ("TwilioFromPhone")),
      Body = $ "Ouais - les Brewers ont encore battu le {gameResultFromQueue.Opponent} {friend.Name} !! HA HA HA HA HA !!!"
    }

    wait smsMessages.AddAsync (msgOptions);
  }
} 

Les attributs

Le premier attribut défini dans la liste des paramètres est un QueueTrigger . Il dispose de divers paramètres lui indiquant la connexion Azure Storage à utiliser et la file d'attente à surveiller. Il est également mappé directement à une variable fortement typée. Dès qu'un enregistrement correspondant aux propriétés de cette variable est inséré dans la file d'attente, cette fonction Azure se déclenche.

Le deuxième attribut de paramètre est très intéressant. Il est lié à Azure Cosmos DB et son but est de sortir les disques (ou nos amis) dont l'équipe favorite est l'adversaire des Brewers. Les trois premiers paramètres de cet attribut déterminent la connexion, la base de données et la collection à partir desquelles il doit être utilisé. Le paramètre SqlQuery détermine quelles données doivent être retournées et remplies dans la variable IEnumerable friends .

Jetons un coup d'œil à cette requête:

 SELECT * FROM c WHERE c.FavoriteTeam = {Adversaire} 

FavoriteTeam est une propriété dans le document que nous voulons tirer. Et {Opposant} est une propriété de la variable GameResult qui est extraite de la file d'attente! Cela signifie que nous pouvons définir de façon déclarative une requête Azure Cosmos DB dans notre définition Azure Function, et qu'elle dépend d'autres liaisons dans cette fonction!

L'attribut suivant est un autre [CosmosDB] mais cette fois son type de variable est ] IAsyncCollector . Cela nous permet d'écrire des documents ayant les mêmes propriétés que la classe GameResult dans Azure Cosmos DB

L'attribut final est à Twilio, [TwilioSms]. Il prend en compte mes informations de compte et son type de paramètre est également un IAsyncCollector – ce qui signifie que je peux envoyer plus d'un message SMS à la fois.

The Logic

Travaillez pour nous: ouvrir des connexions à Azure Storage, à Azure Cosmos DB et à Twilio. Il ne reste plus qu'à exécuter une logique simple

La première étape consiste à écrire le même résultat dans la base de données Azure Cosmos en utilisant le IAsyncCollector .

 wait writeResultsToCosmos.AddAsync (gameResultFromQueue);

Ensuite, après nous être assurés que les Brewers ont gagné, nous passons en revue nos amis et nous leur envoyons des messages texte:

 foreach (var friend in friends)
{
  var msgOptions = new CreateMessageOptions (nouveau PhoneNumber (friend.TelNumber))
  {
    De = new PhoneNumber (GetEnvironmentVariable ("TwilioFromPhone")),
    Body = $ "Ouais - les Brewers ont encore battu le {gameResultFromQueue.Opponent} {friend.Name} !! HA HA HA HA HA !!!"
  }

  wait smsMessages.AddAsync (msgOptions);
} 

La classe CreateMessageOptions provient du SDK Twilio et indique les paramètres nécessaires pour envoyer le message. Tout ce qu'il faut pour l'envoyer est de l'ajouter au IAsyncCollector de l'attribut [TwilioSms]

Final Thoughts

Avec deux Azure Functions nous avons créé une application qui raille nos amis avec des messages texte chaque fois que les Brewers de Milwaukee gagnent! La puissance des fonctions Azure brille dans les liaisons à Azure Storage Azure Cosmos DB et à Twilio . En définissant ces connexions via des attributs, tout le travail nécessaire pour gérer la durée de vie de la connexion est fait pour nous par l'exécution d'Azure Functions et nous sommes libres de nous concentrer sur la logique de notre fonction.

. Dans une conversation en trois parties, nous avons commencé à partir des bases de l'informatique sans serveur couvert une introduction à Azure Functions et construit un flux de travail sans serveur alimenté par le cloud. Le grand attrait pour les développeurs est l'automatisation – les déclencheurs et les liaisons dans Azure Functions peuvent éliminer une grande partie de la charge lourde. Et avec la tarification des architectures sans serveur, il y a des économies de coûts significatives pour de nombreux flux de travail dans le cloud. J'espère que vous avez eu du plaisir – le futur est nuageux avec une chance d'épiphanies!


Les commentaires sont désactivés en mode prévisualisation.
[ad_2]
Source link