AWS SAM — AWS Lambda — Middy (Lambda Middleware), Fonksiyonlarınızı güvende tutun
Yeniden herkese selamlar. Bu yazımızda AWS Lambda fonksiyonumuz için gerekli ortam değişkenlerini güvenli bir şekilde saklama ve kullanma yöntemlerinden biri olan Lambda middleware kullanımını AWS Secrets Manager servisi ve Middy kütüphanesini kullanarak inceleyeceğiz.
Motivasyon
- Lambda ortam değişkenlerini fonksiyon tanımında kullanmamak ve böylece bu değişkenleri gizli hale getirmek
- AWS Secrets Manager kullanarak, Lambda fonksiyonlarınızın kullandığı ortam değişkenlerini ortak bir noktadan yönetmek
- Middy kütüphanesini kullanarak Lambda middleware’leri hazırlamak
Neler Gerekli
- AWS hesabı
- SAM CLI
Uygulamaya geçmeden önce gerçekleyeceğimiz mimariyi aşağıdaki şekil yoluyla kısaca bir anlayalım.
API Gateway’den yapılan bir istek, ana fonksiyona girmeden önce Middy ile sarılmış bir fonksiyondan geçerek ilgili ortam değişkenlerini AWS Secrets Manager servisinden alır ve sonrasında ana fonksiyon tetiklenir. İlgili ortam değişkenleriyle birlikte veritabanı ya da diğer kullanacağınız bileşenlere güvenle bir şekilde bağlantı sağlanır.
Burada var olan API Gateway ve Lambda fonksiyonumuzu AWS SAM CLI’ı aracılığıyla oluşturacağız.
AWS Secrets Manager Ayarları ve Gerekli Bilgiler
AWS Secrets Manager servisini kullanarak ortam değişkenlerinizi güvenli bir şekilde saklayın. Burada oluşan Secret ARN (Amazon Resource Name) değerini not edin.
SAM CLI Kullanarak Serverless Uygulama Oluşturma
Bu kısımda aşağıda yer alan AWS SAM CLI komutlarını kullanarak yeni bir uygulama oluşturacağız. AWS SAM ile uygulamalarımızı yaratmak, local ortamda çalıştırmak için Docker kurulumu gerekmektedir. Docker’a sahip değilseniz öncelikle bu kurulumu gerçekleştirebilirsiniz.
$sam init komutunu kullanarak terminalimizde yeni uygulama yaratmaya başlayabilir ve uygulama ayarlarını karşımıza çıkan sorularla birlikte tamamlayabiliriz.
Burada uygulamamın adına secret-app ismi verdim ve dil olarak ise Node.js kullanımını tercih ettim. Yukarıdaki görselde basit bir AWS SAM uygulamasının klasörlemesini görüyorsunuz. Bu bileşenlerden de kısaca bahsedelim:
events.json
- Fonksiyonumuzu tetiklerken kullanabileceğimiz aktiviteleri bu dosya içerisinde belirtiyoruz
hello-world (ana dizin)
- Uygulamamızın ana dosyalarının bulunduğu dizin
app.js
- Fonksiyonumuzun handler’ının bulunduğu ana dosya
template.yaml
- Lambda fonksiyonu ve diğer AWS bileşenleri tanımlarını yapacağımız YAML dosyamız. Bu dosya build anında CloudFormation template’e dönüştürülür ve bu template aracılığıyla deploy işlemi gerçekleşir.
Kolları Sıvayalım ve İşe Koyulalım
Şimdi bu kısımda yukarıda oluşturmuş olduğumuz AWS Secrets Manager’daki Secret’ımızın ARN’ini template.yml dosyası içerisinde fonksiyonumuz için oluşturacağımız Policy kısmına girişini sağlıyoruz. Bu Policy sayesinde Lambda fonksiyonumuz için otomatik olarak yaratılacak olan role ilgili Secret’ı okuması için yetkilendirmiş olacağız.
Hepsi bu kadar :) Artık biraz da kodlama kısmına geçebiliriz.
Middy Kurulumu ve Kullanımı
Middy kurulumu için ilgili Git repository’sine ulaşabilir ve npm aracılığıyla projenize yükleyebilirsiniz.
Kullanımı içinse örnek olarak aşağıdaki script’e bakalım.
Burada öncelikle ana handler fonksiyonumuzu middy fonksiyonu yardımıyla sarmalıyoruz. Daha sonrasında paket olarak yüklediğimiz hazır secretsManager middleware’ini kullanarak ilgili Secret ismini kodda gösterildiği şekilde belirtiyoruz. Bu isimdeki Secret’ı okumamız için gerekli yetkiyi bir üst kısımda template.yml dosyasına girdiğimiz Policy ile açıklamıştık.
Geri kalan kısımda uygulamamız için girdiğimiz Secret’ları, Lambda fonksiyonumuzun “context” bilgisinden isimlendirdiğimiz şekilde alabiliriz. Yukarıdaki kod örneğinde “SECRETS” olduğu için “context.SECRETS” içerisinde uygulamamıza ait ortam değişkenleri tanımları bulunmaktadır.
Bundan sonraki kısımda, mimarimizde bulunan MongoDB’ye güvenli bir şekilde bağlanabiliriz.
Github’ta bir uygulama örneğini de incelemeniz için bırakıyorum.
Uygulamayı local ortamda çalıştırmak için AWS CLI yardımıyla AWS kullanıcınızı konfigüre ettiğinizden emin olun. Sonrasında AWS SAM komutlarını kullanarak çalıştırın.
Sevgiler,