Hosting di destinazioni di webhook

Questa guida mostra come ospitare una destinazione webhook in un servizio Cloud Run.

Confronto tra Cloud Functions e Cloud Run

Cloud Functions e Cloud Run forniscono entrambi buone soluzioni per l'hosting delle destinazioni dei webhook. Generalmente, Cloud Functions è veloce da configurare, ideale per la prototipazione e ideale per flussi di lavoro con volumi ridotti. Cloud Run offre maggiore flessibilità ed è in grado di gestire volumi più grandi con contemporaneità.

Utilizza Cloud Run se:

  • Stai utilizzando linguaggi o runtime non supportati in Cloud Functions
  • Vuoi timeout delle richieste più lunghi (fino a 15 minuti)
  • Prevedi volumi elevati e hai bisogno di contemporaneità (80 richieste in parallelo per istanza)

Creazione di una destinazione webhook in Cloud Run in corso...

Con Cloud Run, puoi definire la destinazione di un webhook in qualsiasi linguaggio. Devi solo creare un endpoint HTTP che possa accettare i dati. In genere questa operazione viene eseguita con un POST, ad esempio:

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

Nell'esempio precedente, la pagina di indice dell'URL è configurata per accettare solo le richieste POST e prevede che i dati vengano consegnati tramite un payload JSON.

Integrazione con il provider di webhook

La maggior parte dei servizi che forniscono callback HTTP richiede di verificare la proprietà dell'URL. A questo scopo, in genere viene inviato un token, messaggio o secret e si prevede una risposta valida. Questi requisiti devono essere richiesti al fornitore di servizi. Utilizzando lo stesso esempio riportato sopra, potresti avere il seguente aspetto:

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

Dopo che il provider avrà verificato la tua proprietà, dovrai aggiungere l'autorizzazione anche da parte tua.

Autorizzazione delle richieste

Una destinazione webhook è un URL aperto e pubblico. La maggior parte dei servizi fornisce un token o un secret per garantire che le richieste in entrata provengano da servizi autorizzati. Poiché l'URL è pubblico, non puoi impedire tentativi dannosi di inviare dati alla destinazione del webhook. Tuttavia, l'uso di token o secret garantisce l'elaborazione solo dei dati provenienti da origini autorizzate.

Per verificare la richiesta, devi archiviare la copia del secret come variabile di ambiente o utilizzando un tipo di sistema di gestione delle chiavi. Ogni richiesta deve avere un secret o un token nelle intestazioni delle richieste o nel payload JSON ed è necessario verificarlo per assicurarsi che l'origine sia valida.

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

Se il provider del webhook non supporta un secret o un altro meccanismo di autenticazione, chiunque abbia l'URL della destinazione del webhook potrà inviare messaggi. In questo caso, l'implementazione del webhook deve essere esposta in sicurezza sulla rete internet pubblica.

Rispondere alle richieste

La maggior parte dei servizi richiede di rispondere a una richiesta entro un periodo di tempo prestabilito, come specificato dal servizio. Alcuni webhook dispongono di metodi integrati per riprovare in caso di risposta di errore, ad esempio un codice di stato HTTP 4xx o 5xx, quindi dovrai restituire un codice di stato di operazione riuscita (2xx) per comunicare al servizio che l'evento è stato elaborato correttamente.

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

Timeout

Sia Cloud Run che il provider di webhook prevedono timeout. La domanda più breve tra le due opzioni verrà applicata. Se l'elaborazione dei dati supera il tempo assegnato da Cloud Run o dal fornitore di webhook, dovrai utilizzare un prodotto che ti consenta di completare l'elaborazione in modo asincrono, ad esempio Pub/Sub o Cloud Tasks. Questi prodotti ti consentono di trasferire rapidamente i dati, restituire immediatamente una risposta positiva al provider di webhook e continuare l'elaborazione senza il problema di timeout. Queste sono anche ottime opzioni per gestire errori e nuovi tentativi.

Pattern di webhook comuni

Tipo Esempi
Inoltro dei dati Invio di una notifica tramite Firebase Cloud Messaging ogni volta che viene chiamato il webhook.
Archiviazione dei dati Archiviazione dei dati in BigQuery per analizzarli in un secondo momento.
Azioni di attivazione Completare azioni su Dialogflow, pubblicare risposte su Twitter o eseguire il push nell'ambiente di gestione temporanea ogni volta che viene eseguito il commit di nuovo codice in GitHub.

Passaggi successivi