---
title: "CloudWatch alarm telefon uyarıları: Lambda ve Twilio'suz"
description: "SNS telefon arayamaz, verisi de zor ayrışır. CloudWatch alarmını EventBridge ile arama webhook'una yönlendirin: kurulum, filtreler, tuzaklar."
date: 2026-10-16
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - AWS
  - CloudWatch
  - EventBridge
  - telefon uyarıları
  - webhook
  - nöbet
---

# CloudWatch alarm telefon uyarıları: EventBridge'ten telefonunuza, Lambda olmadan

Bir CloudWatch alarmı telefonunuzu arayamaz. Yerleşik eylemleri yalnızca SNS, Auto Scaling, EC2 ve Systems Manager'dır; SNS ise e-postada, SMS'te ya da başında beklemeniz gereken bir kuyrukta biter. Telefonu gerçekten çaldıran öğreticiler bir Lambda fonksiyonu ve bir Twilio hesabı kurar. İkisini de atlayabilirsiniz: alarm durum değişikliğini EventBridge alsın, küçük bir JSON gövdesine dönüştürsün ve bir Echobell arama kanalına POST etsin.

Bu rehber yolun tamamını kapsıyor — kanal, EventBridge kuralı, input transformer, çalmayı anlamlı tutan filtreler ve SNS'i doğrudan webhook'a yöneltmenin neden işleyecekmiş gibi görünüp çoğunlukla işlemediği.

## Olağan SNS yolu neden beceriksiz kalıyor

Varsayılan tavsiye "alarm → SNS topic'i → abone" şeklindedir. Telefon araması için bunun üç sorunu var:

- **SNS'in ses protokolü yok.** Abone türleri e-posta, SMS, mobil push, SQS, Lambda, Firehose ve HTTP(S)'tir. SMS'i kaçırmak kolaydır ve Rahatsız Etmeyin tarafından engellenir; sesli arama için kendi kuracağınız bir şey gerekir.
- **HTTPS mesajı, dizenin içinde dize.** SNS zarfını `Content-Type: text/plain` ile gönderir ve alarmın kendisi zarfın `Message` alanına serileştirilmiş bir JSON belgesidir. Alanları okuyan bir webhook alıcısı — `AlarmName`, `NewStateValue` — yalnızca tek bir anlaşılmaz yığın bulur.
- **Zarf büyük.** İmza, imza sertifikası URL'si ve abonelikten çıkma bağlantısı yüzünden zarf, alarm metniniz başlamadan bir kilobayttan fazla ekler. Echobell bildirim gövdesini 1500 baytta kırptığı için "tüm gövdeyi dök" şablonu tam işe yarar kısmın başladığı yerde kesilir.

SNS'i, mesajı açıp ileten bir Lambda ile çalıştırabilirsiniz. Ama CloudWatch her alarm durum değişikliğini zaten temiz bir JSON olayı olarak EventBridge'e yayımlıyor — yapılandırılacak bir eylem gerekmeden — ve EventBridge bunu yeniden biçimlendirip bir HTTPS uç noktasını kendisi çağırabiliyor.

## Gerekenler

- Bir AWS hesabı ve EventBridge kuralları, connection'lar ve API destination'lar oluşturma yetkisi
- Kurulu Echobell ([App Store](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-cloudwatch-alarm-phone-call-alerts-tr&mt=8) / [Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid))
- En az bir mevcut CloudWatch alarmı
- On dakika

Sizin tarafınızda gelen trafiği kabul etmesi gereken hiçbir şey yok. Giden isteği EventBridge yapar.

## Adım 1 — Çalan bir kanal oluşturun

Echobell'de bir kanal oluşturun ve bildirim türünü **Arama** yapın. Arama kanalı bir bildirim gibi değil, gelen çağrı gibi davranır, böylece iOS Odak modunu ve Rahatsız Etmeyin'i aşar.

3. adımdaki transformer `alarm`, `state`, `reason`, `region` ve `link` alanlarıyla düz bir gövde gönderir, dolayısıyla şablonlar kısa kalır:

```
Başlık: {{state}}: {{alarm}}
Gövde: {{reason}}
```

Gelişmiş ayarlarda **bağlantı şablonunu** ayarlayın ki bildirime dokununca alarm konsolda açılsın:

```
{{link}}
```

Kanalın webhook URL'sini kanal ayrıntı ekranından kopyalayın:

```
https://hook.echobell.one/t/<channel-token>
```

## Adım 2 — Connection ve API destination oluşturun

EventBridge dış HTTPS uç noktalarını, kimlik doğrulamayı taşıyan bir **connection** gerektiren **API destination** üzerinden çağırır. Echobell URL'deki gizli belirteçle doğrulama yapar, yani connection bir formalitedir — ama EventBridge onsuz destination oluşturmaz.

1. **EventBridge → Integration → API destinations → Connections → Create connection** yolunu izleyin
2. **Name**: `echobell`
3. **Authorization type**: **API key**
4. **API key name**: `x-source`, **Value**: `eventbridge`
5. Oluşturun, sonra **API destinations → Create API destination** bölümüne gidin
6. **Name**: `echobell-calling`
7. **API destination endpoint**: 1. adımdaki Echobell kanal URL'niz
8. **HTTP method**: `POST`
9. **Invocation rate limit**: saniyede `1` fazlasıyla yeter ve emniyet supabı görevi görür
10. **Connection**: `echobell`

API key başlığı her istekle gönderilir. Belirtecin önünde ikinci bir kapı istiyorsanız bunu bir Echobell kanal koşulunda denetleyebilirsiniz:

```
header["x-source"] == "eventbridge"
```

## Adım 3 — Kuralı ve input transformer'ı oluşturun

Alarmlarınızla aynı bölgede **EventBridge → Rules → Create rule** yoluna gidin. Kurallar bölgeseldir; `eu-west-1`'deki bir alarm `us-east-1`'deki bir kurala görünmez.

**default** event bus'ı ve bir **event pattern** kuralı kullanın. Bu desen `ALARM` durumuna geçen her alarmla eşleşir:

```json
{
  "source": ["aws.cloudwatch"],
  "detail-type": ["CloudWatch Alarm State Change"],
  "detail": {
    "state": { "value": ["ALARM"] }
  }
}
```

Hedef olarak **EventBridge API destination** seçin ve `echobell-calling`'i seçin. Konsolun yeni bir execution role oluşturmasına izin verin — bu rol bu destination için `events:InvokeApiDestination` yetkisini verir, başka hiçbir şeyi değil.

Sonra **Additional settings → Configure target input → Input transformer** bölümünü açın:

**Input path**

```json
{
  "alarm": "$.detail.alarmName",
  "state": "$.detail.state.value",
  "reason": "$.detail.state.reason",
  "region": "$.region",
  "time": "$.time"
}
```

**Template**

```json
{
  "alarm": "<alarm>",
  "state": "<state>",
  "reason": "<reason>",
  "region": "<region>",
  "time": "<time>",
  "link": "https://console.aws.amazon.com/cloudwatch/home?region=<region>#alarmsV2:alarm/<alarm>"
}
```

EventBridge sonucu `application/json` olarak gönderir; Echobell'in `{{alarm}}` ve `{{state}}` değerlerini doğrudan okuyabilmesini sağlayan da budur.

## Adım 4 — Olayın gerçekte nasıl göründüğünü bilin

Input path, CloudWatch'un yayımladığı olaydan okur. Kısaltılmış hâli şöyle:

```json
{
  "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" }
  }
}
```

Şablonu düzenlemeden önce bilmeye değer şeyler:

- **Alarm `detail` altındadır.** `$.alarmName` hiçbir şeyle eşleşmez; `$.detail.alarmName` eşleşir.
- **`state.reason` üretilmiş bir metindir.** Datapoint'i ve eşiği söyler; gece 3'te duymak isteyeceğiniz tam olarak budur.
- **Alarm adları olduğu gibi eklenir.** Alarm adı ya da reason içindeki çift tırnak, transformer'ın ürettiği JSON'u bozar. Alarm adlarında yalnızca harf, rakam, tire ve alt çizgi kullanın — zaten iyi bir pratik — yoksa arama 400 hatasıyla başarısız olur.
- **Bağlantı düz bir ad ister.** Boşluk ya da `#` içeren bir ad doğru şekilde doğrudan bağlanmaz; konsol araması yine de bulur.

## Adım 5 — Aramayı hak edene kadar filtreleyin

Her `ALARM` için çalan bir alarm kanalı, onu görmezden gelmeyi kendinize öğretmenin en hızlı yoludur. İki yerde filtreleyin.

**EventBridge deseninde**, herhangi bir şey gönderilmeden önce çalışır:

| Amaç | Desen değişikliği |
| --- | --- |
| Yalnızca üretim alarmları | `detail` içinde `"alarmName": [{ "prefix": "prod-" }]` |
| Acil olmadığı işaretlenenleri atla | Adlarını `warn-…` yapın ve `"alarmName": [{ "anything-but": { "prefix": "warn-" } }]` kullanın |
| Yalnızca belirli alarmlar | `"alarmName": ["prod-api-5xx", "prod-db-cpu"]` |
| Yalnızca gerçek alarmlar, test durumları değil | `"state": { "value": ["ALARM"] }` değerini koruyun — bir `INSUFFICIENT_DATA` olayı asla eşleşmez |
| Yalnızca tek hesap ya da bölge | En üst düzeye `"account": ["123456789012"]` veya `"region": ["us-east-1"]` ekleyin |

**Echobell'de**, desenin ifade edemediği şeyler için, örneğin bir saat penceresi için kanal koşulu kullanın:

```
state == "ALARM" && (hour >= 17 || hour < 9)
```

Echobell'in zaman değişkenleri UTC'dir, dolayısıyla önce kendi saat diliminizden çevirin. [Koşul referansı](/tr/docs/conditions) tam değişken listesini içerir.

## Adım 6 — Düzelmelere daha sessiz bir kapı açın

`"value": ["OK"]` ile ikinci bir kural, sorunun geçtiğini çalmadan haber verebilir. **Zamana Duyarlı (Time Sensitive)** (ya da normal) türünde ikinci bir Echobell kanalı, ona işaret eden ikinci bir API destination oluşturun ve aynı input transformer'ı yeniden kullanın. `{{state}}: {{alarm}}` başlık şablonu zaten "OK: prod-api-5xx" olarak okunur.

| Kural | Durum | Kanal türü | Davranış |
| --- | --- | --- | --- |
| `alarms-to-call` | `ALARM`, `prod-` öneki | Arama | Odak modunu delip çalar |
| `alarms-warn` | `ALARM`, `warn-` öneki | Zamana Duyarlı | Kilit ekranı, çalma yok |
| `alarms-recovered` | `OK` | Normal | Sıradan bildirim |

## Güvenmeden önce test edin

Üretimin bozulmasını beklemeyin. Bir alarmı istediğiniz duruma zorlayın:

```bash
aws cloudwatch set-alarm-state \
  --alarm-name prod-api-5xx \
  --state-value ALARM \
  --state-reason "Manual test of the Echobell path"
```

Alarm bir sonraki değerlendirmede gerçek durumuna döner, ama durum değişikliği olayı gerçektir ve kuralınızdan geçer. Yalnızca Echobell tarafını test etmek için kanalı doğrudan tetikleyin:

```bash
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/"}'
```

`curl` çalıyor ama alarm testi çalmıyorsa sorun kuralda, transformer'da ya da destination'dadır — kanalda değil.

## Peki ya SNS ve e-postadan aramaya?

Her yerde zaten bir SNS topic'iniz varsa ve EventBridge'e dokunmak istemiyorsanız iki yol daha var:

