Wprowadzenie
Zaplanowanie zadania to zdarzenia do których dochodzi w regularnych odstępach czasu w oparciu o zestaw reguł. Mogą one być używane do wykonywania funkcji Lambda po określonym przedziale czasowym, który jest zdefiniowany w usłudze CloudWatch. Najpopularniejsze wykorzystanie to tzw. cron jobs o których pisałem bardziej szczegołowo we wpisie dotyczącym jednego z moich projektów: Projekty - ŁapKsiążke.pl. W tym wpisie przygotujemy proste wysyłanie wiadomości e-mail wykorzystując zaplanowanie zadania oraz funkcję Lambda.
Kolejne kroki, które wykonamy w ramach tego wpisu:
- weryfikacja adresu e-mail przy pomocy usługi AWS SES;
- utworzenie roli, która będzie miała uprawnienia do pracy z AWS SES, CloudWatch oraz Lambdą;
- utworzenie funkcji Lambda wysyłającej wiadomości;
- dodanie reguły dla zaplanowanego zadania z CloudWatch
Dokładny opis działania
W naszym wypadku wykorzystamy CloudWatch przygotowując regułę, która będzie wyzwalała funkcję Lambda co 5 minut. Wywołanie to będzie skutkowało wysyłką wiadomości e-mail. Zanim przejdziemy do implementacji spójrzcie na poniższy diagram:
Adres email, tworzenie roli, implementacja Lambdy
Weryfikację adresu email możemy pominąć ponieważ zrobiliśmy to w poprzednim wpisie. Jedyne na czym nam zależy to sprawdzenie z poziomu SES czy weryfikacja przebiegła pomyślnie:
Kolejny krok to utworzenie roli, która będzie miała dostęp do SES, CloudWatch oraz Lambda. Podobnie jak w poprzednim wpisie wykorzystujemy IAM, klikamy przycisk Create role a następnie tworzymy rolę z poniższymi uprawnieniami:
Lambda przyjmie bardzo podobną postać do tej z poprzedniego wpisu - pozbędziemy się jedynie części związanej z obsługą DynamoDB. Szczegóły dotyczące wymaganych paczek czy samego działania dodałem w formie komentarzy do poniższego kodu:
// Ustawcie adres email zweryfikowany w obrębie konkretnego regionu
string senderAddress = "zweryfikowany_adres_email@gmail.com";
// Pamiętajcie o ustawieniu regionu w którym dokonaliście weryfikacji adresu email
// W przeciwnym wypadku zobaczycie poniższy błąd:
// Email address is not verified.
// The following identities failed the check in region EU-WEST-2: zweryfikowany_adres_email@gmail.com
using (var client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USEast1))
{
var sendRequest = new SendEmailRequest
{
Source = senderAddress,
Destination = new Destination
{
ToAddresses =
new List<string> { "zweryfikowany_adres_email@gmail.com" }
},
Message = new Message
{
Subject = new Content("Wpisz temat wysyłanej wiadomości"),
Body = new Body
{
Html = new Content
{
Charset = "UTF-8",
Data = sb.ToString()
},
Text = new Content
{
Charset = "UTF-8",
Data = "body"
}
}
}
};
var response = await client.SendEmailAsync(sendRequest);
}
}
Ostatni krok to dodanie odpowiedniego wyzwalacza na naszej funkcji. Pamiętajcie jedynie, że wraz z zapisaniem konfiguracji nasza funkcja będzie wywoływana co 5 minut. Jeżeli nie chcecie wysyłać wiadomości email możecie dodać proste logowanie do dziennika zdarzeń w poniższej (przykładowej) postaci napisanej w Node.js 14.x:
exports.handler = async (event) => {
console.log("Wyzwalacz działa co 5 minut!");
return response;
};
Sama konfiguracja wyzwalacza funkcji może przyjąć poniższą postać:
Po włączeniu wyzwalacza możecie odczekać kilkanaście minut a następnie przejść do dziennika zdarzeń funkcji i zobaczyć czy doszło do kilkukrotnego jej uruchomienia:
Jak widzicie wszystko działa poprawnie bez konieczności wysyłania wiadomości email w celu przetestowania funkcjonalności. Powyższy przykład nie ma większego sensu ale gdybyście potrzebowali napisać funkcję, która pobiera określony zestaw danych co 24h i dokonuje analizy tych danych a w efekcie wysyła do Was wiadomość email - takie zachowanie ma już sens.