AWS CloudWatch Logs İnceleme & Node.JS Entegrasyon
AMAZON CLOUDWATCH NEDİR?
AWS ortamımızda oluşturulmuş verileri toplamak, depolamak, izlemek ve analiz etmek için kullanılmaktadır. AWS kaynaklarımızın durumunu, performansını izleyip bunları yönetmemizi sağlar.
CLOUDWATCH LOGS
AWS CloudWatch hizmetinin bir parçasıdır. AWS kaynaklarımızın oluşturduğu verileri saklamak ve yönetmek için kullanılır. Bu verileri gerçek zamanlı olarak izleyebilir, sorgulayabilir, analiz edebiliriz. Özel metrikler oluşturabilir, otomatik uyarılar alabiliriz. Yani kısaca uygulamalarımız, sistemlerimiz ve hizmetlerimiz tarafından üretilen logları izler, depolar ve yönetiriz.
EC2 INSTANCE SUNUCU OLUŞTURMA
AWS EC2 instance için cloudwatch logs entegrasyonu yaparak ec2 örneğimizden üretilen logların cloudwatch logs ekranından görüntülenmesini sağlayacağız bu logları ise örnek olarak yazmış olduğum nodejs uygulamasından alacağız. Şimdi yapacağımız adımları madde madde yazalım.
- IAM Rolü Oluşturma
- EC2 Instance oluşturacağız ve IAM rolümüzü ilişkilendireceğiz.
- EC2 örneğimize yani sunucumuza bağlantı kurarak cloudwatch logs yapılandırması için gerekli ayarları yapacağız. Bu konfigürasyonlar sonrası loglarımız cloudwatch logs ekranında izlenebilir olacaktır.
Şimdi bu adımları detaylıca uygulayarak ilerleyelim.
İlk öncelikle bize bir ec2 instance lazım aslında bir linux sunucu oluşturacağız sanal olarak. AWS management console ekranımıza giderek buradan instances kısmından launch instance dememiz gerekiyor.

Burada benim daha önceden oluşturmuş olduğum bir instance yer alıyor. Sağ üstten ise launch instances diyerek yeni bir tane oluşturabiliyoruz. Daha sonrasında karşınıza çıkan ekranda bir name giriyorsunuz, sunucunuzun işletim sisteminizi seçiyorsunuz ki ben linux ubuntu tercih ediyorum. Sonrasında ise bir keypair üretme ekranına yönlendiriyor sizi zorunlu olarak burada ssh veya putty ile sunucunuza uzaktan bağlantı kurmak amacıyla keypair üretimi için gerekli seçimleri yapıyoruz. Ben bu ekranda ssh ile bağlantı kuracağım için pem ve rsa seçeneklerini seçiyorum ve bana keypair dosyamı üretip veriyor. Daha sonrasında bu aşamada gerekli ekstra ayarları da yapabilirsiniz ancak şimdilik launch instance diyerek oluşturmasını sağlayabilirsiniz.
Bu aşamalardan sonra oluşan sunucumuzu yukarıdaki görselde olduğu gibi görüntüleyebiliyoruz. Şimdi buna bağlantı kuralım. İndirdiğim keypair dosyamın yüklü olduğu dizine girip gerekli chmod iznini verip ardından ssh ile erişim sağlıyorum. Tabii bu aşamaları görebilmek için yukarıdaki görselde instance’ınıza sağ tık yapıp connect diyerek gerekli bilgileri elde edebilirsiniz.

Bana ssh client ile nasıl bağlanacağımı burada açıklıyor.


ve sunucuma login oldum. Buradan sonra ben basitçe bir nodejs uygulaması yayınlayacağım için sunucuya aşağıda gösterdiğim şekilde sırasıyla komutları uygulayarak gerekli kurulumları yaptım.

Komut geçmişimden görebilirsiniz. Öncelikle sisteme curl kurdum sonrasında nodejs’i çektim. Sonrasında githubdan repomu klonlayarak ilgili dizine girip npm i ile gerekli paketleri kurup node index.js ile sunucumu başlattım.

