Héberger des cibles de webhooks

Ce guide explique comment héberger une cible de webhook dans un service Cloud Run.

Cloud Functions et Cloud Run

Cloud Functions et Cloud Run fournissent tous deux de bonnes solutions pour héberger vos cibles de webhooks. En règle générale, Cloud Functions est rapide à configurer, adapté au prototypage et idéal pour les workflows de faible volume. Cloud Run offre une plus grande flexibilité et permet de gérer des volumes plus importants avec la simultanéité.

Utilisez Cloud Run si :

  • vous utilisez des langages ou des environnements d'exécution non compatibles avec Cloud Functions ;
  • Vous souhaitez obtenir des délais avant expiration des requêtes plus longs (jusqu'à 15 minutes).
  • vous attendez un grand volume et avez besoin d'une simultanéité (80 requêtes simultanées par instance).

Créer une cible de webhook dans Cloud Run

À l'aide de Cloud Run, vous pouvez définir une cible de webhook dans le langage de votre choix. Il vous suffit de créer un point de terminaison HTTP pouvant accepter les données. En règle générale, cela se fait avec une requête POST, par exemple :

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()

Dans l'exemple ci-dessus, la page d'index de l'URL est configurée pour n'accepter que des requêtes POST et s'attend à recevoir des données via une charge utile JSON.

Intégration avec le fournisseur de webhooks

La plupart des services qui fournissent des rappels HTTP vous demandent de valider la propriété de l'URL. Pour ce faire, vous devez généralement envoyer un jeton, un message ou un secret, et attendre une réponse valide. Vous devez obtenir ces exigences auprès du fournisseur de services. En utilisant le même exemple ci-dessus, cela pourrait ressembler à ceci :

def index():
    data = request.get_json()
    return data['challenge']

Une fois que le fournisseur a validé votre propriété, vous devez également ajouter une autorisation.

Autoriser les requêtes

Une cible de webhook est une URL publique et ouverte. La plupart des services fournissent un jeton ou un secret pour s'assurer que les requêtes entrantes proviennent de services autorisés. Comme l'URL est publique, vous ne pouvez pas empêcher les tentatives malveillantes d'envoi de données à la cible de webhook. Cependant, l'utilisation de jetons ou de secrets garantit que vous ne traitez que les données provenant de sources autorisées.

Pour vérifier la requête, vous pouvez soit configurer les secrets, soit stocker votre copie du secret en tant que variable d'environnement ou en utilisant un système de gestion de clés.

Lorsque vous stockez votre copie du secret en tant que variable d'environnement, chaque requête doit avoir un secret ou un jeton dans son en-tête ou dans la charge utile JSON, et vous devez le vérifier pour vous assurer que la source est valide.

def index():
    request_secret = request.headers['Secret']
    if request_secret != os.environ['SECRET']:
        return ('Unauthorized', 401)

Si le fournisseur de webhooks n'accepte pas de secret ni aucun autre mécanisme d'authentification, toute personne disposant de l'URL de votre cible de webhook pourra envoyer des messages. Dans ce cas, la mise en œuvre de votre webhook doit pouvoir être exposée en toute sécurité sur l'Internet public.

Répondre aux requêtes

La plupart des services nécessitent que vous répondiez à une requête dans un délai défini par le service. Certains webhooks comportent des méthodes intégrées d'exécution de nouvelles tentatives en cas de réponse d'erreur, comme un code d'état HTTP 4xx ou 5xx. Vous devez donc renvoyer un code d'état indiquant le succès de l'opération (2xx) pour informer le service que l'événement a été correctement traité.

def index():
    data = request.get_json()
    return ('', 200)

Délais avant expiration

Cloud Run et le fournisseur de webhooks ont tous deux des délais avant expiration. Le plus court des deux s'appliquera à votre application. Si votre traitement des données dépasse le temps imparti par Cloud Run ou le fournisseur de webhooks, vous devez utiliser un produit qui vous permet de terminer le traitement de manière asynchrone, tel que Pub/Sub ou Cloud Tasks. Ces produits vous permettent de transférer rapidement les données, de renvoyer immédiatement une réponse positive au fournisseur de webhooks et de poursuivre le traitement sans vous préoccuper du délai avant expiration. Ce sont également de bonnes options pour gérer les échecs et les nouvelles tentatives.

Modèles de webhooks courants

Type Exemples
Relayer des données Envoi d'une notification via Firebase Cloud Messaging chaque fois que le webhook est appelé
Stocker des données Stockage des données dans BigQuery pour analyse ultérieure
Déclencher des actions Exécution d'actions sur Dialogflow, publication de réponses sur Twitter ou transfert vers votre environnement de préproduction chaque fois qu'un nouveau code fait l'objet d'un commit dans GitHub.

Étapes suivantes