Odkryj moc funkcji chmurowych i architektury opartej na zdarzeniach: dowiedz się, jak budować skalowalne, wydajne i oszczędne aplikacje. Poznaj przypadki użycia, najlepsze praktyki i rzeczywiste przykłady.
Funkcje chmurowe: Dogłębna analiza architektury opartej na zdarzeniach
W dzisiejszym dynamicznym krajobrazie technologicznym firmy nieustannie poszukują sposobów na optymalizację swoich operacji, poprawę skalowalności i redukcję kosztów. Jedną z architektur, która zyskała ogromną popularność w ostatnich latach, jest architektura oparta na zdarzeniach, a w sercu tego paradygmatu leżą funkcje chmurowe. Ten kompleksowy przewodnik zagłębi się w podstawowe koncepcje funkcji chmurowych, badając ich rolę w architekturze opartej na zdarzeniach, podkreślając ich zalety i dostarczając praktycznych przykładów ilustrujących ich moc.
Czym są funkcje chmurowe?
Funkcje chmurowe to bezserwerowe, sterowane zdarzeniami usługi obliczeniowe, które pozwalają na wykonywanie kodu w odpowiedzi na zdarzenia, bez zarządzania serwerami czy infrastrukturą. Są one kluczowym komponentem obliczeń bezserwerowych (serverless), umożliwiając deweloperom skupienie się wyłącznie na pisaniu kodu, który realizuje określoną logikę biznesową. Wyobraź sobie je jako lekkie, dostępne na żądanie fragmenty kodu, które wkraczają do akcji tylko wtedy, gdy są potrzebne.
Pomyśl o tym w ten sposób: tradycyjna aplikacja oparta na serwerze wymaga od Ciebie zapewnienia i utrzymania serwerów, instalacji systemów operacyjnych i zarządzania całym stosem infrastruktury. W przypadku funkcji chmurowych cała ta złożoność jest ukryta. Po prostu piszesz swoją funkcję, definiujesz jej wyzwalacz (zdarzenie, które powoduje jej wykonanie) i wdrażasz ją w chmurze. Dostawca chmury zajmuje się skalowaniem, łataniem i zarządzaniem podstawową infrastrukturą.
Kluczowe cechy funkcji chmurowych:
- Bezserwerowe (Serverless): Nie jest wymagane zarządzanie serwerami. Dostawca chmury zajmuje się całą infrastrukturą.
- Oparte na zdarzeniach (Event-Driven): Funkcje są wyzwalane przez zdarzenia, takie jak przesłanie pliku, zmiana w bazie danych lub żądanie HTTP.
- Skalowalne: Funkcje chmurowe automatycznie skalują się, aby obsłużyć zmienne obciążenia, zapewniając optymalną wydajność nawet w okresach szczytowego ruchu.
- Płatność za użycie (Pay-per-Use): Płacisz tylko za czas obliczeniowy zużyty podczas wykonywania funkcji.
- Bezstanowe (Stateless): Każde wykonanie funkcji jest niezależne i nie polega na trwałym stanie.
Zrozumienie architektury opartej na zdarzeniach
Architektura oparta na zdarzeniach (EDA) to paradygmat architektury oprogramowania, w którym komponenty komunikują się ze sobą poprzez produkcję i konsumpcję zdarzeń. Zdarzenie to znacząca zmiana stanu, taka jak przesłanie pliku przez użytkownika, złożenie nowego zamówienia czy odczyt z czujnika przekraczający próg.
W systemie EDA komponenty (lub usługi) nie wywołują się nawzajem bezpośrednio. Zamiast tego publikują zdarzenia na magistrali zdarzeń lub w kolejce komunikatów, a inne komponenty subskrybują te zdarzenia, aby je odbierać i przetwarzać. To oddzielenie komponentów oferuje kilka zalet:
- Luźne powiązanie (Loose Coupling): Komponenty są niezależne i mogą ewoluować niezależnie, nie wpływając na siebie nawzajem.
- Skalowalność: Komponenty można skalować niezależnie w zależności od ich potrzeb w zakresie przetwarzania zdarzeń.
- Odporność (Resilience): Jeśli jeden komponent ulegnie awarii, niekoniecznie powoduje to awarię całego systemu.
- Przetwarzanie w czasie rzeczywistym: Zdarzenia mogą być przetwarzane niemal w czasie rzeczywistym, co umożliwia natychmiastowe reakcje na zmiany stanu.
Rola funkcji chmurowych w EDA
Funkcje chmurowe służą jako idealne bloki konstrukcyjne dla systemów EDA. Mogą być używane do:
- Produkowania zdarzeń: Funkcja chmurowa może wygenerować zdarzenie po zakończeniu zadania, sygnalizując innym komponentom, że zadanie zostało zakończone.
- Konsumowania zdarzeń: Funkcja chmurowa może subskrybować zdarzenia i wykonywać działania w odpowiedzi na te zdarzenia.
- Transformowania zdarzeń: Funkcja chmurowa może przekształcać dane zdarzenia, zanim zostaną one skonsumowane przez inne komponenty.
- Kierowania zdarzeń (Routing): Funkcja chmurowa może kierować zdarzenia do różnych miejsc docelowych na podstawie ich treści lub innych kryteriów.
Korzyści z używania funkcji chmurowych i architektury opartej na zdarzeniach
Przyjęcie funkcji chmurowych i EDA oferuje liczne korzyści dla organizacji każdej wielkości:
- Zmniejszone koszty infrastruktury: Wyeliminowanie zarządzania serwerami znacznie obniża koszty operacyjne. Płacisz tylko za faktycznie wykorzystany czas obliczeniowy.
- Zwiększona skalowalność: Funkcje chmurowe automatycznie skalują się, aby obsłużyć zmienne obciążenia, zapewniając, że aplikacje pozostają responsywne nawet podczas szczytowego zapotrzebowania. Na przykład platforma e-commerce może łatwo obsłużyć gwałtowny wzrost ruchu podczas wyprzedaży bez konieczności ręcznej interwencji.
- Szybsze cykle rozwojowe: Rozwój w modelu bezserwerowym upraszcza proces deweloperski, pozwalając programistom skupić się na pisaniu kodu, a nie na zarządzaniu infrastrukturą. Prowadzi to do szybszych cykli rozwojowych i krótszego czasu wprowadzenia produktu na rynek.
- Poprawiona odporność: Oddzielony charakter EDA sprawia, że aplikacje są bardziej odporne na awarie. Jeśli jedna funkcja zawiedzie, niekoniecznie wpływa to na inne części systemu.
- Zwiększona zwinność (Agility): EDA umożliwia organizacjom szybkie dostosowywanie się do zmieniających się wymagań biznesowych. Nowe funkcje i usługi można dodawać lub modyfikować bez zakłócania istniejącej funkcjonalności. Wyobraź sobie globalną firmę logistyczną, która łatwo integruje nowego partnera dostawczego, po prostu dodając nową funkcję chmurową subskrybującą zdarzenia zamówień.
- Skupienie na innowacjach: Dzięki odciążeniu od zarządzania infrastrukturą, deweloperzy mogą skupić się na innowacjach i tworzeniu nowych funkcji, które przynoszą wartość biznesową.
Typowe przypadki użycia funkcji chmurowych i architektury opartej na zdarzeniach
Funkcje chmurowe i EDA mają zastosowanie w szerokim zakresie przypadków użycia w różnych branżach:
- Przetwarzanie danych w czasie rzeczywistym: Przetwarzanie strumieni danych z urządzeń IoT, mediów społecznościowych czy rynków finansowych. Na przykład globalna usługa prognozowania pogody używająca funkcji chmurowych do analizy danych ze stacji pogodowych na całym świecie w czasie rzeczywistym.
- Przetwarzanie obrazów i wideo: Automatyczne zmienianie rozmiaru, transkodowanie lub analizowanie obrazów i filmów przesyłanych do usługi przechowywania w chmurze. Strona internetowa z fotografiami używa funkcji chmurowych do automatycznego generowania miniatur i optymalizacji obrazów dla różnych urządzeń.
- Webhooki: Reagowanie na zdarzenia z usług firm trzecich, takich jak GitHub, Stripe czy Twilio. Międzynarodowe narzędzie do zarządzania projektami używa funkcji chmurowych do wysyłania powiadomień o utworzeniu nowego zadania lub zbliżającym się terminie.
- Chatboty: Budowanie interfejsów konwersacyjnych, które odpowiadają na dane wejściowe użytkownika w czasie rzeczywistym. Wielojęzyczny chatbot obsługi klienta używa funkcji chmurowych do przetwarzania zapytań użytkowników i dostarczania trafnych odpowiedzi.
- Backend mobilny: Dostarczanie usług backendowych dla aplikacji mobilnych, takich jak uwierzytelnianie użytkowników, przechowywanie danych i powiadomienia push. Globalna aplikacja fitness używa funkcji chmurowych do obsługi uwierzytelniania użytkowników i przechowywania danych treningowych.
- Potoki danych (Data Pipelines): Orkiestracja przepływów danych między różnymi systemami, np. przenoszenie danych z bazy danych do hurtowni danych. Globalna instytucja badawcza używa funkcji chmurowych do przenoszenia danych naukowych z różnych źródeł do centralnego repozytorium danych.
- Aplikacje IoT: Przetwarzanie danych z podłączonych urządzeń, takich jak czujniki, siłowniki i inteligentne urządzenia. Globalna firma rolnicza używa funkcji chmurowych do analizy danych z czujników na farmach na całym świecie oraz optymalizacji nawadniania i nawożenia.
- E-commerce: Przetwarzanie zamówień, zarządzanie zapasami i wysyłanie powiadomień w czasie rzeczywistym.
- Wykrywanie oszustw: Analizowanie transakcji w czasie rzeczywistym w celu identyfikacji i zapobiegania nieuczciwym działaniom. Globalny procesor płatności używa funkcji chmurowych do wykrywania i zapobiegania oszukańczym transakcjom.
Praktyczne przykłady działania funkcji chmurowych
Przyjrzyjmy się kilku konkretnym przykładom, jak funkcje chmurowe mogą być używane do rozwiązywania rzeczywistych problemów.
Przykład 1: Zmiana rozmiaru obrazu po przesłaniu do Cloud Storage
Wyobraź sobie, że masz stronę internetową, na której użytkownicy mogą przesyłać obrazy. Chcesz automatycznie zmieniać rozmiar tych obrazów, aby tworzyć miniatury dla różnych rozmiarów wyświetlania. Możesz to osiągnąć za pomocą funkcji chmurowej wyzwalanej przez zdarzenie przesłania do Cloud Storage.
Wyzwalacz: Zdarzenie przesłania do Cloud Storage
Funkcja:
from google.cloud import storage
from PIL import Image
import io
def resize_image(event, context):
"""Zmienia rozmiar obrazu przesłanego do Cloud Storage."""
bucket_name = event['bucket']
file_name = event['name']
if not file_name.lower().endswith(('.png', '.jpg', '.jpeg')):
return
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(file_name)
image_data = blob.download_as_bytes()
image = Image.open(io.BytesIO(image_data))
image.thumbnail((128, 128))
output = io.BytesIO()
image.save(output, format=image.format)
thumbnail_data = output.getvalue()
thumbnail_file_name = f'thumbnails/{file_name}'
thumbnail_blob = bucket.blob(thumbnail_file_name)
thumbnail_blob.upload_from_string(thumbnail_data, content_type=blob.content_type)
print(f'Miniatura utworzona: gs://{bucket_name}/{thumbnail_file_name}')
Ta funkcja jest wyzwalana za każdym razem, gdy nowy plik jest przesyłany do określonego zasobnika (bucket) Cloud Storage. Pobiera obraz, zmienia jego rozmiar na 128x128 pikseli i przesyła miniaturę do folderu 'thumbnails' w tym samym zasobniku.
Przykład 2: Wysyłanie e-maili powitalnych po rejestracji użytkownika
Rozważ aplikację internetową, w której użytkownicy mogą tworzyć konta. Chcesz automatycznie wysyłać e-mail powitalny do nowych użytkowników po rejestracji. Możesz to osiągnąć za pomocą funkcji chmurowej wyzwalanej przez zdarzenie Firebase Authentication.
Wyzwalacz: Zdarzenie nowego użytkownika w Firebase Authentication
Funkcja:
from firebase_admin import initialize_app, auth
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
import os
initialize_app()
def send_welcome_email(event, context):
"""Wysyła e-mail powitalny do nowego użytkownika."""
user = auth.get_user(event['data']['uid'])
email = user.email
display_name = user.display_name
message = Mail(
from_email='your_email@example.com',
to_emails=email,
subject='Witaj w naszej aplikacji!',
html_content=f'Drogi {display_name},\n\nWitaj w naszej aplikacji! Cieszymy się, że jesteś z nami.\n\nZ pozdrowieniami,\nZespół'
)
try:
sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
response = sg.send(message)
print(f'E-mail wysłany do {email} ze statusem: {response.status_code}')
except Exception as e:
print(f'Błąd podczas wysyłania e-maila: {e}')
Ta funkcja jest wyzwalana za każdym razem, gdy w Firebase Authentication tworzony jest nowy użytkownik. Pobiera adres e-mail i nazwę wyświetlaną użytkownika, a następnie wysyła e-mail powitalny za pomocą API SendGrid.
Przykład 3: Analiza sentymentu opinii klientów
Załóżmy, że masz platformę e-commerce i chcesz analizować sentyment opinii klientów w czasie rzeczywistym. Możesz użyć funkcji chmurowych do przetwarzania opinii w miarę ich przesyłania i określania, czy są one pozytywne, negatywne czy neutralne.
Wyzwalacz: Zdarzenie zapisu w bazie danych (np. dodanie nowej opinii do bazy danych)
Funkcja:
from google.cloud import language_v1
import os
def analyze_sentiment(event, context):
"""Analizuje sentyment opinii klienta."""
review_text = event['data']['review_text']
client = language_v1.LanguageServiceClient()
document = language_v1.Document(content=review_text, type_=language_v1.Document.Type.PLAIN_TEXT)
sentiment = client.analyze_sentiment(request={'document': document}).document_sentiment
score = sentiment.score
magnitude = sentiment.magnitude
if score >= 0.25:
sentiment_label = 'Pozytywny'
elif score <= -0.25:
sentiment_label = 'Negatywny'
else:
sentiment_label = 'Neutralny'
print(f'Sentyment: {sentiment_label} (Wynik: {score}, Siła: {magnitude})')
# Zaktualizuj bazę danych o wyniki analizy sentymentu
# (Implementacja zależy od Twojej bazy danych)
Ta funkcja jest wyzwalana, gdy nowa opinia jest zapisywana w bazie danych. Używa ona Google Cloud Natural Language API do analizy sentymentu tekstu opinii i określa, czy jest on pozytywny, negatywny czy neutralny. Następnie funkcja wyświetla wyniki analizy sentymentu i aktualizuje bazę danych o etykietę sentymentu, wynik i siłę.
Wybór odpowiedniego dostawcy funkcji chmurowych
Kilku dostawców chmurowych oferuje usługi funkcji chmurowych. Najpopularniejsze opcje to:
- Google Cloud Functions: Bezserwerowa usługa obliczeniowa Google, ściśle zintegrowana z innymi usługami Google Cloud.
- AWS Lambda: Bezserwerowa usługa obliczeniowa Amazon, część ekosystemu Amazon Web Services.
- Azure Functions: Bezserwerowa usługa obliczeniowa Microsoft, zintegrowana z usługami Azure.
Wybierając dostawcę, należy wziąć pod uwagę takie czynniki jak ceny, obsługiwane języki, integracja z innymi usługami i dostępność regionalna. Każdy dostawca ma swoje mocne i słabe strony, dlatego ważne jest, aby ocenić swoje specyficzne wymagania i wybrać dostawcę, który najlepiej odpowiada Twoim potrzebom.
Najlepsze praktyki tworzenia funkcji chmurowych
Aby zapewnić, że Twoje funkcje chmurowe są wydajne, niezawodne i bezpieczne, postępuj zgodnie z tymi najlepszymi praktykami:
- Utrzymuj funkcje małe i skoncentrowane: Każda funkcja powinna wykonywać jedno, dobrze zdefiniowane zadanie. Ułatwia to ich zrozumienie, testowanie i utrzymanie. Unikaj tworzenia monolitycznych funkcji, które obsługują wiele obowiązków.
- Optymalizuj zależności: Minimalizuj liczbę i rozmiar zależności dołączanych do funkcji. Duże zależności mogą zwiększać czas zimnego startu (czas potrzebny na pierwsze wykonanie funkcji).
- Obsługuj błędy z gracją: Wdrażaj solidną obsługę błędów, aby zapobiegać nieoczekiwanym awariom. Używaj bloków try-except do przechwytywania wyjątków i odpowiedniego logowania błędów. Rozważ użycie kolejki martwych listów (dead-letter queue) do obsługi zdarzeń, które nie zostały przetworzone po wielu próbach.
- Używaj zmiennych środowiskowych do konfiguracji: Przechowuj ustawienia konfiguracyjne, takie jak klucze API i ciągi połączeń do bazy danych, w zmiennych środowiskowych, a nie na stałe w kodzie funkcji. To sprawia, że funkcje są bardziej przenośne i bezpieczne.
- Wdróż logowanie: Używaj frameworka do logowania, aby rejestrować ważne zdarzenia i błędy. Pomaga to monitorować wydajność funkcji i rozwiązywać problemy.
- Zabezpiecz swoje funkcje: Wdrażaj odpowiednie mechanizmy uwierzytelniania i autoryzacji, aby chronić swoje funkcje przed nieautoryzowanym dostępem. Stosuj bezpieczne praktyki kodowania, aby zapobiegać podatnościom, takim jak wstrzykiwanie kodu (code injection) i cross-site scripting.
- Testuj swoje funkcje dokładnie: Pisz testy jednostkowe i integracyjne, aby upewnić się, że funkcje działają zgodnie z oczekiwaniami. Używaj mockowania i stubowania, aby izolować funkcje od zewnętrznych zależności podczas testowania.
- Monitoruj swoje funkcje: Używaj narzędzi do monitorowania, aby śledzić wydajność swoich funkcji, taką jak czas wykonania, zużycie pamięci i wskaźnik błędów. Pomaga to identyfikować i eliminować wąskie gardła wydajności i potencjalne problemy.
- Uwzględnij zimne starty: Bądź świadomy, że funkcje chmurowe mogą doświadczać zimnych startów, zwłaszcza po okresach bezczynności. Optymalizuj swoje funkcje, aby minimalizować czas zimnego startu. Rozważ użycie technik takich jak pre-warming (wstępne podgrzewanie), aby utrzymać funkcje w stanie aktywności.
- Używaj operacji asynchronicznych: Tam, gdzie to możliwe, używaj operacji asynchronicznych, aby unikać blokowania głównego wątku wykonania. Może to poprawić wydajność i responsywność Twoich funkcji.
Kwestie bezpieczeństwa dotyczące funkcji chmurowych
Bezpieczeństwo jest najważniejsze podczas tworzenia funkcji chmurowych. Oto kilka kluczowych kwestii bezpieczeństwa, o których należy pamiętać:
- Zasada najmniejszych uprawnień: Przyznawaj swoim funkcjom chmurowym tylko minimalne niezbędne uprawnienia do dostępu do innych zasobów chmurowych. Zmniejsza to potencjalny wpływ naruszenia bezpieczeństwa. Używaj kont usługowych z ograniczonymi rolami, aby ograniczyć zakres dostępu.
- Walidacja danych wejściowych: Zawsze waliduj dane wejściowe od użytkowników, aby zapobiegać atakom typu wstrzykiwanie kodu. Oczyszczaj dane wejściowe, aby usunąć potencjalnie szkodliwe znaki lub kod. Używaj zapytań parametryzowanych, aby zapobiegać podatnościom na SQL injection.
- Zarządzanie sekretami: Nigdy nie przechowuj poufnych informacji, takich jak hasła czy klucze API, bezpośrednio w kodzie. Używaj usług do zarządzania sekretami, takich jak Google Cloud Secret Manager lub AWS Secrets Manager, aby bezpiecznie przechowywać i pobierać sekrety.
- Podatności w zależnościach: Regularnie skanuj zależności swoich funkcji w poszukiwaniu znanych podatności. Używaj narzędzi do skanowania zależności, aby identyfikować i naprawiać podatne biblioteki lub pakiety. Utrzymuj swoje zależności w aktualnej wersji z najnowszymi poprawkami bezpieczeństwa.
- Bezpieczeństwo sieci: Konfiguruj kontrole dostępu do sieci, aby ograniczyć dostęp do swoich funkcji chmurowych. Używaj reguł zapory sieciowej (firewall), aby zezwalać na ruch do funkcji tylko z autoryzowanych źródeł. Rozważ użycie Virtual Private Cloud (VPC), aby odizolować swoje funkcje od publicznego internetu.
- Logowanie i monitorowanie: Włącz logowanie i monitorowanie, aby wykrywać i reagować na incydenty bezpieczeństwa. Monitoruj logi pod kątem podejrzanej aktywności, takiej jak próby nieautoryzowanego dostępu czy nietypowe wzorce ruchu. Używaj narzędzi SIEM (Security Information and Event Management) do analizy logów bezpieczeństwa i generowania alertów.
- Regularne audyty bezpieczeństwa: Przeprowadzaj regularne audyty bezpieczeństwa, aby identyfikować i eliminować potencjalne podatności w swoich funkcjach chmurowych. Używaj narzędzi do testów penetracyjnych, aby symulować ataki i oceniać skuteczność swoich mechanizmów bezpieczeństwa.
- Zgodność z przepisami (Compliance): Upewnij się, że Twoje funkcje chmurowe są zgodne z odpowiednimi regulacjami i standardami branżowymi, takimi jak RODO (GDPR), HIPAA i PCI DSS. Wdrażaj odpowiednie kontrole bezpieczeństwa, aby chronić wrażliwe dane i utrzymywać zgodność.
Przyszłość funkcji chmurowych i architektury opartej na zdarzeniach
Funkcje chmurowe i architektura oparta na zdarzeniach mają odgrywać coraz ważniejszą rolę w przyszłości rozwoju oprogramowania. W miarę jak organizacje nadal będą przyjmować technologie chmurowe (cloud-native) i architektury mikrousług, korzyści płynące z obliczeń bezserwerowych i komunikacji opartej na zdarzeniach staną się jeszcze bardziej przekonujące.
Możemy spodziewać się dalszych postępów w następujących obszarach:
- Ulepszone narzędzia deweloperskie: Dostawcy chmury będą nadal inwestować w narzędzia dla deweloperów, aby ułatwić budowanie, wdrażanie i zarządzanie funkcjami chmurowymi. Obejmuje to integracje z IDE, narzędzia do debugowania i potoki CI/CD.
- Zwiększona obserwowalność (Observability): Narzędzia do obserwowalności staną się bardziej zaawansowane, dostarczając głębszych wglądów w wydajność i zachowanie funkcji chmurowych. Umożliwi to deweloperom szybkie identyfikowanie i rozwiązywanie problemów.
- Bardziej zaawansowane przetwarzanie zdarzeń: Platformy do przetwarzania zdarzeń będą ewoluować, aby obsługiwać bardziej złożone wzorce zdarzeń i transformacje danych. Umożliwi to organizacjom budowanie bardziej zaawansowanych aplikacji opartych na zdarzeniach.
- Przetwarzanie na krawędzi (Edge Computing): Funkcje chmurowe będą coraz częściej wdrażane na krawędzi sieci, bliżej źródła danych. Zmniejszy to opóźnienia i poprawi wydajność aplikacji działających w czasie rzeczywistym.
- Sztuczna inteligencja i uczenie maszynowe: Funkcje chmurowe będą używane do budowania i wdrażania modeli AI/ML, umożliwiając organizacjom automatyzację zadań i uzyskiwanie wglądów z danych.
Podsumowanie
Funkcje chmurowe i architektura oparta na zdarzeniach oferują potężne połączenie do budowania skalowalnych, wydajnych i opłacalnych aplikacji. Przyjmując te technologie, organizacje mogą usprawnić swoje procesy rozwojowe, zmniejszyć koszty infrastruktury i przyspieszyć innowacje. W miarę jak krajobraz chmurowy będzie się rozwijał, funkcje chmurowe i EDA pozostaną na czele nowoczesnego rozwoju oprogramowania, dając deweloperom możliwość tworzenia aplikacji nowej generacji.
Niezależnie od tego, czy budujesz prosty handler dla webhooka, czy złożony potok do przetwarzania danych w czasie rzeczywistym, funkcje chmurowe zapewniają elastyczną i skalowalną platformę do realizacji Twoich pomysłów. Wykorzystaj moc zdarzeń i odblokuj potencjał obliczeń bezserwerowych dzięki funkcjom chmurowym.