Nodejs uygulamam ilgili sunucumun 5001 portu üzerinden yayınlanmaya başladı. Buraya kadar yaptığım tek şey bir sunucu oluşturup uygulamamı deploy etmekti bu aşamadan sonra cloudwatch logs entegrasyonuna geçebiliriz.
Tabii bu uygulamanın bu port üzerinden erişime açılması için de instance için security tarafında inbound rulesların tanımlanması gerekiyor unutmayın.

Ben ssh için 22 ve uygulamamın çalışması için 5001 portlarına gerekli kuralları oluşturdum.
EC2 INSTANCE CLOUDWATCH LOGS ENTEGRASYONU
İlk öncelikle bir IAM rolü oluşturmamız gerekmektedir.
https://console.aws.amazon.com/iam/
Bu bağlantıya giriyoruz ve create role diyoruz.



Sırasıyla yukarıdaki adımları uyguluyoruz. Roles bölümünden create role diyoruz. AWS service ve EC2 seçiyoruz. Sonrasında sunucumuzda CloudWatch kullanabilmek için ilgili politikayı seçip next diyoruz. En son aşamada tag ve role name bilgileri tanımlayıp create role diyoruz.

Aws service ec2 için TestRole şeklinde tanımlamamı yaptım.
Sonrasında bu rolü ec2 instanceım ile ilişkilendirmem gerekiyor. Instanceımı seçip actions - security - modify IAM role diyerek bu ekranda oluşturduğum rolü seçip update ediyorum.

IAM role olarak eklendiğini görebiliyoruz.
Bu şekilde IAM rolümüzü ec2 örneğimizle ilişkilendirdikten, gerekli politika ve izinleri verdikten sonra artık sunucu tarafındaki yapılandırmayı gerçekleştirebiliriz.

amazon-cloudwacth-agent deb dosyasını sistemime çekiyorum.


opt dizini altında bir app.log dosyası oluşturup içerisine basitçe bir text yarattım.
Şimdi ise aws dizini içerisine girip burada bir config.json oluşturacağız.

nano ile config.json dosyası oluşturup içerisine config bilgilerimizi ekliyoruz.

Config bilgilerine buradan erişebilir kendinize göre düzenleyebilirsiniz. https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html#CloudWatch-Agent-Configuration-File-Complete-Example


Ben bu şekilde düzenlemelerimi yaptım.


Yazdığım komut: sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
CLOUDWATCH PANELİ ÜZERİNDEN LOGLARI İNCELEME
AWS servislerinden cloudwatch seçerek panelimize giriyoruz.

Gördüğünüz gibi bir adet app.log grubumuz bizim configde belirttiğimiz şekilde oluşmuş.

İçerisine girdiğimiz zaman ise app.log adında log stream oluştuğunu ve bunun hangi date de oluştuğunu da görebiliyoruz. Burada log group, log stream değerlerini config.json dosyamızda bu şekilde isimlendirmiştik.
Bu stream içerisine girersekte log eventlarımızı görebiliyor olacağız.

test log yazmıştık hatırlarsanız. Bu ekranda çeşitli filtreler yapabiliriz. Son 1 dakika, 30 dakika, 1 saat, 12 saat veya custom aralıklar belirleyerek logları inceleyebiliyoruz.
LOG INSIGTHS

Burada log insights alanında çeşitli queryler çalıştırarak log groupları üzerinde filtrelemeler yapabilirsiniz. Örneğin buradaki sorguda hangi alanların getirileceği, neye göre sortlama yapılacağı kaç kaydın getirileceği gibi filtrelerle sorgulama yapıp log eventlarına erişebiliriz.

@logstream fieldı üzerinden ilgili log kaydının detayına gidebiliriz. Yine bu noktada çeşitli şekillerde export alabiliriz örneğin json olarak.


query helpden sorgular hakkında detaylı bilgiler alabilirsiniz.
NODEJS CLOUDWATCH LOGS ENTEGRASYONU

Öncelikle yeni bir log group oluşturdum ismi “NODE_APP” ve buna bağlı olarakta bir log stream oluşturdum.