- **SNS → Lambda → webhook.** Birkaç satır kod `Message`'ı ayrıştırır, sonra aynı Echobell URL'sine düz bir gövde POST eder. Çalışır, ama artık bir fonksiyonun, bir rolün ve onun günlüklerinin sahibisiniz.
- **SNS → e-posta → Echobell e-posta tetikleyicisi.** Kanalın [e-posta tetikleyici adresini](/tr/docs/email-trigger) topic'e abone edin. Alarm e-posta olarak gelir ve şablonlarınızdaki `{{subject}}` ile `{{text}}` bildirime dönüşür. Hepsi arasında en az yapılandırma budur; yalnız SNS e-posta aboneliklerinin tek seferlik bir onay tıklaması gerektirdiğini ve metnin yeniden biçimlendirilmediğini unutmayın.

Echobell webhook URL'sini bir HTTPS uç noktası olarak doğrudan topic'e abone etmek kaçınılması gereken yoldur: onay isteği bir bildirim olarak gelir ve sonraki her alarm yukarıda anlatılan uzun zarf olur.

## Olay anında önemli olan sınırlar

- **1 MiB gövde.** Echobell, 1 MiB'ı aşan tetikleyici gövdelerini HTTP 413 ile reddeder. Dönüştürülmüş bir alarm birkaç yüz bayttır, bu yüzden burada buna rastlamazsınız.
- **Belirteç başına dakikada 120 istek.** Bunun üstünde tetikleyici `429` ile `RATE_LIMIT_EXCEEDED` ve bir `Retry-After` döndürür. Destination'ın saniyede 1 sınırı sizi bunun altında tutar ve EventBridge iletemediği olayları yeniden dener.
- **1500 bayt bildirim gövdesi.** Daha uzun çıktılar kırpılır. `state.reason` bir iki cümledir ve sığar.

## Bu kurulumun vermediği şeyler

- **Onay yok.** Aramayı açmanız CloudWatch'a hiçbir şey söylemez ve diğer aboneleri susturmaz.
- **Yükseltme ya da dizilim yok.** Kanala abone olan herkes aranır; sıradaki kimse aranmaz.
- **Alarmın ötesinde tekilleştirme yok.** Birkaç dakikada bir `OK → ALARM` geçişi yapan kararsız bir alarm her seferinde çalar. Bunu daha uzun değerlendirme dönemleriyle ya da alarmın kendisindeki `DatapointsToAlarm` ile çözün.
- **Çift yönlü eşitleme yok.** Nedeni düzeltmek telefonunuzda hiçbir şeyi temizlemez.

Bunlar sizin için kırmızı çizgiyse eksiksiz bir nöbet platformu istiyorsunuz. İhtiyacınız "üretim alarmı tetiklendiğinde beni ara" ise bu, bir avuç konsol ekranından ibaret.

## Sorun giderme

**Alarm tetiklendi ama hiçbir şey gelmedi.** Kuralın **Monitoring** sekmesini açın: `Invocations` desenin eşleşip eşleşmediğini, `FailedInvocations` iletimin başarısız olup olmadığını gösterir. Alarmdan farklı bir bölgedeki kural asla eşleşmez.

**Kural eşleşiyor ama arama 400 ile başarısız oluyor.** Transformer geçersiz JSON üretti. Alarm adında ya da reason içinde tırnak veya ters eğik çizgi arayın.

**Bildirim boş.** Şablon, transformer'ın göndermediği bir alanı okuyor. Gövde düzdür: `{{detail.alarmName}}` değil, `{{alarm}}`.

**Tek bir alarm için tekrar tekrar çalıyor.** Alarm kararsız. Değerlendirme dönemini uzatın ya da daha fazla datapoint isteyin; bu bir CloudWatch ayarıdır, Echobell'inki değil.

**Beklemediğiniz bir alarm için çalıyor.** Desende eksik bir `prefix` filtresi olup olmadığına bakın ve bileşik alarmların ile diğer araçların oluşturduğu alarmların (örneğin Auto Scaling politikaları) da durum değişikliği yaydığını unutmayın.

