Article Image
Article Image
read

AWS Lambda ile yaşamınızı (daha doğrusu şirketteki yaşamınızı) tamamen otomatik hale getirmek ve kendi sanal ordunuza bu tür işleri yaptırmak istiyorsanız büyük olasılıkla yolunuz AWS Lambda fonksiyonlarına bir şekilde düşecektir.

Bugün, AWS Lambda‘da yapabileceğimiz en basit işlemlerden birisi olan, otomatik olarak bir adrese mail göndermekten bahsedeceğim.

Anlatırken amaçsız bir şekilde bir yerlere mail göndermek yerine; kurguladığım bir senaryoyu hayata geçirip, bu senaryonun sonuçlarını Lambda üzerinden istediğimiz mail adresine gönderen bir fonksiyondan bahsedeceğim.

AWS Lambda ile mail, sms, mobil notification vb. uyarılar da gönderebiliriz. Fakat bugün sadece mail servisini (SES) kullanacağız.

AWS Simple Email Service

Mail Adresinizi Doğrulayın !!!

Simple Email Services’in (bundan sonra kısaca SES olarak yazacağım) nasıl çalıştığını anlamak çok önemlidir. Mailleri herhangi bir mail adresine rastgele gönderemezsiniz.(Not: Böyle bir şey yapmak istiyorsanız Twilio benzeri bir servis kullanabilirsiniz.) SES‘e bir mail adresini kayıt etmek için AWS SES Email Addresses bölümüne girip doğrulamak için yine bu adrese gönderilen doğrulama linkine tıklayarak adresinizi kayıt edebilirsiniz.

E-mail Confirmation

Unutmayın !!

AWS SES sadece belirli bölgelerde hizmet vermektedir. Eğer sizin (yada şirketinizin) kullandığı AWS farklı bölgede ise ilk olarak bölgenizi SES için değiştirmelisiniz.

Lambda fonksiyonunuza SES‘i kullanabilmesi için izin verin!

Mail göndermek için lambda fonksiyonunuzun varsayılan yöntemlerle SES‘i kullanamayacagını unutmayın. Bunun için AWS IAM Roles‘te uygun bir rol oluşturmamız gerekiyor.

AWS IAM Roles Nedir?

AWS Identity and Access Management (kısaca IAM) AWS kaynaklarına erişimi güvenli bir şekilde kontrol etmenize yardımcı olan bir web hizmetidir.

Roles AWS ile iletişim kuran sistemimizde tanımlı bir servisi ifade eder. IAM Roles‘in ilk amacı, servislerimizin API üzerinden diğer AWS servileri ile konuşmalarını sağlayabilmektir. Bir role sahip bir kullanıcı o rolün izin verdiği tüm işlemleri yapabilir. (aynı şekilde role sahip herhangi bir servis)

AWS IAM Roles bölümüne girin. Buradan Create New Role ile yeni bir role oluşturun. Daha sonra oluşturduğunuz role’e tıklayarak permission kısmından var olan policy’imize JSON formatında SES izinlerini verelim. İzin vermek istediğimiz servisleri action kısmına yazdığımızdan emin olalım. Aşağıda action’un son iki satırı SES için verdiğimiz izinleri ifade ediyor.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*"
        }
    ]
}

Node.js Scriptimizi Yazalım

Ardından tek yapmamız gereken Lambda fonksiyonunu yazmak. Aşağıda yazmış olduğum fonksiyonu açıklayarak devam edelim.

'use strict'

var MongoClient = require('mongodb').MongoClient;
var async = require("async");
var ses = new aws.SES({
   region: 'us-west-2'
});

let database_uri;

exports.handler = (event, context, callback) => {
  database_uri = process.env["DATABASE_URI"]
	processEvent(event, context, callback);
}

function processEvent(event, context, callback) {
	var req = JSON.parse(JSON.stringify(event));
	console.log("request: " + JSON.stringify(req));

	context.callbackWaitsForEmptyEventLoop = false;
	
	var connection_uri = database_uri;
	

	console.log('=> connecting to database');
	console.log(connection_uri);

	MongoClient.connect(connection_uri, function (err, db) {
		console.dir(err);
		console.log("connected to database");
		return mainFunction(db, req, callback);
	});
}

function mainFunction(db, req, callback) {
		async.waterfall([
			findOldUsers(db),
			updateUsers(db),
      sendMail()
		], function (err, res) {			
			callback(null, "successful to all function");	
		});
}

function findOldUsers(db) {
	return function(cb){
		db.collection("user").find({"isOld":true}).toArray(cb);
	}
}

function updateUsers(db) {
	return function(old_users, cb) {
		var q = { _id: { "$in": old_users}};
		var updateQ = { $set: { isOld: false} };
		db.collection("user").update(q, updateQ, {multi: 1}, function (err, res) {
			if(err) console.log("error: users update failed");
			else    console.log("successful: all users update");
			cb(err, users);
	});
	}
}

function sendMail() {

	return function(users, err, cb){
    var eParams = {
        Destination: {
            ToAddresses: ["[email protected]"]
        },
        Message: {
            Body: {
                Text: {
                    Data: if(!err) users else err
                }
            },
            Subject: {
                Data: "Update User status!!!"
            }
        },
        Source: "[email protected]"
    };
    console.log('===SENDING EMAIL===');
        var email = ses.sendEmail(eParams, function(err, data){
        if(err) console.log(err);
        else {
            console.log("===EMAIL SENT===");
            console.log(data);


            console.log("EMAIL CODE END");
            console.log('EMAIL: ', email);
            context.succeed(event);

        }
        cb(err)
    });
	}
}

Öncelikle lambda fonksiyonumuzda bilmediğiniz kısımlar olabilir. (asenkron programlama gibi) Fakat burada özellikle anlattığım SES olduğundan sadece mail kısmını anlamanız sizin için yeterlidir.

Lambda fonksiyonumuz kabaca database’deki eski user olarak işaretlenmiş kullanıcıları bulup o kullanıcıların işaretlerini kaldırıyor. Daha sonra başarılı/başarısız duruma göre mail gönderiyor.

İlk kısımda envoriment değişkeninden aldığı değişken ile database adresine bağlanmaya çalışıyor. Daha sonra bizim ana fonksiyonumuz çağrılıyor. Bu fonksiyon async.waterfall (şelale olarak adlandırılan) bir yapıyı kullanıyor. Burada şelalemizin içindeki tüm fonksiyonlar database’e gittiğinden hangisinin erken cevap vereceğini bilemiyoruz.(async olmasından dolayı) Bu yüzden waterfall kullanarak fonksiyonlar, üstünde kalan fonksiyonların işleri bittikten sonra işlemlere başlıyor.

Ardından mail gönderme işini yapan fonksiyonumuz çalışıyor. Bunun için ilk olarak mail formatımızı bir değişkene atıyoruz. Bu format AWS‘nin SES için kullandığı format. Daha sonra import ettiğimiz SES objesinin sendEmail methoduna formatımızı vererek gönderiyoruz. Ardından mail servisinden gelen onay durumuna göre gönderdiğimiz mail’i console’a yazıyoruz. Eğer başarılı bir sonuç almışsak mail’in gittiğinden emin olabiliriz.

Eğer anlamadığınız bir yer var ise alt kısımdaki disqus’a yorum yapabilirsiniz.

İçerikte herhangi bir eksiklik veyahut yanlış olduğunu düşündüğünüz bir kısım var ise mail atmaktan çekinmeyin.

Blog Logo

Abdullah Velioglu


Published

Image

A Snowball Effect

A Personal Blog For Abdullah

Back to Overview