Inhaltsverzeichnis
- Warum der übliche SNS-Weg umständlich wird
- Was Sie brauchen
- Schritt 1 — Einen Kanal anlegen, der klingelt
- Schritt 2 — Connection und API Destination erstellen
- Schritt 3 — Regel und Input Transformer erstellen
- Schritt 4 — Wissen, wie das Event wirklich aussieht
- Schritt 5 — Auf das reduzieren, was einen Anruf verdient
- Schritt 6 — Entwarnungen bekommen eine leisere Tür
- Testen, bevor Sie vertrauen
- Und SNS mit E-Mail-zu-Anruf?
- Grenzen, die im Incident zählen
- Was dieses Setup nicht leistet
- Fehlersuche
- Häufige Fragen
- Kann CloudWatch nativ eine Telefonnummer anrufen?
- Brauche ich ein SNS-Topic?
- Durchbricht ein CloudWatch-Alarm „Nicht stören“?
- Warum nicht einfach die Webhook-URL bei SNS abonnieren?
- Kostet das etwas bei AWS?
- Kann ich bei verschiedenen Alarmen verschiedene Personen anrufen?
- Und Alarme in mehreren Regionen oder Accounts?
- Fazit
- Verwandte Artikel
Ein CloudWatch-Alarm kann Ihr Telefon nicht anrufen. Seine einzigen eingebauten Aktionen sind SNS, Auto Scaling, EC2 und Systems Manager, und SNS endet in einer E-Mail, einer SMS oder einer Queue, die Sie im Blick haben müssen. Die Tutorials, die tatsächlich ein Telefon klingeln lassen, verdrahten eine Lambda-Funktion und einen Twilio-Account. Beides können Sie sich sparen: Lassen Sie EventBridge die Zustandsänderung des Alarms empfangen, sie in einen kleinen JSON-Body umformen und per POST an einen Echobell-Anrufkanal schicken.
Dieser Leitfaden deckt den ganzen Weg ab: den Kanal, die EventBridge-Regel, den Input Transformer, die Filter, die das Klingeln bedeutsam halten, und warum es so aussieht, als müsste SNS direkt am Webhook funktionieren, es aber meistens nicht tut.
Warum der übliche SNS-Weg umständlich wird
Der Standardrat lautet „Alarm → SNS-Topic → Subscriber“. Für einen Telefonanruf hat das drei Probleme:
- SNS hat kein Sprachprotokoll. Die Subscriber-Typen sind E-Mail, SMS, Mobile Push, SQS, Lambda, Firehose und HTTP(S). Eine SMS überhört man leicht, und „Nicht stören“ blockiert sie; für einen Sprachanruf müssen Sie selbst etwas bauen.
- Die HTTPS-Nachricht ist ein String in einem String. SNS liefert seinen Umschlag mit
Content-Type: text/plain, und der Alarm ist ein JSON-Dokument, das ins FeldMessagedes Umschlags serialisiert wurde. Ein Webhook-Empfänger, der Felder liest –AlarmName,NewStateValue–, findet nur einen undurchsichtigen Blob. - Der Umschlag ist groß. Zwischen Signatur, URL des Signaturzertifikats und Abmelde-Link fügt der Umschlag deutlich mehr als ein Kilobyte hinzu, bevor Ihr Alarmtext überhaupt beginnt. Echobell kürzt den Text einer Benachrichtigung bei 1500 Bytes, ein Template, das „den ganzen Body ausgibt“, wird also genau dort abgeschnitten, wo der nützliche Teil anfängt.
Mit einer Lambda, die die Nachricht auspackt und weiterleitet, lässt sich SNS zum Laufen bringen. Aber CloudWatch veröffentlicht jede Alarm-Zustandsänderung ohnehin als sauberes JSON-Event an EventBridge – ganz ohne konfigurierte Aktion –, und EventBridge kann es umformen und selbst einen HTTPS-Endpunkt aufrufen.
Was Sie brauchen
- Einen AWS-Account und die Berechtigung, EventBridge-Regeln, Connections und API Destinations anzulegen
- Echobell installiert (App Store / Google Play)
- Mindestens einen bestehenden CloudWatch-Alarm
- Zehn Minuten
Auf Ihrer Seite muss nichts eingehenden Verkehr annehmen. EventBridge stellt die ausgehende Anfrage.
Schritt 1 — Einen Kanal anlegen, der klingelt
Legen Sie in Echobell einen Kanal an und setzen Sie den Benachrichtigungstyp auf Anruf. Ein Anrufkanal verhält sich wie ein eingehender Anruf statt wie ein Push und kommt damit durch iOS-Fokus und „Nicht stören“.
Der Transformer in Schritt 3 sendet einen flachen Body mit den Feldern alarm, state, reason, region und link, daher bleiben die Templates kurz:
Titel: {{state}}: {{alarm}}
Text: {{reason}}
Setzen Sie in den erweiterten Einstellungen das Link-Template, damit ein Tippen auf die Benachrichtigung den Alarm in der Konsole öffnet:
{{link}}
Kopieren Sie die Webhook-URL des Kanals aus der Kanaldetailansicht:
https://hook.echobell.one/t/<channel-token>
Schritt 2 — Connection und API Destination erstellen
EventBridge ruft externe HTTPS-Endpunkte über eine API Destination auf, die eine Connection mit der Authentifizierung braucht. Echobell authentifiziert über das geheime Token in der URL, die Connection ist also eine Formalität – aber EventBridge legt ohne sie keine Destination an.
- Öffnen Sie EventBridge → Integration → API destinations → Connections → Create connection
- Name:
echobell - Authorization type: API key
- API key name:
x-source, Value:eventbridge - Erstellen Sie sie und gehen Sie dann zu API destinations → Create API destination
- Name:
echobell-calling - API destination endpoint: Ihre Echobell-Kanal-URL aus Schritt 1
- HTTP method:
POST - Invocation rate limit:
1pro Sekunde reicht völlig und wirkt als Sicherheitsventil - Connection:
echobell
Der API-Key-Header wird bei jeder Anfrage mitgesendet. Sie können ihn in einer Echobell-Kanalbedingung prüfen, wenn Sie vor dem Token eine zweite Schranke wollen:
header["x-source"] == "eventbridge"
Schritt 3 — Regel und Input Transformer erstellen
Gehen Sie zu EventBridge → Rules → Create rule, in derselben Region wie Ihre Alarme. Regeln sind regional; ein Alarm in eu-west-1 ist für eine Regel in us-east-1 unsichtbar.
Verwenden Sie den default Event Bus und eine Event-Pattern-Regel. Dieses Muster trifft auf jeden Alarm zu, der in ALARM wechselt:
{
"source": ["aws.cloudwatch"],
"detail-type": ["CloudWatch Alarm State Change"],
"detail": {
"state": { "value": ["ALARM"] }
}
}
Wählen Sie als Ziel EventBridge API destination und dann echobell-calling. Lassen Sie die Konsole eine neue Ausführungsrolle anlegen – sie gewährt events:InvokeApiDestination für diese Destination und sonst nichts.
Klappen Sie dann Additional settings → Configure target input → Input transformer auf:
Input path
{
"alarm": "$.detail.alarmName",
"state": "$.detail.state.value",
"reason": "$.detail.state.reason",
"region": "$.region",
"time": "$.time"
}
Template
{
"alarm": "<alarm>",
"state": "<state>",
"reason": "<reason>",
"region": "<region>",
"time": "<time>",
"link": "https://console.aws.amazon.com/cloudwatch/home?region=<region>#alarmsV2:alarm/<alarm>"
}
EventBridge sendet das Ergebnis als application/json, und genau dadurch kann Echobell {{alarm}} und {{state}} direkt lesen.
Schritt 4 — Wissen, wie das Event wirklich aussieht
Der Input Path liest aus dem Event, das CloudWatch veröffentlicht. Gekürzt sieht es so aus:
{
"version": "0",
"id": "c4c1c1c9-6542-e61b-6ef0-8c4d36933a92",
"detail-type": "CloudWatch Alarm State Change",
"source": "aws.cloudwatch",
"account": "123456789012",
"time": "2026-10-16T03:12:44Z",
"region": "us-east-1",
"resources": ["arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx"],
"detail": {
"alarmName": "prod-api-5xx",
"state": {
"value": "ALARM",
"reason": "Threshold Crossed: 1 out of the last 1 datapoints [42.0] was greater than the threshold (10.0).",
"timestamp": "2026-10-16T03:12:44.000+0000"
},
"previousState": { "value": "OK" },
"configuration": { "description": "API 5xx errors on the prod load balancer" }
}
}
Was Sie wissen sollten, bevor Sie ein Template ändern:
- Der Alarm liegt unter
detail.$.alarmNametrifft auf nichts zu;$.detail.alarmNameschon. state.reasonist generierter Text. Er nennt den Datenpunkt und den Schwellenwert, genau das, was Sie um 3 Uhr nachts hören wollen.- Alarmnamen werden roh eingefügt. Ein doppeltes Anführungszeichen in einem Alarmnamen oder einer Begründung würde das vom Transformer erzeugte JSON zerstören. Bleiben Sie bei Buchstaben, Ziffern, Bindestrichen und Unterstrichen in Alarmnamen – was ohnehin gute Praxis ist –, sonst scheitert der Aufruf mit einem 400.
- Der Link braucht einen schlichten Namen. Ein Name mit Leerzeichen oder
#verlinkt nicht korrekt; die Konsolensuche findet ihn trotzdem.
Schritt 5 — Auf das reduzieren, was einen Anruf verdient
Ein Alarmkanal, der bei jedem ALARM klingelt, ist der schnellste Weg, sich das Ignorieren anzutrainieren. Filtern Sie an zwei Stellen.
Im EventBridge-Muster, das ausgewertet wird, bevor irgendetwas gesendet wird:
| Ziel | Änderung am Muster |
|---|---|
| Nur Produktionsalarme | "alarmName": [{ "prefix": "prod-" }] innerhalb von detail |
| Nicht Dringendes auslassen | Benennen Sie sie warn-… und nutzen Sie "alarmName": [{ "anything-but": { "prefix": "warn-" } }] |
| Nur bestimmte Alarme | "alarmName": ["prod-api-5xx", "prod-db-cpu"] |
| Nur echte Alarme, keine Testzustände | "state": { "value": ["ALARM"] } beibehalten – ein INSUFFICIENT_DATA-Event trifft nie zu |
| Nur ein Account oder eine Region | "account": ["123456789012"] oder "region": ["us-east-1"] auf oberster Ebene ergänzen |
In Echobell nutzen Sie eine Kanalbedingung für das, was das Muster nicht ausdrücken kann, etwa ein Zeitfenster:
state == "ALARM" && (hour >= 17 || hour < 9)
Echobells Zeitvariablen sind in UTC, rechnen Sie also zuerst aus Ihrer Zeitzone um. Die Bedingungsreferenz listet jede Variable auf.
Schritt 6 — Entwarnungen bekommen eine leisere Tür
Eine zweite Regel mit "value": ["OK"] kann Ihnen mitteilen, dass das Problem behoben ist, ohne zu klingeln. Legen Sie einen zweiten Echobell-Kanal vom Typ Zeitkritisch (oder normal) an, eine zweite API Destination, die darauf zeigt, und verwenden Sie denselben Input Transformer wieder. Das Titel-Template {{state}}: {{alarm}} liest sich bereits als „OK: prod-api-5xx“.
| Regel | Zustand | Kanaltyp | Verhalten |
|---|---|---|---|
alarms-to-call | ALARM, Präfix prod- | Anruf | Klingelt durch den Fokus |
alarms-warn | ALARM, Präfix warn- | Zeitkritisch | Sperrbildschirm, kein Klingeln |
alarms-recovered | OK | Normal | Gewöhnlicher Push |
Testen, bevor Sie vertrauen
Warten Sie nicht, bis die Produktion bricht. Zwingen Sie einen Alarm in den gewünschten Zustand:
aws cloudwatch set-alarm-state \
--alarm-name prod-api-5xx \
--state-value ALARM \
--state-reason "Manual test of the Echobell path"
Der Alarm kehrt bei seiner nächsten Auswertung in seinen echten Zustand zurück, aber das Zustandsänderungs-Event ist echt und läuft durch Ihre Regel. Um nur die Echobell-Seite zu testen, lösen Sie den Kanal direkt aus:
curl -X POST https://hook.echobell.one/t/<channel-token> \
-H 'Content-Type: application/json' \
-d '{"alarm":"prod-api-5xx","state":"ALARM","reason":"Manual test","region":"us-east-1","link":"https://console.aws.amazon.com/cloudwatch/"}'
Klingelt das curl und der Alarmtest nicht, liegt das Problem in der Regel, im Transformer oder in der Destination – nicht im Kanal.
Und SNS mit E-Mail-zu-Anruf?
Wenn Sie überall schon ein SNS-Topic haben und EventBridge nicht anfassen wollen, gibt es zwei andere Wege:
- SNS → Lambda → Webhook. Ein paar Zeilen Code parsen
Messageund schicken dann per POST einen flachen Body an dieselbe Echobell-URL. Das funktioniert, aber nun besitzen Sie eine Funktion, eine Rolle und deren Logs. - SNS → E-Mail → Echobell-E-Mail-Trigger. Abonnieren Sie die E-Mail-Trigger-Adresse des Kanals auf das Topic. Der Alarm kommt als E-Mail an, und
{{subject}}und{{text}}in Ihren Templates werden zur Benachrichtigung. Das ist die Variante mit der geringsten Konfiguration, mit dem Vorbehalt, dass SNS-E-Mail-Abonnements einen einmaligen Bestätigungsklick brauchen und der Text nicht umgeformt wird.
Die Echobell-Webhook-URL direkt als HTTPS-Endpunkt auf das Topic zu abonnieren ist der Weg, den Sie vermeiden sollten: Die Bestätigungsanfrage kommt als Benachrichtigung an, und jeder Alarm danach ist der oben beschriebene lange Umschlag.
Grenzen, die im Incident zählen
- 1 MiB Body. Echobell weist Trigger-Bodies über 1 MiB mit HTTP 413 ab. Ein transformierter Alarm hat einige hundert Bytes, hier stoßen Sie also nicht daran.
- 120 Anfragen pro Minute und Token. Darüber antwortet der Trigger mit
429,RATE_LIMIT_EXCEEDEDund einemRetry-After. Das Limit von 1 pro Sekunde an der Destination hält Sie darunter, und EventBridge wiederholt Events, die es nicht zustellen konnte. - 1500 Bytes Benachrichtigungstext. Längere Ausgaben werden gekürzt.
state.reasonist ein bis zwei Sätze und passt.
Was dieses Setup nicht leistet
- Keine Bestätigung. Den Anruf anzunehmen teilt CloudWatch nichts mit und bringt andere Subscriber nicht zum Schweigen.
- Keine Eskalation, keine Rotation. Alle, die den Kanal abonniert haben, werden angerufen; niemand danach.
- Keine Deduplizierung über den Alarm hinaus. Ein flatternder Alarm, der alle paar Minuten von
OK → ALARMwechselt, klingelt jedes Mal. Beheben Sie das mit längeren Auswertungszeiträumen oderDatapointsToAlarmam Alarm selbst. - Keine Zwei-Wege-Synchronisierung. Die Ursache zu beheben räumt auf Ihrem Telefon nichts auf.
Wenn das Ausschlusskriterien sind, brauchen Sie eine vollwertige On-Call-Plattform. Wenn Sie „ruf mich an, wenn der Produktionsalarm auslöst“ brauchen, sind das eine Handvoll Konsolenseiten.
Fehlersuche
Der Alarm hat ausgelöst, aber nichts kam an. Öffnen Sie den Tab Monitoring der Regel: Invocations zeigt, ob das Muster getroffen hat, FailedInvocations, ob die Zustellung fehlgeschlagen ist. Regeln in einer anderen Region als der Alarm treffen nie zu.
Die Regel trifft zu, aber der Aufruf scheitert mit einem 400. Der Transformer hat ungültiges JSON erzeugt. Suchen Sie ein Anführungszeichen oder einen Backslash im Alarmnamen oder in der Begründung.
Die Benachrichtigung ist leer. Das Template liest ein Feld, das der Transformer nicht gesendet hat. Der Body ist flach: {{alarm}}, nicht {{detail.alarmName}}.
Es klingelt wiederholt für einen Alarm. Der Alarm flattert. Verlängern Sie den Auswertungszeitraum oder verlangen Sie mehr Datenpunkte; das ist eine CloudWatch-Einstellung, keine von Echobell.
Es klingelt bei einem unerwarteten Alarm. Prüfen Sie das Muster auf einen fehlenden prefix-Filter, und denken Sie daran, dass auch zusammengesetzte Alarme und Alarme anderer Werkzeuge (etwa Auto-Scaling-Richtlinien) Zustandsänderungen auslösen.
Häufige Fragen
Kann CloudWatch nativ eine Telefonnummer anrufen?
Nein. CloudWatch-Alarmaktionen sind SNS-Benachrichtigungen, Auto Scaling, EC2-Aktionen und Systems Manager. Ein Sprachanruf braucht einen externen Dienst: eine Lambda, die über einen Anbieter wählt, eine On-Call-Plattform oder einen Anruf-Webhook wie Echobell.
Brauche ich ein SNS-Topic?
Nein. CloudWatch sendet Alarm-Zustandsänderungs-Events von selbst an EventBridge, ob der Alarm Aktionen hat oder nicht. Sie können die Aktionsliste des Alarms leer lassen.
Durchbricht ein CloudWatch-Alarm „Nicht stören“?
Nur wenn er als anrufartiger Alarm ankommt. Ein Echobell-Kanal vom Typ Anruf verhält sich wie ein eingehender Anruf, den iOS-Fokus und „Nicht stören“ durchlassen. Eine SMS oder ein gewöhnlicher Push nicht.
Warum nicht einfach die Webhook-URL bei SNS abonnieren?
SNS sendet text/plain mit dem Alarm serialisiert in einem Message-String, das Template kann also keine einzelnen Felder lesen, und der Umschlag ist lang genug, um gekürzt zu werden. SNS schickt außerdem zuerst eine Abo-Bestätigung, die als Benachrichtigung ankäme.
Kostet das etwas bei AWS?
Alarm-Zustandsänderungs-Events erreichen den default Event Bus kostenlos; API-Destination-Aufrufe werden pro Anfrage abgerechnet. Beim Volumen eines gesunden Alarmbestands ist das vernachlässigbar, aber prüfen Sie die aktuellen EventBridge-Preise für Ihre Region.
Kann ich bei verschiedenen Alarmen verschiedene Personen anrufen?
Ja. Legen Sie pro Zielgruppe einen Kanal an, pro Kanal eine Regel, und lassen Sie jede Person mit dem gewünschten Benachrichtigungstyp abonnieren. Es gibt keine Bestätigung, also werden alle angerufen, die mit „Anruf“ abonniert haben.
Und Alarme in mehreren Regionen oder Accounts?
Regeln gelten pro Region, legen Sie die Regel also in jeder genutzten Region an (dieselbe API-Destination-Definition wird pro Region wiederholt). Für mehrere Accounts schicken Sie die Events an einen zentralen Bus in einem Account und legen die Regel dort an.
Fazit
Der Weg besteht aus fünf Teilen: einem Anrufkanal, einer Connection und API Destination, die darauf zeigen, einer Regel, die nur auf Alarme zutrifft, für die man jemanden weckt, einem Input Transformer, der das Event flach macht, und einem erzwungenen set-alarm-state-Test, bevor Sie sich auf irgendetwas verlassen. Alles andere hier dient dazu, ihn eng genug zu halten, damit ein Klingeln auch in einem Monat noch etwas bedeutet.
Echobell für iPhone laden oder bei Google Play holen – und führen Sie dann den set-alarm-state-Test aus.