İçindekiler
- Olağan SNS yolu neden beceriksiz kalıyor
- Gerekenler
- Adım 1 — Çalan bir kanal oluşturun
- Adım 2 — Connection ve API destination oluşturun
- Adım 3 — Kuralı ve input transformer'ı oluşturun
- Adım 4 — Olayın gerçekte nasıl göründüğünü bilin
- Adım 5 — Aramayı hak edene kadar filtreleyin
- Adım 6 — Düzelmelere daha sessiz bir kapı açın
- Güvenmeden önce test edin
- Peki ya SNS ve e-postadan aramaya?
- Olay anında önemli olan sınırlar
- Bu kurulumun vermediği şeyler
- Sorun giderme
- Sık sorulan sorular
- CloudWatch doğrudan bir telefon numarasını arayabilir mi?
- Bir SNS topic'ine ihtiyacım var mı?
- CloudWatch alarmı Rahatsız Etmeyin'i aşar mı?
- Webhook URL'sini neden doğrudan SNS'e abone etmeyeyim?
- Bunun AWS'de maliyeti var mı?
- Farklı alarmlar için farklı kişileri arayabilir miyim?
- Peki birden çok bölge ya da hesaptaki alarmlar?
- Özet
- İlgili yazılar
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/plainile gönderir ve alarmın kendisi zarfınMessagealanı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 / Google Play)
- 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.
- adımdaki transformer
alarm,state,reason,regionvelinkalanları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.
- EventBridge → Integration → API destinations → Connections → Create connection yolunu izleyin
- Name:
echobell - Authorization type: API key
- API key name:
x-source, Value:eventbridge - Oluşturun, sonra API destinations → Create API destination bölümüne gidin
- Name:
echobell-calling - API destination endpoint: 1. adımdaki Echobell kanal URL'niz
- HTTP method:
POST - Invocation rate limit: saniyede
1fazlasıyla yeter ve emniyet supabı görevi görür - 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:
{
"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
{
"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 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:
{
"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
detailaltındadır.$.alarmNamehiçbir şeyle eşleşmez;$.detail.alarmNameeş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ı 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:
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:
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 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
429ileRATE_LIMIT_EXCEEDEDve birRetry-Afterdö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.reasonbir 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 → ALARMgeçişi yapan kararsız bir alarm her seferinde çalar. Bunu daha uzun değerlendirme dönemleriyle ya da alarmın kendisindekiDatapointsToAlarmile çö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 ya da Google Play'den edinin, sonra set-alarm-state testini çalıştırın.