Come posso utilizzare i webhook per pubblicare messaggi Amazon SNS su Amazon Chime, Slack o Microsoft Teams?

5 minuti di lettura
0

Desidero utilizzare i webhook per connettere l’ambiente AWS alla chat room di Amazon Chime o al canale Slack o Microsoft Teams. Come posso inviare notifiche da Amazon Simple Notification Service (Amazon SNS) a un webhook?

Breve descrizione

Puoi utilizzare Amazon SNS per inviare messaggi di notifica agli endpoint HTTP o HTTPS, ad esempio gli URL dei webhook. Tuttavia, al momento della conferma della sottoscrizione HTTP o HTTPS, alcuni webhook prevedono coppie chiave-valore JSON che Amazon SNS non supporta.

Ad esempio, i webhook Amazon Chime prevedono una richiesta JSON con una stringa di messaggio corrispondente a una chiave “Contenuto”. Analogamente, i webhook di Slack e Microsoft Teams prevedono entrambi una richiesta JSON con una stringa di messaggio corrispondente a una chiave “testo”.

Per trasformare il documento JSON del corpo del messaggio di Amazon SNS in modo che possa essere elaborato dall’endpoint webhook, utilizza una funzione AWS Lambda.

Nota: per un elenco delle coppie chiave-valore nel documento JSON del corpo del messaggio Amazon SNS, consulta il formato JSON di notifica HTTP e HTTPS.

Risoluzione

Crea un argomento SNS

Se non l'hai già fatto, crea un argomento SNS con un nome univoco.

Crea una funzione Lambda

Per istruzioni su come creare una funzione Lambda, consulta Getting Started with AWS Lambda. Per ulteriori informazioni, consulta Using AWS Lambda with Amazon SNS.

Il codice della funzione Lambda deve includere la logica per trasformare i messaggi di notifica dell'argomento SNS per il tipo di endpoint webhook che stai utilizzando. Per esempi, consulta i seguenti frammenti di codice Python per i webhook Amazon Chime, Slack e Microsoft Teams. Questi esempi di codice vengono forniti così come sono. Sono compatibili con il runtime Python 3.7 .

Esempio di frammento di codice Python per Amazon Chime

I webhook Amazon Chime prevedono una richiesta JSON con una stringa di messaggio corrispondente a una chiave “Contenuto”. Per ulteriori informazioni, consulta Webhooks for Amazon Chime.

Nota: in questo codice funzione di esempio per i webhook Amazon Chime, sostituisci https://hooks.chime.aws/incomingwebhooks/xxxxxxx con l'URL del webhook.

import urllib3
import json

http = urllib3.PoolManager()


def lambda_handler(event, context):
    url = "https://hooks.chime.aws/incomingwebhooks/xxxxxxx"
    msg = {"Content": event["Records"][0]["Sns"]["Message"]}
    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "message": event["Records"][0]["Sns"]["Message"],
            "status_code": resp.status,
            "response": resp.data,
        }
    )

Esempio di frammento di codice Python per Slack

I webhooks in arrivo in Slack prevedono una richiesta JSON con una stringa di messaggio corrispondente a una chiave “testo”. Supportano anche la personalizzazione dei messaggi, ad esempio l'aggiunta di un nome utente e un'icona o l'override del canale predefinito del webhook. Per ulteriori informazioni, consulta Sending messages using incoming webhooks sul sito web di Slack.

Nota: In questo codice funzione di esempio per i webhook in arrivo in Slack, sostituisci https://hooks.slack.com/services/xxxxxxx con l'URL del webhook in arrivo. Sostituisci anche #CHANNEL_NAME con il nome del canale di destinazione.

import urllib3
import json

http = urllib3.PoolManager()


def lambda_handler(event, context):
    url = "https://hooks.slack.com/services/xxxxxxx"
    msg = {
        "channel": "#CHANNEL_NAME",
        "username": "WEBHOOK_USERNAME",
        "text": event["Records"][0]["Sns"]["Message"],
        "icon_emoji": "",
    }

    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "message": event["Records"][0]["Sns"]["Message"],
            "status_code": resp.status,
            "response": resp.data,
        }
    )

Esempio di frammento di codice Python per Microsoft Teams

I webhook in arrivo in Microsoft Teams prevedono anche una richiesta JSON con una stringa di messaggio corrispondente a una chiave “testo”, Per ulteriori informazioni, consulta Create and send messages sul sito web Microsoft Docs.

Nota: in questo esempio di codice funzione per i webhook in arrivo in Microsoft Teams, sostituisci https://outlook.office.com/webhook/xxxxxxx con l'URL del webhook.

import urllib3
import json

http = urllib3.PoolManager()


def lambda_handler(event, context):
    url = "https://outlook.office.com/webhook/xxxxxxx"
    msg = {"text": event["Records"][0]["Sns"]["Message"]}
    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "message": event["Records"][0]["Sns"]["Message"],
            "status_code": resp.status,
            "response": resp.data,
        }
    )

Prova la funzione Lambda

  1. Nella pagina Funzioni della console Lambda, scegli la tua funzione.
  2. Scegli l'elenco a discesa Test. Quindi, scegli Configura evento di test.
  3. Nella finestra di dialogo Configura evento di test scegli Crea nuovo evento.
  4. Per Modello evento, scegli Notifica argomento SNS.
  5. Per Nome evento, inserisci un nome per l'evento di test.
  6. Scegli Salva.
  7. Dopo averlo salvato, scegli Esegui test. Quindi, esamina Risultato esecuzione.
  • Se l'invocazione del test ha esito positivo con un codice di stato 200:
    Il messaggio di notifica di Amazon SNS viene accettato dal webhook, che lo invia al canale corrispondente.
  • Se l'invocazione ha esito negativo con un codice di stato 4xx:
    Verifica l'URL del webhook per confermare che la coppia chiave-valore sia corretta e accettata dal webhook di destinazione.

Per ulteriori informazioni sulle funzioni di test nella console Lambda, consulta Invoke the Lambda function.

Aggiungi un trigger di argomento SNS alla funzione Lambda

Dopo avere inviato un messaggio SNS al webhook come test nella console Lambda, iscrivi la funzione all'argomento SNS. Per configurarlo dalla console Lambda, aggiungi un trigger di argomento SNS:

  1. Nella pagina Funzioni della console Lambda, scegli la tua funzione.
  2. In Panoramica della funzione, scegli Aggiungi trigger. Per ulteriori informazioni, consulta Invoking Lambda functions.
  3. In Configurazione del trigger, scegli Seleziona un trigger. Quindi scegli SNS.
  4. Per Argomento SNS, scegli l'argomento SNS creato in precedenza.
  5. Scegli Aggiungi.

Per ulteriori informazioni, consulta Configuring functions (console).

Con la tua funzione iscritta all’argomento SNS, i messaggi pubblicati sull'argomento vengono inoltrati alla funzione e quindi al tuo webhook.

Nota: per informazioni su come ricevere notifiche Amazon SNS tramite altri servizi AWS, consulta Monitoring AWS Services using AWS Chatbot.


Informazioni correlate

Adding webhooks to chat rooms

Recapito di messaggi non elaborati

How do I subscribe a Lambda function to an Amazon SNS topic in the same account?

Come posso risolvere l'errore che ricevo quando sottoscrivo una funzione Lambda a un'origine di eventi basata su notifiche push in AWS CloudFormation?