Sitemap
Cloud Türkiye

We write, talk and discuss the cloud.

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

Uygulamaya geçmeden önce gerçekleyeceğimiz mimariyi aşağıdaki şekil yoluyla kısaca bir anlayalım.

Amazon API Gateway, AWS Lambda, Middy lamda middleware
Secure Lambda Functions

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.

AWS Secrets Manager
AWS Secrets Manager

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.

AWS SAM, Serverless Function, AWS Lambda
Sample AWS SAM folder structure

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.

AWS SAM, AWS Lambda function policy
template.yml

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,

--

--

Azmi Mengü
Azmi Mengü

Written by Azmi Mengü

Software Architect, AWS Community Builder

No responses yet