Odkryj moc przetwarzania bezserwerowego dzięki Google Cloud Functions. Ten przewodnik analizuje wyzwalacze HTTP, dostarczając programistom na całym świecie wiedzę potrzebną do tworzenia skalowalnych aplikacji opartych na zdarzeniach.
Google Cloud Functions: Kompleksowy przewodnik po wyzwalaczach HTTP
Google Cloud Functions (GCF) to środowisko wykonawcze bezserwerowe, które umożliwia tworzenie usług w chmurze i łączenie się z nimi. Dzięki Cloud Functions piszesz proste, wyspecjalizowane funkcje, które są powiązane ze zdarzeniami emitowanymi z infrastruktury i usług chmurowych. Twoja funkcja jest wykonywana, gdy wystąpi obserwowane przez Ciebie zdarzenie. Takie podejście pozwala na tworzenie aplikacji opartych na zdarzeniach bez zarządzania serwerami lub środowiskami uruchomieniowymi.
Jednym z najczęstszych sposobów wywoływania Cloud Function jest żądanie HTTP. Ten przewodnik zagłębi się w świat wyzwalaczy HTTP w Google Cloud Functions, dostarczając wiedzę potrzebną do budowania wydajnych, skalowalnych i opłacalnych aplikacji.
Czym są wyzwalacze HTTP?
Wyzwalacz HTTP umożliwia wykonanie Cloud Function w odpowiedzi na żądanie HTTP. Zasadniczo, gdy żądanie HTTP zostanie wysłane do określonego adresu URL, Google Cloud Functions automatycznie wykona powiązaną funkcję. To sprawia, że wyzwalacze HTTP są idealne do tworzenia API, webhooków i aplikacji internetowych opartych na zdarzeniach.
Kluczowe zalety stosowania wyzwalaczy HTTP:
- Skalowalność: Cloud Functions automatycznie skalują się, aby obsługiwać przychodzące żądania HTTP. Nie musisz się martwić o udostępnianie serwerów ani zarządzanie nimi.
- Opłacalność: Płacisz tylko za czas wykonywania funkcji. Kiedy funkcja jest bezczynna, nie ponosisz żadnych opłat.
- Łatwość użycia: Cloud Functions upraszcza proces tworzenia i wdrażania. Możesz skupić się na pisaniu kodu funkcji, a Google Cloud zajmie się infrastrukturą.
- Integracja: Wyzwalacze HTTP umożliwiają łatwą integrację Cloud Functions z innymi usługami, takimi jak aplikacje internetowe, aplikacje mobilne i API stron trzecich.
Tworzenie Cloud Function z wyzwalaczem HTTP
Przejdźmy przez proces tworzenia prostej Cloud Function z wyzwalaczem HTTP. Utworzymy funkcję, która odpowiada komunikatem "Hello, World!". Ten przykład można dostosować do różnych globalnych ustawień regionalnych, po prostu modyfikując ciąg wyjściowy.
Wymagania wstępne:
- Konto Google Cloud Platform (GCP).
- Zainstalowany i skonfigurowany Google Cloud SDK (gcloud).
Kroki:
- Utwórz nowy projekt (jeśli go nie masz):
Jeśli nie masz jeszcze projektu GCP, utwórz go w konsoli Google Cloud.
- Włącz Cloud Functions API:
W konsoli Cloud przejdź do Cloud Functions API i włącz je.
- Utwórz katalog funkcji:
Utwórz nowy katalog dla Cloud Function. Na przykład:
mkdir hello-http cd hello-http
- Napisz kod funkcji:
Utwórz plik o nazwie `main.py` (lub `index.js` dla Node.js) z następującym kodem:
Python (main.py):
def hello_http(request): """HTTP Cloud Function. Args: request (flask.Request): The request object. <https://flask.palletsprojects.com/en/1.1.x/api/#flask.Request> Returns: The response text, or any set of values that can be turned into a Response object using `make_response` <https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.make_response>. """ request_json = request.get_json(silent=True) request_args = request.args if request_json and 'name' in request_json: name = request_json['name'] elif request_args and 'name' in request_args: name = request_args['name'] else: name = 'World' return f'Hello, {name}!'
Node.js (index.js):
exports.helloHttp = (req, res) => { let name = 'World'; if (req.body.name) { name = req.body.name; } else if (req.query.name) { name = req.query.name; } res.status(200).send(`Hello, ${name}!`); };
- Utwórz plik wymagań (tylko Python):
Jeśli używasz języka Python, utwórz plik o nazwie `requirements.txt` i dodaj wszystkie zależności, których potrzebuje Twoja funkcja. W tym przykładzie nie jest to absolutnie konieczne, ale dobrą praktyką jest dołączenie go. Możesz go pozostawić pusty, jeśli nie masz żadnych zależności.
- Wdróż funkcję:
Użyj polecenia `gcloud functions deploy`, aby wdrożyć funkcję. Zastąp `YOUR_FUNCTION_NAME` żądaną nazwą funkcji.
Python:
gcloud functions deploy YOUR_FUNCTION_NAME \ --runtime python39 \ --trigger-http \ --allow-unauthenticated
Node.js:
gcloud functions deploy YOUR_FUNCTION_NAME \ --runtime nodejs16 \ --trigger-http \ --allow-unauthenticated
Wyjaśnienie parametrów:
- `YOUR_FUNCTION_NAME`: Nazwa, którą chcesz nadać Cloud Function.
- `--runtime`: Środowisko uruchomieniowe dla funkcji (np. `python39`, `nodejs16`).
- `--trigger-http`: Określa, że funkcja powinna być wyzwalana przez żądania HTTP.
- `--allow-unauthenticated`: Umożliwia każdemu wywoływanie funkcji bez uwierzytelniania. Ostrzeżenie: Zachowaj ostrożność podczas włączania tej opcji w środowiskach produkcyjnych! Rozważ wdrożenie odpowiedniego uwierzytelniania i autoryzacji.
- Przetestuj funkcję:
Po wdrożeniu polecenie `gcloud` wyświetli adres URL funkcji. Możesz go następnie przetestować, wysyłając żądanie HTTP na ten adres URL za pomocą narzędzia takiego jak `curl` lub Postman.
curl YOUR_FUNCTION_URL
Powinieneś zobaczyć komunikat "Hello, World!" w odpowiedzi. Możesz również przekazać imię jako parametr zapytania:
curl "YOUR_FUNCTION_URL?name=YourName"
Powinno to zwrócić "Hello, YourName!"
Zrozumienie żądania i odpowiedzi HTTP
Gdy Cloud Function jest wywoływana przez żądanie HTTP, otrzymuje obiekt zawierający informacje o żądaniu. Obiekt ten zazwyczaj zawiera:
- Nagłówki: Nagłówki HTTP wysłane wraz z żądaniem.
- Treść: Treść żądania (np. dane JSON, dane formularza).
- Parametry zapytania: Parametry przekazywane w adresie URL.
- Metoda: Metoda HTTP (np. GET, POST, PUT, DELETE).
Funkcja powinna następnie zwrócić odpowiedź HTTP, która zawiera:
- Kod stanu: Kod stanu HTTP (np. 200 OK, 400 Bad Request, 500 Internal Server Error).
- Nagłówki: Nagłówki HTTP, które mają być wysłane wraz z odpowiedzią.
- Treść: Treść odpowiedzi (np. dane JSON, treść HTML).
Przykład: Obsługa różnych metod HTTP
Oto przykład, jak obsługiwać różne metody HTTP w Cloud Function:
Python (main.py):
from flask import escape
def http_method(request):
"""Responds to any HTTP request.
Args:
request (flask.Request): HTTP request object.
Returns:
The response text or any set of values that can be turned into a
Response object using
`make_response`<https://flask.palletsprojects.com/en/2.0.x/api/#flask.Flask.make_response>.
"""
if request.method == 'GET':
return 'This is a GET request!'
elif request.method == 'POST':
request_json = request.get_json(silent=True)
if request_json and 'message' in request_json:
message = escape(request_json['message'])
return f'This is a POST request with message: {message}'
else:
return 'This is a POST request without a message.'
else:
return 'Unsupported HTTP method.', 405
Node.js (index.js):
exports.httpMethod = (req, res) => {
switch (req.method) {
case 'GET':
res.status(200).send('This is a GET request!');
break;
case 'POST':
if (req.body.message) {
const message = req.body.message;
res.status(200).send(`This is a POST request with message: ${message}`);
} else {
res.status(200).send('This is a POST request without a message.');
}
break;
default:
res.status(405).send('Unsupported HTTP method!');
break;
}
};
Pamiętaj, aby wdrożyć zaktualizowaną funkcję za pomocą polecenia `gcloud functions deploy`.
Zabezpieczanie wyzwalaczy HTTP
Bezpieczeństwo jest najważniejsze podczas pracy z wyzwalaczami HTTP, zwłaszcza gdy masz do czynienia z poufnymi danymi lub krytycznymi operacjami. Oto kilka kluczowych kwestii dotyczących bezpieczeństwa:
Uwierzytelnianie i autoryzacja
Domyślnie Cloud Functions wywoływane przez HTTP są publicznie dostępne, jeśli używasz `--allow-unauthenticated`. W większości scenariuszy produkcyjnych będziesz chciał ograniczyć dostęp do autoryzowanych użytkowników lub usług. Google Cloud udostępnia kilka opcji uwierzytelniania i autoryzacji:
- Identity-Aware Proxy (IAP): IAP umożliwia kontrolowanie dostępu do Cloud Functions w oparciu o tożsamości Google. Wymaga od użytkowników uwierzytelnienia za pomocą kont Google przed uzyskaniem dostępu do funkcji.
- Konta serwisowe: Możesz przypisać konto serwisowe do Cloud Function i używać go do uwierzytelniania w innych usługach Google Cloud. Jest to przydatne do umożliwienia funkcji dostępu do zasobów, takich jak Cloud Storage lub Cloud Datastore.
- Niestandardowe uwierzytelnianie: Możesz zaimplementować własny mechanizm uwierzytelniania, taki jak JWT (JSON Web Token) lub klucze API. Daje to największą elastyczność, ale wymaga również większego nakładu pracy programistycznej.
Walidacja danych wejściowych
Zawsze sprawdzaj poprawność danych wejściowych odbieranych przez Cloud Function, aby zapobiec lukom w zabezpieczeniach, takim jak wstrzykiwanie SQL lub cross-site scripting (XSS). Użyj odpowiednich technik sanityzacji i maskowania, aby chronić się przed złośliwymi danymi wejściowymi.
HTTPS
Upewnij się, że Cloud Function jest dostępna tylko przez HTTPS, aby szyfrować komunikację między klientem a funkcją. Google Cloud Functions automatycznie udostępnia punkty końcowe HTTPS.
Ograniczanie szybkości
Zaimplementuj ograniczanie szybkości, aby zapobiec nadużyciom i atakom typu "odmowa usługi" (DoS). Możesz użyć usług takich jak Google Cloud Armor, aby chronić Cloud Functions przed nadmiernym ruchem.
Przypadki użycia dla wyzwalaczy HTTP
Wyzwalacze HTTP są wszechstronne i mogą być używane w szerokim zakresie aplikacji. Oto kilka typowych przypadków użycia:
- API REST: Twórz API RESTful dla aplikacji internetowych i mobilnych.
- Webhooki: Integruj się z usługami stron trzecich, odbierając zdarzenia webhook.
- Przetwarzanie formularzy: Przetwarzaj dane przesyłane za pośrednictwem formularzy HTML.
- Zmiana rozmiaru obrazu: Wyzwalaj zmianę rozmiaru obrazu, gdy nowe obrazy są przesyłane do Cloud Storage.
- Transformacja danych: Przekształcaj dane z jednego formatu na inny.
- Boty Slack: Twórz interaktywne boty Slack.
- Niestandardowe aplikacje internetowe: Obsługuj dynamiczną treść dla małych aplikacji internetowych lub mikroserwisów.
Przykłady z różnych branż
- E-commerce (globalny): Wyzwalacz HTTP może być używany do przetwarzania płatności z różnych bramek płatniczych na całym świecie, walidacji transakcji i aktualizacji statusów zamówień w czasie rzeczywistym. Funkcja może wykorzystywać informacje o geolokalizacji z żądania, aby zastosować odpowiednie podatki i stawki wysyłki w zależności od lokalizacji użytkownika.
- Finanse (bankowość międzynarodowa): Wyzwalacze HTTP mogą ułatwiać bezpieczne przelewy środków między różnymi rachunkami bankowymi na całym świecie, obsługując konwersje walut i przestrzegając międzynarodowych przepisów bankowych. Uwierzytelnianie jest tutaj kluczowe, potencjalnie obejmujące uwierzytelnianie wieloskładnikowe za pośrednictwem SMS-a lub aplikacji uwierzytelniających.
- Opieka zdrowotna (telemedycyna): Wyzwalacz HTTP może obsługiwać żądania umawiania wizyt od pacjentów z całego świata, koordynując różne strefy czasowe i zarządzając dostępnością lekarzy. Mógłby również integrować się z usługami tłumaczeniowymi, aby zapewnić obsługę wielojęzyczną. Prywatność danych i zgodność z przepisami, takimi jak HIPAA (w USA) lub GDPR (w Europie), są najważniejsze.
- Edukacja (platformy edukacji online): Wyzwalacze HTTP mogą być używane do automatycznego oceniania zadań, zapewniając natychmiastową informację zwrotną studentom niezależnie od ich lokalizacji. Mogą również wyzwalać spersonalizowane rekomendacje dotyczące uczenia się w oparciu o wyniki uczniów.
- Logistyka (wysyłka globalna): Wyzwalacze HTTP mogą być używane do śledzenia przesyłek w czasie rzeczywistym, zapewniając klientom na całym świecie aktualizacje dotyczące lokalizacji paczki i szacowanego czasu dostawy. Integracje z różnymi przewoźnikami za pomocą ich API za pośrednictwem wyzwalaczy HTTP są powszechne.
Zaawansowane techniki
Korzystanie ze zmiennych środowiskowych
Zmienne środowiskowe umożliwiają konfigurowanie Cloud Function bez wprowadzania na stałe poufnych informacji lub wartości konfiguracyjnych w kodzie. Możesz ustawić zmienne środowiskowe za pomocą polecenia `gcloud functions deploy` lub w konsoli Google Cloud.
gcloud functions deploy YOUR_FUNCTION_NAME \
--runtime python39 \
--trigger-http \
--set-env-vars API_KEY=YOUR_API_KEY,DATABASE_URL=YOUR_DATABASE_URL
W kodzie możesz uzyskać dostęp do zmiennych środowiskowych za pomocą słownika `os.environ` (Python) lub obiektu `process.env` (Node.js).
Python:
import os
def your_function(request):
api_key = os.environ.get('API_KEY')
# Use the API key in your function
return f'API Key: {api_key}'
Node.js:
exports.yourFunction = (req, res) => {
const apiKey = process.env.API_KEY;
// Use the API key in your function
res.status(200).send(`API Key: ${apiKey}`);
};
Obsługa zadań asynchronicznych
W przypadku długotrwałych lub wymagających obliczeniowo zadań najlepiej jest użyć przetwarzania asynchronicznego, aby uniknąć blokowania żądania HTTP. Możesz użyć usług takich jak Google Cloud Tasks lub Cloud Pub/Sub, aby przenieść te zadania do oddzielnych kolejek.
Obsługa błędów i rejestrowanie
Zaimplementuj solidną obsługę błędów i rejestrowanie w Cloud Functions, aby szybko identyfikować i rozwiązywać problemy. Użyj Google Cloud Logging, aby zbierać dzienniki z funkcji i monitorować ich wydajność.
Najlepsze praktyki
- Utrzymuj małe i skoncentrowane funkcje: Każda funkcja powinna mieć jeden, dobrze zdefiniowany cel.
- Używaj zarządzania zależnościami: Używaj menedżerów pakietów, takich jak `pip` (Python) lub `npm` (Node.js), do zarządzania zależnościami.
- Dokładnie testuj funkcje: Pisz testy jednostkowe i testy integracyjne, aby upewnić się, że funkcje działają poprawnie.
- Monitoruj wydajność funkcji: Użyj Google Cloud Monitoring, aby śledzić czas wykonywania funkcji, zużycie pamięci i wskaźniki błędów.
- Zoptymalizuj kod pod kątem zimnych startów: Zminimalizuj czas potrzebny na uruchomienie funkcji (zimny start). Można to osiągnąć, zmniejszając zależności, optymalizując kod i używając udostępnionej współbieżności (tam, gdzie jest dostępna).
- Rozważ lokalizację funkcji: Wdróż funkcje w regionie geograficznie bliskim użytkownikom, aby zminimalizować opóźnienia. Dla globalnej publiczności rozważ wdrożenie w wielu regionach.
Rozwiązywanie typowych problemów
- Nie można wdrożyć funkcji: Sprawdź, czy w kodzie nie ma błędów składni, upewnij się, że masz niezbędne uprawnienia i sprawdź, czy używasz obsługiwanego środowiska uruchomieniowego.
- Funkcja zwraca błąd 500: Sprawdź dzienniki funkcji w Google Cloud Logging pod kątem komunikatów o błędach. Typowe przyczyny to nieobsłużone wyjątki, brakujące zależności lub nieprawidłowa konfiguracja.
- Przekroczono limit czasu funkcji: Zwiększ wartość limitu czasu funkcji w konsoli Google Cloud lub za pomocą polecenia `gcloud functions deploy`. Zoptymalizuj również kod, aby skrócić czas wykonywania.
- Funkcja nie jest wyzwalana: Sprawdź, czy wyzwalacz jest poprawnie skonfigurowany i czy żądanie HTTP jest wysyłane na poprawny adres URL.
Podsumowanie
Google Cloud Functions z wyzwalaczami HTTP zapewniają potężny i elastyczny sposób budowania aplikacji bezserwerowych. Rozumiejąc koncepcje i techniki omówione w tym przewodniku, możesz wykorzystać moc Cloud Functions do tworzenia skalowalnych, opłacalnych i opartych na zdarzeniach rozwiązań dla globalnej publiczności. Wykorzystaj rewolucję bezserwerową i odblokuj pełny potencjał swoich aplikacji w chmurze!