2024-05-21DevOpsN

AWS CloudWatch, EventBridge ve CDK ile Merkezi Uyarı Sistemi Kurulumu

AWSCloudWatchEventBridgeCDKLambdaDevOps
A

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:

  1. 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.
  2. Yönetim Hesabı (Management Account): Tüm uygulama hesaplarına gerekli EventBridge kurallarını (Rule) dağıtmak için CloudFormation StackSet'leri kullanır.
  3. 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.

AWS Merkezi Uyarı Mimarisi Diyagramı

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.

  1. Alarm Oluştur: CloudWatch konsolundan basit bir CPU alarmı oluşturun.
  2. 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"
    
  3. 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: critical gibi 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.