Formularz konktaktowy to jeden z podstawowych elementów na blogu czy stronie internetowej. Jest to dobre rozwiązanie aby umożliwić czytelnikom komunikację z nami bez konieczności eksponowania adresu email na stronie. Mając wordpress, jest tam sporo gotowych pluginów, ale co gdy jednak tak jak ja postanowicie postawić sobie “statycznego” bloga bez serwerów pod spodem. Żaden problem, za chwilę pokaże wam jak szybko i prosto można dorobić sobie backend do obsługi formularza na naszej statycznej stronie. A co najważniejsze bez odpalania maszyn wirtualnych.
Architektura
Z grubsza rozwiązanie wygląda tak jak na przedstawionym schemacie. System wykorzystuje trzy usługi:
- API Gateway, usługa do budowania API.
- AWS Lambda czyli usługa function as a service.
- AWS Simple Email Service, usługa do wysyłania/odbierania email.
Metoda działania.
Jak widać na załączonym rysunku, potrzebne jest tylko 5 kroków do wysłania wiadomości. Dane z formularza przekazywane są po wystawionym API i trafiają do funkcji ContactFormSES. AWS Lambda, która uruchamiana jest na podstawie jakiegoś zdarzenia ( w tym wypadku odbiór danych z API Gateway’a), realizuje umieszczony w niej kod. Funkcja ContactFormSES, którą wyskrobałem w python w ciągu 20 minut wysyła te dane z użyciem serwisu AWS SES. Zamiennie można użyć AWS SNS (Simple Notification Service), ale z SES maile przychodzą od razu w okiełznanej postaci ( a nie w formacie JSON). I to tak naprawdę tyle. Wszystko w modelu as a service. Raz skonfigurowane działa zawsze.
Konfiguracja
Pierwsza sprawa, to z konsoli zarządzania AWS, wchodzimy do AWS SES i tutaj do zrobienia są dwie rzeczy:
- Po lewej stronie wybrać trzeba Domain i dodać domene, z której będą adresy nadawcy i odbiorcy. Niech to będzie np. “mydomain.com”.
- Przeprocesować weryfikację domeny wg opisanej procedury.
Dla przykładu ja przyjąłem, że nadawcą wiadomości jest [email protected], a odbiorcą [email protected]. Bardzo ważne jest, żeby domena z której nadajemy była zweryfikowana, w przeciwnym wypadku opluje nas błędem “Email address not verified”.
Kolejna sprawa to konfiguracja funkcji Lambda ContactFormSES, której kod znajdziecie na github. W pierwszej kolejności w IAM utworzyć trzeba nową rolę która pozwoli funkcji się wykonywać oraz wysyłać wiadomości za pośrednictwem AWS SES. Spokojnie można tu użyć predefiniowanej Policy “AWSLambdaBasicExecutionRole” oraz ja np. utworzyłem własną pozwalająca tylko na wysyłke wiadomości.
1
2
3
4
5
6
7
8
9
10
11
12
|
{
„Version”: „2012-10-17”,
„Statement”: [
{
„Effect”: „Allow”,
„Action”: [
„ses:SendEmail”
],
„Resource”: „*”
}
]
}
|
Teraz czas na utworzenie nowej funkcji z parametrami jak poniżej:
Copy and Paste kod funkcji, pamiętając oczywiście o podstawieniu własnych adresów email. Odbiorców wiadomości może być więcej, a jak to dodać odwołuję do dokumentacji boto3 i funkcji send_email().
Warto na tym poziomie przetestować czy kod działa:
Jeśli wszytko pójdzie OK, log wypluje “Message sent”, a w skrzynce teoretycznie powinna pojawić się nowa wiadomość.
Skoro działa jak należy, pozostaje tylko stworzyć w zakładce API Gateway nowe API. Nazewnictwo i struktura pozostaje już do waszej decyzji. Ja dla szybkiego testu zrobiłem sobie jedno Resource z metodą POST dla której w Integration Request trzeba wybrać przygotowaną wcześniej funkcję Lambda ContactFormSES. Następnie zatwierdzić monit o uprawnienia i poprzez przycisk test, sprawdzić czy działa.
Jeśli test konfiguracji się powiódł zostaje już tylko Deploy API i gotowe. Tyle z konfiguracji. Warto przetestować czy całe rozwiązanie działa (np. przy użyciu POSTMAN’a):
To wszystko, szybkie i proste rozwiązanie na obsługę formularza kontaktowego. Teraz wystarczy eksport SDK i implementacja na stronie. Kod samej funkcji nie jest zbyt wysublimowany, zapewne można sobie dodać jeszcze obsługę błędów itp. Tak samo jeśli chodzi o konfigurację API, security, to pozostawiam Wam.
Mam nadzieję, że sama koncepcja wam się spodoba i przyda. Jeśli widzisz pole do optymalizacji rozwiązania skomentuj, bądź napisz do mnie.