
Partager:
Software Developer who loves building awesome tools and products. I currently work with Laravel, PHP and Vue.
Rapport d'incident avec PagerDuty et Vonage
Temps de lecture : 8 minutes
Avis d'obsolescence du produit À partir du 31 août 2025, l'API Dispatch de Vonage sera fermée aux nouveaux utilisateurs, bien que le produit continue d'être pris en charge par les utilisateurs existants. Si vous souhaitez créer une application de messagerie avec une fonctionnalité de basculement, le basculement est désormais pris en charge directement dans l'API Messages.
Pour des informations générales sur la fonction de basculement des messages, veuillez vous référer à ce guide. Pour des conseils sur la migration de Dispatch API vers Messages API Failover, veuillez vous référer à ce guide.
Si vous avez d'autres questions concernant l'obsolescence de ce produit, veuillez nous nous contacter sur le Vonage Community Slack.
Introduction
PagerDuty est un système de gestion des rapports d'incidents qui fournit des notifications et des escalades automatiques pour aider les équipes d'ingénieurs à détecter et à résoudre les problèmes au fur et à mesure qu'ils surviennent dans leur infrastructure. Dans ce billet, nous verrons comment utiliser Vonage pour alerter les membres d'une équipe d'ingénieurs dès qu'un incident se produit sur l'une de leurs infrastructures.
En utilisant l'API Dispatch de Vonage, qui fournit une option de basculement automatique, nous enverrons d'abord des notifications via Facebook Messenger comme premier moyen de communication, puis par SMS comme option de repli.
Exigences techniques
Pour suivre le cours, vous aurez besoin de ce qui suit :
PHP version 7.1 ou supérieure
Laravel 5.8
Ngrok qui vous permet d'exposer votre serveur web local à l'internet. Pour en savoir plus sur la façon de configurer votre environnement local avec Ngrok, vous pouvez consulter la documentation ici.
A Facebook Account
A PagerDuty Account
Mise en place
Pour pouvoir utiliser l'API Dispatch, il y a certaines choses que nous devons faire avec notre Account Vonage. Rendez-vous sur votre tableau de bord Vonage et dans la section Applications et répartition, créez une nouvelle application de messages.
new message app in dashboard
\
L'URL d'état est le point de terminaison du webhook auquel Vonage enverra une requête POST chaque fois que nous envoyons des notifications par SMS. Cela nous permettra de déterminer le statut du SMS qui a été envoyé, c'est-à-dire délivré, rejeté ou soumis. Puisque nous utiliserons Ngrok, l'URL de statut devrait ressembler à ceci
qc43v7.ngrok.io/webhooks/status.L'URL entrante est le point de terminaison auquel Vonage adressera une demande chaque fois que des messages entrants sont reçus et devrait ressembler à ceci
qc43v7.ngrok.io/webhooks/inbound-messageEnsuite, générez une paire de clés publique/privée. Le fichier de la clé privée sera automatiquement téléchargé pour vous. Prenez note de ce fichier car nous en aurons besoin prochainement.
Créez l'application et notez l'identifiant de l'application. Ensuite, vous serez invité à associer des numéros et des Account externes à cette application. Cette opération est totalement facultative, vous pouvez donc choisir la valeur par défaut et créer l'application.
Mise en place de PagerDuty
Rendez-vous sur le site de PagerDuty et créez un Account si vous n'en avez pas déjà un. Nous devons également créer un service. Dans PagerDuty, un service représente tout ce contre quoi nous souhaitons ouvrir des incidents. Il peut s'agir d'une application, d'un composant ou même d'une équipe. Ainsi, chaque fois qu'un nouvel incident se produit sur ce service, nous voulons envoyer des notifications webhook à un point d'extrémité particulier de notre application.
Dans votre tableau de bord PagerDuty, allez dans Configuration -> Services et créez un nouveau service.
pager duty dashboard
Comme nous allons utiliser notre propre intégration personnalisée, sélectionnez utiliser directement notre API pour le type d'intégration, puis sélectionnez Events API V2 et remplissez tous les autres détails nécessaires. Pour en savoir plus sur la création d'un service sur PagerDuty ici.
Ensuite, après avoir créé le service, sous l'onglet Intégrations, sélectionnez Nouvelle extension et donnez-lui le type suivant Generic V2 webhook. La section des détails comprendra le point de terminaison dans notre application où nous voulons recevoir des notifications de PagerDuty et devrait ressembler à ce qui suit. qc43v7.ngrok.io/webhooks/incident
pager duty
Configuration de Laravel
Nous allons utiliser composer pour installer un nouveau projet Laravel. A partir de la ligne de commande, créez un nouveau projet Laravel en utilisant la commande suivante :
Routes et contrôleur
Modifiez le routes/web.php avec le code suivant :
<?php
Route::post('/webhooks/inbound-message', 'WebhookController@inboundMessage');
Route::post('/webhooks/status', 'WebhookController@status');
Route::post('/webhooks/incident', 'WebhookController@report');L'attaque par falsification de requête intersite est un type d'attaque malveillante par laquelle des commandes non autorisées sont exécutées au nom d'un utilisateur authentifié. Pour prévenir de telles attaques, Laravel génère automatiquement un jeton pour chaque utilisateur authentifié. Csrf pour chaque utilisateur authentifié, ce qui permet de valider que l'utilisateur authentifié est bien celui qui envoie une requête à l'application. Cependant, comme ces requêtes proviennent de l'extérieur de l'application et que nous faisons confiance à la source, nous devons désactiver la validation pour ces routes. Csrf la validation pour ces routes. L'intergiciel VerifyCsrfToken est utilisé pour valider tous les tokens. Heureusement, l'intergiciel accepte un tableau except qui contient une liste de toutes les routes pour lesquelles la vérification CSRF doit être désactivée.
Modifiez le fichier app\Http\Middleware\VerifyCsrfToken.php avec le code suivant :
protected $except = [
'/webhooks/*'
];Ensuite, exécutez la commande suivante pour créer un contrôleur :
php artisan make:controller WebhookController Cela générera pour nous un fichier WebhookController.php dans le répertoire app\Http\Controllers dans le répertoire Modifiez le fichier avec le code suivant :
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Jobs\ReportIncident;
class WebhookController extends Controller
{
public function inboundMessage(Request $request)
{
return Log::debug('Inbound Message', $request->all());
}
public function status(Request $request)
{
return Log::debug('Status', $request->all());
}
public function report(Request $request)
{
Log::debug('Incident', $request->all());
dispatch(new ReportIncident());
return response('Webhook received');
}
}Pour les inboundMessage() et status() nous enregistrons simplement les données de la requête de Vonage dans le fichier journal fourni par Laravel. La méthode report() distribue un job ReportIncident que nous allons créer prochainement. Cette tâche est chargée de déclencher des notifications SMS à l'aide d'un wrapper personnalisé autour de l'API Vonage.
Relier Facebook à votre Account Vonage
Pour réussir à envoyer des messages de Vonage à Facebook, vous devrez d'abord lier une page Facebook associée à votre Account Facebook à votre compte Vonage. Vous pouvez apprendre comment le faire ici.
Une fois le lien établi, envoyez un message de votre Account Facebook à la page Facebook. Comme il s'agit d'un message entrant, Vonage enverra une demande contenant les détails du message au point de terminaison /webhooks/inbound-message que nous avons créé plus tôt. Vérifiez votre fichier journal et vous devriez voir une entrée similaire à la suivante :
Inbound Message{
"message_uuid":"0a2088d2-e028-4aa0-aa4a-ae11a6f82fb0",
"to":{
"id":"1923256201474167",
"type":"messenger"
},
"from":{
"id":"23037543461244470",
"type":"messenger"
},
"timestamp":"2019-08-06T21:56:16.887Z",
"direction":"inbound",
"message":{
"content":{
"type":"text",
"text":"Hello"
}
}
}L'identifiant de l'expéditeur Facebook est le to.id, tandis que l'identifiant du destinataire est le from.id. Prenez note de ces détails, car nous en aurons besoin prochainement.
Création d'un wrapper personnalisé
Comme l'API Dispatch est encore en version bêta au moment de la rédaction de ce tutoriel, la bibliothèque PHP de Vonage ne la prend pas encore en charge. Par conséquent, nous utiliserons un wrapper personnalisé pour interagir avec l'API de Nexmo. Pour commencer, nous devons d'abord générer un jeton Web Json (JWT) que nous utiliserons pour nous authentifier auprès de l'API.
Utilisation de la CLI de VonageExécutez la commande suivante :
vonage jwt --key_file=./private.key --app_id=VONAGE_APPLICATION_ID./private.key est le chemin d'accès au fichier de clé privée qui a été généré pour vous lorsque vous avez créé l'application Messages and Dispatch, tandis que l'élément app_id est l'identifiant de l'application que nous avons noté plus tôt. Copiez ensuite la sortie de cette commande.
Variables d'environnement et de configuration
Ajoutez le JWT que vous venez de générer à votre fichier d'adresses. .env, les détails de la messagerie que nous avons notés plus tôt et les numéros de téléphone qui se chargeront d'envoyer et de recevoir les notifications par SMS.
VONAGE_JWT = xxxx
FB_SENDER_ID = xxxx
FB_RECIPIENT_ID = xxxx
SMS_FROM = xxxx
SMS_TO = xxxxEnsuite, nous allons référencer les variables d'environnement que nous venons de définir dans notre fichier de configuration. Rendez-vous dans le répertoire config et sous le fichier services.php ajoutez un nouveau fichier Vonage array.
'vonage' => [
'jwt' => env('VONAGE_JWT'),
'fb_sender_id' => env('FB_SENDER_ID'),
'fb_recipient_id' => env('FB_RECIPIENT_ID'),
'sms_from' => env('SMS_FROM'),
'sms_to' => env('SMS_TO')
] Installation des dépendances
La seule dépendance de notre projet est le module GuzzleHTTP que nous utiliserons pour effectuer des appels d'API. Exécutez la commande suivante pour installer la bibliothèque :
composer require guzzlehttp/guzzle Création de l'enveloppe
Dans le répertoire app créez un fichier Vonage.php et ajoutez-y le code suivant :
<?php
namespace App;
use GuzzleHttp\Client;
class Vonage
{
protected $client;
public function __construct()
{
$this->client = $this->setUpClient();
}
protected function setUpClient()
{
$authBearer = 'Bearer ' . config('services.vonage.jwt');
return new Client([
'base_uri' => 'https://api.nexmo.com',
'headers' => [
'Authorization' => $authBearer,
'Content-Type' => 'application/json',
'Accept' => 'application/json'
]
]);
}
public function dispatch()
{
$response = $this->client->request('POST', '/v0.1/dispatch', [
'json' => [
'template' => 'failover',
'workflow' => [
[
'from' => [ 'type' => 'messenger','id' => config('services.vonage.fb_recipient_id')],
'to' => ['type' => 'messenger', 'id' => config('services.vonage.fb_sender_id')],
'message' => [
'content' => [
'type' => 'text',
'text' => 'An incident just occurred',
]
],
'failover' =>[
'expiry_time' => 15,
'condition_status' => 'read',
]
],
[
'from' => ['type' => 'sms','number' => config('services.vonage.sms_from')],
'to' => ['type' => 'sms','number' => config('services.vonage.sms_to')],
'message' => [
'content' => [
'type' => 'text',
'text' => 'An incident just occurred',
]
]
]
]
]
]);
return json_decode($response->getBody());
}
}Dans la méthode dispatch() nous avons défini un modèle de basculement et un flux de travail. Chaque fois qu'un incident se produit via PagerDuty, nous recevons une notification de l'incident sur Facebook Messenger. Si la notification n'est pas lue dans les 15 secondes, la condition de basculement est déclenchée et une notification SMS est envoyée comme solution de repli.
Création de l'emploi
Exécutez la commande suivante sur le terminal pour créer une nouvelle classe d'emploi :
php artisan make:job ReportIncidentModifiez le fichier app\Http\Jobs\ReportIncident avec le code suivant :
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Vonage;
class ReportIncident implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Execute the job.
*
* @return void
*/
public function handle(Voange $vonage)
{
$vonage->dispatch();
}
}La méthode handle() reçoit le wrapper Vonage personnalisé que nous avons créé plus tôt en tant que dépendance, puis nous appelons la méthode dispatch sur la classe.
Tout mettre bout à bout
Il est temps de tester ce que nous avons construit jusqu'à présent. Rendez-vous sur votre tableau de bord PagerDuty et créez un nouvel incident.
incidents screenshot
Cela déclenchera l'envoi d'une notification webhook au point de terminaison que nous avons ajouté plus tôt à notre compte PagerDuty qui, à son tour, enverra un message à la page Facebook que nous avons liée plus tôt à notre compte Vonage. En supposant que tout se soit bien passé, vous devriez inspecter votre fichier journal car Vonage aurait envoyé une mise à jour concernant l'état du message que nous venons de soumettre.
{
"message_uuid":"c1bcf89b-c16e-427f-a4b7-15816327832f",
"to":{
"id":"1923256201474167",
"type":"messenger"
},
"from":{
"id":"23037543461244470",
"type":"messenger"
},
"timestamp":"2019-08-08T01:53:07.922Z",
"status":"read",
"_links":{
"dispatch":{
"href":"v0.1/dispatch/15756412-30d6-4664-8a1e-abcd029ea7a4",
"dispatch_uuid":"15756412-30d6-4664-8a1e-abcd029ea7a4"
}
}
},
{
"template":"failover",
"status":"completed",
"timestamp":"2019-08-08T01:53:07.959Z",
"usage":{
"price":"0.003",
"currency":"EUR"
},
"dispatch_uuid":"15756412-30d6-4664-8a1e-abcd029ea7a4",
"_links":{
"messages":[
{
"message_uuid":"c1bcf89b-c16e-427f-a4b7-15816327832f",
"href":"v0.1/messages/c1bcf89b-c16e-427f-a4b7-15816327832f",
"channel":"messenger",
"usage":{
"price":"0.001",
"currency":"EUR"
},
"status":"read"
}
]
}
}D'après les journaux ci-dessus, nous obtenons d'abord une mise à jour d'état nous informant que le message a été lu, puis une autre mise à jour d'état nous informant que le flux de travail d'envoi a été achevé. Étant donné que le message a été lu dans les 15 secondes, la condition de basculement a été remplie ; par conséquent, la notification par SMS n'a jamais été déclenchée.
Pour vérifier que la notification SMS sera envoyée si la condition de basculement n'est pas remplie, vous pouvez répéter le même processus mais, cette fois, ne pas lire la notification de Facebook Messenger. Vous constaterez que cette fois-ci, la notification SMS sera déclenchée.
Conclusion
Dans ce tutoriel, nous avons vu comment construire une intégration personnalisée avec PagerDuty et Vonage pour assurer un système d'alerte résilient en cas d'urgence. Vous pouvez trouver un lien vers le repo Github ici.