AWS CloudWatch, EventBridge ve CDK ile Merkezi Uyarı Sistemi Kurulumu
AWS Organizasyonlarında Merkezi Uyarı Sistemi Nasıl Kurulur?
AWS Control Tower veya Landing Zone gibi yapılarla yönetilen çoklu hesap ortamlarında, her bir hesapta oluşan alarmları tek tek kontrol etmek operasyonel bir kabustur. Bu yazıda, AWS CloudWatch, EventBridge ve Lambda kullanarak tüm organizasyonunuzdaki alarmları tek bir "Gözlem Hesabı"nda (Observability Account) toplayan merkezi bir uyarı sistemini nasıl kuracağınızı anlatacağız.
Neden Merkezi Uyarı Sistemi?
Birden fazla AWS hesabınız varsa (örneğin: Prod, Staging, Dev), her birine giriş yapıp CloudWatch panellerini kontrol etmek sürdürülebilir değildir. Merkezi bir yapı şunları sağlar:
- Tek Noktadan Yönetim: Tüm alarmları tek bir yerden izleyebilirsiniz.
- Standartlaştırma: Tüm ekipler için ortak bildirim kanalları (Slack, Discord, Microsoft Teams) kullanabilirsiniz.
- Otomasyon: Alarmlara otomatik tepkiler verebilirsiniz.
Mimari Genel Bakış
Sistem üç ana bileşenden oluşur:
- Uygulama Hesapları (Member Accounts): CloudWatch alarmlarının oluştuğu hesaplar. Burada oluşan alarmlar (Alarm State Change), EventBridge aracılığıyla merkezi hesaba yönlendirilir.
- Yönetim Hesabı (Management Account): Tüm uygulama hesaplarına gerekli EventBridge kurallarını (Rule) dağıtmak için CloudFormation StackSet'leri kullanır.
- Gözlem Hesabı (Observability Account): Tüm alarmların toplandığı yer. Burada özel bir EventBus, gelen olayları karşılar ve bir Lambda fonksiyonunu tetikleyerek bildirim gönderir.

Adım Adım Kurulum (CDK ile)
Bu kurulumu AWS Cloud Development Kit (CDK) kullanarak TypeScript ile gerçekleştireceğiz.
1. Gözlem Hesabı Kurulumu
İlk olarak, alarmları karşılayacak olan merkezi hesabı yapılandıralım. Bu hesapta özel bir EventBus ve olayları işleyecek bir Lambda fonksiyonu oluşturacağız.
// lib/observability-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as events from 'aws-cdk-lib/aws-events';
import * as targets from 'aws-cdk-lib/aws-events-targets';
import * as lambda from 'aws-cdk-lib/aws-lambda';
export class ObservabilityStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 1. Merkezi EventBus oluştur
const centralBus = new events.EventBus(this, 'CentralAlertingBus', {
eventBusName: 'central-alerting-bus',
});
// 2. Diğer hesaplardan gelen olaylara izin ver (Resource Policy)
// Not: Gerçek senaryoda OrganizationId ile kısıtlayın
centralBus.addToResourcePolicy(new cdk.iam.PolicyStatement({
sid: 'AllowAllAccounts',
actions: ['events:PutEvents'],
principals: [new cdk.iam.AnyPrincipal()],
resources: [centralBus.eventBusArn],
}));
// 3. Bildirim gönderecek Lambda fonksiyonu
const alertingLambda = new lambda.Function(this, 'AlertingLambda', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda/alerting'),
environment: {
WEBHOOK_URL: 'https://discord.com/api/webhooks/...' // Webhook URL'niz
}
});
// 4. EventBus üzerindeki kural (Rule)
new events.Rule(this, 'CatchAllAlarms', {
eventBus: centralBus,
eventPattern: {
source: ['aws.cloudwatch'],
detailType: ['CloudWatch Alarm State Change'],
},
targets: [new targets.LambdaFunction(alertingLambda)],
});
}
}
2. Uygulama Hesaplarını Yapılandırma (StackSet)
Uygulama hesaplarındaki default EventBus, CloudWatch alarmlarını otomatik olarak yakalar. Bizim yapmamız gereken, bu alarmları merkezi hesaba yönlendirecek bir kural eklemektir. Bunu Yönetim Hesabı üzerinden CfnStackSet kullanarak tüm organizasyona yayabiliriz.
// lib/management-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as cfn from 'aws-cdk-lib/aws-cloudformation';
export class ManagementStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Tüm hesaplara dağıtılacak CloudFormation şablonu
const memberAccountTemplate = `
Resources:
ForwardToCentralRule:
Type: AWS::Events::Rule
Properties:
Name: ForwardToCentralObservability
EventPattern:
source:
- aws.cloudwatch
detail-type:
- "CloudWatch Alarm State Change"
State: ENABLED
Targets:
- Arn: "arn:aws:events:us-east-1:123456789012:event-bus/central-alerting-bus"
Id: "CentralBus"
RoleArn: !GetAtt EventBridgeRole.Arn
EventBridgeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: events.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: PutEventsToCentral
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: events:PutEvents
Resource: "arn:aws:events:us-east-1:123456789012:event-bus/central-alerting-bus"
`;
new cfn.CfnStackSet(this, 'CentralAlertingStackSet', {
stackSetName: 'CentralAlerting-MemberAccounts',
templateBody: memberAccountTemplate,
permissionModel: 'SERVICE_MANAGED', // AWS Organizations kullanıyorsanız
autoDeployment: {
enabled: true,
retainStacksOnAccountRemoval: false,
},
stackInstancesGroup: [{
regions: ['us-east-1'], // Alarmlarınızın olduğu bölge
deploymentTargets: {
organizationalUnitIds: ['ou-xxxx-yyyyyyy'], // Hedef OU ID
},
}],
});
}
}
Test ve Doğrulama
Sistemi test etmek için herhangi bir uygulama hesabında (Member Account) geçici bir alarm oluşturun.
- Alarm Oluştur: CloudWatch konsolundan basit bir CPU alarmı oluşturun.
- Durumu Değiştir: AWS CLI kullanarak alarmı manuel olarak tetikleyin:
aws cloudwatch set-alarm-state --alarm-name "TestAlarm" --state-value ALARM --state-reason "Testing centralized alerting" - Kontrol Et: Gözlem hesabındaki Lambda fonksiyonunun loglarını (CloudWatch Logs) veya Discord/Slack kanalınızı kontrol edin. Bildirimin geldiğini görmelisiniz.
İleri Seviye Özelleştirmeler
Bu temel kurulumu ihtiyaçlarınıza göre geliştirebilirsiniz:
- Dinamik Ciddiyet Seviyeleri: Alarmlara
severity: criticalgibi etiketler (tags) ekleyerek, Lambda içinde bu etiketlere göre farklı kanallara (örn. PagerDuty vs. Slack) bildirim gönderebilirsiniz. - Dinamik Konfigürasyon: SSM Parameter Store kullanarak hangi ekibin hangi alarmlardan sorumlu olduğunu tutabilir ve Lambda fonksiyonunuzun bu konfigürasyona göre yönlendirme yapmasını sağlayabilirsiniz.
Bu yapı sayesinde, organizasyonunuz büyüdükçe monitoring altyapınız da karmaşıklaşmadan ölçeklenebilir kalacaktır.
Daha fazla AWS çözümü için AWS Danışmanlığı ve Kubernetes Danışmanlığı sayfalarımızı ziyaret edebilirsiniz.