Daha sonrasında nodejs uygulamamda loglarımı bu grup ve stream’a gönderebilmek için gerekli kodlarımı yazdım.

Öncelikle aws-sdk paketini dahil ediyorum. Daha sonrasında log gönderimini simüle etmek için logs adında bir endpoint yazdım bu endpoint’e her girişte log gönderecektir.

Burada log mesajlarımı göndermek için bir fonksiyon yazdım ve bu fonksiyon az önce oluşturmuş olduğum log group name, log stream name değerleri ve log mesajımı alıyor. Fonksiyon bu parametreleri alarak putLogevents metoduyla gönderim işlemini sağlıyor.



Gelen tüm istekleri bir middleware yardımıyla log’a düşürebiliriz.


Bu çok basit bir log gönderim uygulamasıdır. Bunu uygulamamıza göre geliştirip kullanabiliriz. Hatta winston gibi bir log kütüphanesi kullanıyorsak “winston-cloudwatch” şeklinde bir npm paketi dahi bulunmaktadır.
LOG VERİLERİYLE ALARM OLUŞTURMA VE MAİL GÖNDERME
Bunun için log grubumu seçip metric filters alanına girip create metric filter diyorum.


burada filter pattern olarak “test” yazdım log mesajlarımın içerisinde test geçiyorsa şeklinde bir filtreleme yapmış oldum.

metric namespace girerek uygulama loglarımızı bu isme göre gruplandırabiliriz. Metric name ise belirli metricleri isimlendirir. Value değeri ile de belirli bir zaman diliminde eşleşen log sayısını bir değer olarak temsil edebiliriz. Bu bilgileri girip create metric filter diyoruz.

Sonrasında bu metric filter’ı check edip create alarm diyoruz.

Burada statistic değeri metricin nasıl değerlendirileceğini belirleyen istatistiksel bir değerdir. Burada alarmın eşik değeri toplam değeri geçerse alarmı tetikletmek isteyebiliriz.

Eşik türünü static olarak seçtiğimizde o eşik türünün altına düştüğünde veya üzerine çıktığında alarmı tetikletebiliriz. Anomaly detection ise CloudWatch tarafından otomatik olarak eşik değerlerini belirleyerek anomali tespiti yapar. En sonda yazdığımız value ise alarmın eşik değerini belirler.

Burada notification alanı geliyor. In alarm seçeneği ile belirlenen eşik ve koşulların dışına çıkıldığında tetiklenir. Create new topic ile de bildirim için bir konu belirliyoruz ve bu bildirimin hangi mail adreslerine gönderileceğini seçiyoruz.

Oluşturduğumuz alarm_test notificationını seçiyoruz. Sonra next diyoruz bir alarm ismi giriyoruz ve tekrar next ve en sonda create alarm diyoruz.

Şimdi app.log dosyamıza loglar düşürelim.


iki adet “test” içeren log geldiğinde alarmım çalıştı. Çünkü metric filterımda log mesajı olarak test gelirse alarma düşmesini istemiştim ve eşik değerimde 1 idi.

related logsdan logun detayına gidebiliyorum.

test filtresine göre bulduğu mesajları bize getiriyor.

ve mail adresime de bu alarmla alakalı bilgilendirme gelmiş görünüyor.
LOGINSIGHTS FİLTRELER VE DASHBOARD’A EKLEME

app.log grubumda mesaj alanı içinde test geçen logları filtreledim.



Artık dashboard alanıma gittiğimde custom dashboardlarımda testdashboard yer alacak ve app.log içerisinde test mesajı geçen logları buradan takip edebileceğim.


Bu sorguda da diğer log grubum içerisinde bir filtre çalıştırdım ayrıca arama sonucunda mesaj alanında GET kelimesinin varlığı koşulunu da ekledim. Burada gelen loglar içerisinde GET içerenleri 1 ile tanımlamaktadır.
FİYATLANDIRMA

https://aws.amazon.com/tr/cloudwatch/faqs/
Yine burada CloudWatch Logs Insights için kullandıkça ödeme temelinde ücretlendirildiğini açıklıyor.
Detaylar: https://aws.amazon.com/tr/cloudwatch/pricing/