Розкрийте потенціал серверлесс-обчислень з Google Cloud Functions. Цей посібник розглядає HTTP-тригери, надаючи розробникам знання для створення масштабованих, подієво-орієнтованих додатків.
Google Cloud Functions: Повний посібник з HTTP-тригерів
Google Cloud Functions (GCF) – це серверлесс-середовище виконання, яке дозволяє створювати та з'єднувати хмарні сервіси. За допомогою Cloud Functions ви пишете прості функції з одним призначенням, які прикріплюються до подій, що виникають у вашій хмарній інфраструктурі та сервісах. Ваша функція виконується, коли відбувається подія, за якою ви спостерігаєте. Цей підхід дозволяє розробляти подієво-орієнтовані додатки без необхідності керувати серверами чи середовищами виконання.
Один із найпоширеніших способів запуску Cloud Function – це HTTP-запит. Цей посібник заглибиться у світ HTTP-тригерів у Google Cloud Functions, надавши вам знання для створення потужних, масштабованих та економічно ефективних додатків.
Що таке HTTP-тригери?
HTTP-тригер дозволяє виконувати вашу Cloud Function у відповідь на HTTP-запит. По суті, коли HTTP-запит надсилається на певну URL-адресу, Google Cloud Functions автоматично виконає пов'язану функцію. Це робить HTTP-тригери ідеальними для створення API, вебхуків та подієво-орієнтованих веб-додатків.
Ключові переваги використання HTTP-тригерів:
- Масштабованість: Cloud Functions автоматично масштабуються для обробки вхідних HTTP-запитів. Вам не потрібно турбуватися про виділення чи управління серверами.
- Економічна ефективність: Ви платите лише за час виконання вашої функції. Коли ваша функція неактивна, ви не несете жодних витрат.
- Простота використання: Cloud Functions спрощує процес розробки та розгортання. Ви можете зосередитися на написанні коду функції, а Google Cloud подбає про інфраструктуру.
- Інтеграція: HTTP-тригери дозволяють легко інтегрувати ваші Cloud Functions з іншими сервісами, такими як веб-додатки, мобільні додатки та сторонні API.
Створення Cloud Function з HTTP-тригером
Давайте пройдемо процес створення простої Cloud Function з HTTP-тригером. Ми створимо функцію, яка відповідає повідомленням "Hello, World!". Цей приклад може бути адаптований для різних глобальних локалей шляхом простої зміни вихідного рядка.
Передумови:
- Обліковий запис Google Cloud Platform (GCP).
- Встановлений та налаштований Google Cloud SDK (gcloud).
Кроки:
- Створіть новий проект (якщо у вас його немає):
Якщо у вас ще немає проекту GCP, створіть його в Google Cloud Console.
- Увімкніть Cloud Functions API:
У Cloud Console перейдіть до Cloud Functions API та увімкніть його.
- Створіть директорію для функції:
Створіть нову директорію для вашої Cloud Function. Наприклад:
mkdir hello-http cd hello-http
- Напишіть код функції:
Створіть файл з назвою `main.py` (або `index.js` для Node.js) із наступним кодом:
Python (main.py):
def hello_http(request): """HTTP Cloud Function. Args: request (flask.Request): Об'єкт запиту. Returns: Response text, or any set of values that can be turned into a Response object using `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}!`); };
- Створіть файл `requirements.txt` (лише для Python):
Якщо ви використовуєте Python, створіть файл `requirements.txt` і додайте будь-які залежності, які потрібні вашій функції. Для цього прикладу він не є строго необхідним, але це гарна практика включати його. Ви можете залишити його порожнім, якщо у вас немає залежностей.
- Розгорніть функцію:
Використовуйте команду `gcloud functions deploy` для розгортання вашої функції. Замініть `YOUR_FUNCTION_NAME` на бажану назву вашої функції.
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
Пояснення параметрів:
- `YOUR_FUNCTION_NAME`: Назва, яку ви хочете дати вашій Cloud Function.
- `--runtime`: Середовище виконання для вашої функції (наприклад, `python39`, `nodejs16`).
- `--trigger-http`: Вказує, що функція повинна запускатися HTTP-запитами.
- `--allow-unauthenticated`: Дозволяє будь-кому викликати функцію без автентифікації. Увага: Використовуйте обережність при ввімкненні цього в робочих середовищах! Розгляньте можливість реалізації належної автентифікації та авторизації.
- Протестуйте функцію:
Після розгортання команда `gcloud` виведе URL-адресу вашої функції. Потім ви можете протестувати її, надіславши HTTP-запит на цю URL-адресу за допомогою таких інструментів, як `curl` або Postman.
curl YOUR_FUNCTION_URL
Ви повинні побачити повідомлення "Hello, World!" у відповіді. Ви також можете передати ім'я як параметр запиту:
curl "YOUR_FUNCTION_URL?name=YourName"
Це повинно повернути "Hello, YourName!"
Розуміння HTTP-запиту та відповіді
Коли Cloud Function запускається HTTP-запитом, вона отримує об'єкт, що містить інформацію про запит. Цей об'єкт зазвичай включає:
- Заголовки: HTTP-заголовки, надіслані із запитом.
- Тіло: Тіло запиту (наприклад, JSON-дані, дані форми).
- Параметри запиту: Параметри, передані в URL.
- Метод: HTTP-метод (наприклад, GET, POST, PUT, DELETE).
Ваша функція повинна повернути HTTP-відповідь, яка включає:
- Код статусу: HTTP-код статусу (наприклад, 200 OK, 400 Bad Request, 500 Internal Server Error).
- Заголовки: HTTP-заголовки, які потрібно надіслати з відповіддю.
- Тіло: Тіло відповіді (наприклад, JSON-дані, HTML-вміст).
Приклад: Обробка різних HTTP-методів
Ось приклад того, як обробляти різні HTTP-методи у вашій 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`.
"""
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;
}
};
Не забудьте розгорнути оновлену функцію за допомогою команди `gcloud functions deploy`.
Захист ваших HTTP-тригерів
Безпека є першочерговою при роботі з HTTP-тригерами, особливо при обробці конфіденційних даних або критичних операцій. Ось деякі ключові аспекти безпеки:
Автентифікація та Авторизація
За замовчуванням Cloud Functions, що запускаються через HTTP, загальнодоступні, якщо ви використовуєте `--allow-unauthenticated`. У більшості робочих сценаріїв ви захочете обмежити доступ авторизованим користувачам або сервісам. Google Cloud надає кілька варіантів автентифікації та авторизації:
- Identity-Aware Proxy (IAP): IAP дозволяє керувати доступом до ваших Cloud Functions на основі ідентичностей Google. Він вимагає від користувачів автентифікації за допомогою своїх облікових записів Google перед доступом до функції.
- Облікові записи сервісів: Ви можете призначити обліковий запис сервісу вашій Cloud Function і використовувати його для автентифікації з іншими сервісами Google Cloud. Це корисно для надання вашій функції доступу до ресурсів, таких як Cloud Storage або Cloud Datastore.
- Власна автентифікація: Ви можете реалізувати власний механізм автентифікації, такий як JWT (JSON Web Token) або API-ключі. Це дає вам найбільшу гнучкість, але також вимагає більше зусиль на розробку.
Валідація вхідних даних
Завжди валідуйте вхідні дані, отримані вашою Cloud Function, щоб запобігти вразливостям безпеки, таким як SQL-ін'єкції або міжсайтовий скриптинг (XSS). Використовуйте відповідні методи очищення та екранування для захисту від зловмисного введення.
HTTPS
Переконайтеся, що ваша Cloud Function доступна лише через HTTPS для шифрування зв'язку між клієнтом і функцією. Google Cloud Functions автоматично надає HTTPS-кінцеві точки.
Обмеження швидкості
Реалізуйте обмеження швидкості для запобігання зловживанню та атакам типу "відмова в обслуговуванні" (DoS). Ви можете використовувати такі сервіси, як Google Cloud Armor, для захисту ваших Cloud Functions від надмірного трафіку.
Випадки використання HTTP-тригерів
HTTP-тригери є універсальними і можуть використовуватися в широкому спектрі додатків. Ось деякі поширені випадки використання:
- REST API: Створюйте RESTful API для ваших веб- та мобільних додатків.
- Вебхуки: Інтегруйтеся зі сторонніми сервісами, отримуючи події вебхуків.
- Обробка форм: Обробляйте дані, надіслані через HTML-форми.
- Зміна розміру зображень: Запускайте зміну розміру зображень при завантаженні нових зображень до Cloud Storage.
- Перетворення даних: Перетворюйте дані з одного формату в інший.
- Slack-боти: Створюйте інтерактивні Slack-боти.
- Власні веб-додатки: Надавайте динамічний вміст для невеликих веб-додатків або мікросервісів.
Приклади в різних галузях
- Електронна комерція (світова): HTTP-тригер може використовуватися для обробки платежів від різних платіжних шлюзів по всьому світу, валідуючи транзакції та оновлюючи статуси замовлень у реальному часі. Функція може використовувати інформацію про геолокацію із запиту для застосування відповідних податків та тарифів на доставку на основі місцезнаходження користувача.
- Фінанси (міжнародне банківське обслуговування): HTTP-тригери можуть полегшувати безпечні перекази коштів між різними банківськими рахунками по всьому світу, обробляючи конвертацію валют та дотримуючись міжнародних банківських правил. Автентифікація тут має вирішальне значення, потенційно включаючи багатофакторну автентифікацію через SMS або додатки-автентифікатори.
- Охорона здоров'я (телемедицина): HTTP-тригер може обробляти запити на планування прийомів від пацієнтів з усього світу, координуючи роботу з різними часовими поясами та керуючи доступністю лікарів. Він також може інтегруватися зі службами перекладу для надання багатомовної підтримки. Конфіденційність даних та дотримання нормативних актів, таких як HIPAA (у США) або GDPR (у Європі), є надзвичайно важливими.
- Освіта (Платформи онлайн-навчання): HTTP-тригери можуть використовуватися для автоматичного оцінювання завдань, надаючи миттєвий відгук студентам незалежно від їхнього місцезнаходження. Вони також можуть запускати персоналізовані рекомендації щодо навчання на основі успішності студентів.
- Логістика (Світова доставка): HTTP-тригери можуть використовуватися для відстеження відправлень у реальному часі, надаючи клієнтам по всьому світу оновлену інформацію про місцезнаходження посилок та очікувані терміни доставки. Часто зустрічаються інтеграції з різними службами доставки через їхні API за допомогою HTTP-тригерів.
Розширені техніки
Використання змінних середовища
Змінні середовища дозволяють налаштувати вашу Cloud Function без вбудовування конфіденційної інформації або конфігураційних значень у ваш код. Ви можете встановити змінні середовища за допомогою команди `gcloud functions deploy` або в Google Cloud Console.
gcloud functions deploy YOUR_FUNCTION_NAME \
--runtime python39 \
--trigger-http \
--set-env-vars API_KEY=YOUR_API_KEY,DATABASE_URL=YOUR_DATABASE_URL
У вашому коді ви можете отримати доступ до змінних середовища за допомогою словника `os.environ` (Python) або об'єкта `process.env` (Node.js).
Python:
import os
def your_function(request):
api_key = os.environ.get('API_KEY')
# Використовуйте API-ключ у вашій функції
return f'API Key: {api_key}'
Node.js:
exports.yourFunction = (req, res) => {
const apiKey = process.env.API_KEY;
// Використовуйте API-ключ у вашій функції
res.status(200).send(`API Key: ${apiKey}`);
};
Обробка асинхронних завдань
Для тривалих або обчислювально інтенсивних завдань найкраще використовувати асинхронну обробку, щоб уникнути блокування HTTP-запиту. Ви можете використовувати такі сервіси, як Google Cloud Tasks або Cloud Pub/Sub, для вивантаження цих завдань у окремі черги.
Обробка помилок та логування
Реалізуйте надійну обробку помилок та логування у ваших Cloud Functions, щоб швидко виявляти та вирішувати проблеми. Використовуйте Google Cloud Logging для збору журналів з ваших функцій та моніторингу їхньої продуктивності.
Найкращі практики
- Зберігайте функції маленькими та сфокусованими: Кожна функція повинна мати одне, чітко визначене призначення.
- Використовуйте управління залежностями: Використовуйте менеджери пакетів, такі як `pip` (Python) або `npm` (Node.js), для управління вашими залежностями.
- Ретельно тестуйте свої функції: Пишіть юніт-тести та інтеграційні тести, щоб переконатися, що ваші функції працюють правильно.
- Моніторте продуктивність функцій: Використовуйте Google Cloud Monitoring для відстеження часу виконання функцій, використання пам'яті та рівня помилок.
- Оптимізуйте код для "холодних" запусків: Мінімізуйте час, необхідний для запуску вашої функції ("холодний" запуск). Це можна досягти шляхом зменшення залежностей, оптимізації коду та використання резервованої паралельності (де це можливо).
- Розгляньте розташування функції: Розгортайте ваші функції в регіоні, який географічно близький до ваших користувачів, щоб мінімізувати затримку. Для глобальної аудиторії розгляньте можливість розгортання в кількох регіонах.
Вирішення поширених проблем
- Функція не розгортається: Перевірте на наявність синтаксичних помилок у вашому коді, переконайтеся, що у вас є необхідні дозволи, та підтвердьте, що ви використовуєте підтримуване середовище виконання.
- Функція повертає помилку 500: Перевірте журнали функції в Google Cloud Logging на наявність повідомлень про помилки. Поширені причини включають необроблені винятки, відсутні залежності або неправильну конфігурацію.
- Функція перевищує час очікування: Збільште значення часу очікування функції в Google Cloud Console або за допомогою команди `gcloud functions deploy`. Також оптимізуйте ваш код, щоб зменшити час виконання.
- Функція не запускається: Переконайтеся, що тригер налаштовано правильно і що HTTP-запит надсилається на правильну URL-адресу.
Висновок
Google Cloud Functions з HTTP-тригерами надають потужний і гнучкий спосіб створення серверлесс-додатків. Розуміючи концепції та методи, обговорені в цьому посібнику, ви можете використовувати потужність Cloud Functions для створення масштабованих, економічно ефективних та подієво-орієнтованих рішень для глобальної аудиторії. Прийміть революцію серверлес та розкрийте повний потенціал ваших хмарних додатків!