Paweł Łukasiewicz
2022-05-05
Paweł Łukasiewicz
2022-05-05
Udostępnij Udostępnij Kontakt
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:

  1. weryfikacja adresu e-mail przy pomocy usługi AWS SES;
  2. utworzenie roli, która będzie miała uprawnienia do pracy z AWS SES, CloudWatch oraz Lambdą;
  3. utworzenie funkcji Lambda wysyłającej wiadomości;
  4. 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: Lambda: zaplanowane zadania, architektura aplikacji

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: Lambda: zaplanowane zadania, weryfikacja adresu email

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: zaplanowane zadania, tworzenie roli

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ć: Lambda: zaplanowane zadania, wyzwalacz funkcji 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: Lambda: zaplanowane zadania, testowanie funkcji

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.