## Sık sorulan sorular

### CloudWatch doğrudan bir telefon numarasını arayabilir mi?

Hayır. CloudWatch alarm eylemleri SNS bildirimleri, Auto Scaling, EC2 eylemleri ve Systems Manager'dır. Sesli arama harici bir servis gerektirir: bir sağlayıcı üzerinden arayan bir Lambda, bir nöbet platformu ya da Echobell gibi bir arama webhook'u.

### Bir SNS topic'ine ihtiyacım var mı?

Hayır. CloudWatch, alarmın herhangi bir eylemi olsun olmasın alarm durum değişikliği olaylarını EventBridge'e kendisi yayar. Alarmın eylem listesini boş bırakabilirsiniz.

### CloudWatch alarmı Rahatsız Etmeyin'i aşar mı?

Yalnızca arama tarzı bir uyarı olarak geldiğinde. Arama türündeki bir Echobell kanalı gelen çağrı gibi davranır ve iOS Odak ile Rahatsız Etmeyin bunu geçirir. SMS ya da sıradan bildirim geçmez.

### Webhook URL'sini neden doğrudan SNS'e abone etmeyeyim?

SNS, alarmı `Message` dizesinin içine serileştirilmiş hâlde `text/plain` olarak gönderir; bu yüzden şablon tek tek alanları okuyamaz ve zarf kırpılacak kadar uzundur. SNS ayrıca önce bir abonelik onayı gönderir ve o bildirim olarak gelir.

### Bunun AWS'de maliyeti var mı?

Alarm durum değişikliği olayları default event bus'a ücretsiz ulaşır; API destination çağrıları istek başına faturalandırılır. Sağlıklı bir alarm kümesinin hacminde bu ihmal edilebilir bir tutardır, ama bölgeniz için güncel EventBridge fiyatlarına bakın.

### Farklı alarmlar için farklı kişileri arayabilir miyim?

Evet. Hedef kitle başına bir kanal, kanal başına bir kural oluşturun ve herkes istediği bildirim türüyle abone olsun. Onay mekanizması olmadığı için "arama" ile abone olan herkes aranır.

### Peki birden çok bölge ya da hesaptaki alarmlar?

Kurallar bölge başınadır; kullandığınız her bölgede kuralı oluşturun (aynı API destination tanımı bölge başına tekrarlanır). Birden çok hesap için olayları tek bir hesaptaki merkezi bir bus'a gönderin ve kuralı orada oluşturun.

## Özet

Yol beş parçadan oluşuyor: bir arama kanalı, ona işaret eden bir connection ve API destination, yalnızca birini uyandırmaya değen alarmlarla eşleşen bir kural, olayı düzleştiren bir input transformer ve herhangi birine güvenmeden önce zorlanmış bir `set-alarm-state` testi. Buradaki geri kalan her şey, bir ay sonra o zilin hâlâ bir anlam taşıması için kurulumu yeterince dar tutmakla ilgili.

[Echobell'i iPhone için indirin](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-cloudwatch-alarm-phone-call-alerts-tr&mt=8) ya da [Google Play'den edinin](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), sonra `set-alarm-state` testini çalıştırın.

## İlgili yazılar

- [Kanal koşulları referansı](/tr/docs/conditions)
- [Webhook entegrasyonu rehberi](/tr/docs/webhook)
- [E-posta tetikleyici rehberi](/tr/docs/email-trigger)
- [Sentry telefon uyarıları](/tr/blog/sentry-phone-call-alerts)
- [API kesintileri için telefon uyarıları](/tr/blog/phone-call-alerts-api-downtime)
- [Geliştiriciler için uyarı yorgunluğu rehberi](/tr/blog/fix-alert-fatigue-developer-guide)
- [Kritik uyarılar için iOS Odak modunu aşmak](/tr/blog/how-to-bypass-ios-focus-mode-for-critical-alerts)
