DigitalOcean Functions — практическое руководство по serverless на DigitalOcean
Быстрые ссылки
- Поддерживаемые возможности
- Настройка окружения
- Создание функции
- Вызов и развёртывание функций
- Модификация функции
- Развёртывание в продакшн
- Краткое резюме
Что такое DigitalOcean Functions
DigitalOcean Functions — это встроенный механизм для запуска serverless-функций в облачной платформе DigitalOcean. Код выполняется по требованию при обращении к функции через HTTP-эндпоинт. Вам не нужно вручную выделять виртуальные машины или упаковывать контейнеры: платформа управляет хостингом и масштабированием.
Короткое определение: serverless — модель, где облачный провайдер управляет серверами, а вы платите за выполнение ваших функций по времени и памяти.
Важно: у Functions есть бесплатный слой: 25 GiB-часов в месяц. GiB-секунда рассчитывается как использование памяти, умноженное на время выполнения вызова.
Поддерживаемые возможности
Launched в мае 2022, Functions предоставляет следующие основные возможности:
- Автоматическое создание API-эндпоинтов для каждой функции. Каждый action получает URL.
- Интеграция с управляемыми базами данных DigitalOcean для постоянного хранения.
- CLI-инструменты (doctl + расширение serverless) для разработки, тестирования и развёртывания.
- Встроенный запуск в бэкенде App Platform — не нужно настраивать свой кластер.
Поддерживаемые рантаймы (на момент написания):
- Go 1.17
- Node.js 14
- Node.js 14 (совместим с AWS Lambda)
- PHP 8
- Python 3.9
Совет: выбирайте рантайм, с которым вы уверенно работаете. DigitalOcean может добавить больше рантаймов в будущем.
Когда Functions хороши, а когда они не подходят
Когда подходит:
- Лёгкие HTTP-API и webhook-обработчики.
- Асинхронные задачки, выполняющиеся быстро и редко.
- Микросервисы с небольшими зависимостями.
Когда избегать:
- Долгие вычисления, требующие минут или часов (может быть дорого и ограничено тайм-аутами).
- Приложения с жёсткими требованиями к локальному файловому хранению (stateless архитектура предпочтительна).
- Сценарии с высокой необходимостью детального контроля над ОС и сетью.
Альтернативы: если вы нуждаетесь в постоянных экземплярах или большем контроле, рассмотрите Droplets или Kubernetes.
Важно: serverless упрощает управление, но переносит ответственность за оптимизацию расходов и холодный старт на разработчика.
Настройка окружения (doctl + serverless)
Для работы с Functions вы можете использовать веб-консоль или doctl — CLI для DigitalOcean. В этой инструкции мы используем doctl и расширение serverless, потому что это даёт полный набор возможностей для разработки.
Требования:
- Аккаунт DigitalOcean
- Установленный doctl (последняя версия)
- SSH-ключи настроены (если планируете разворачивать через Git)
Установка расширения serverless для doctl:
$ doctl serverless installПример вывода установки (сокращённо):
Downloading…Unpacking…Installing…Cleaning up…
Done
Подключение serverless к аккаунту:
$ doctl serverless connectПример успешного подключения:
Connected to function namespace ‘fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a’ on API host ‘https://faas-lon1-917a94a7.doserverless.co’
Проверка статуса:
$ doctl serverless statusПример вывода:
Connected to function namespace ‘fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a’ on API host ‘https://faas-lon1-917a94a7.doserverless.co’
Sandbox version is 3.1.1-1.2.1
Комментарий: команда serverless является псевдонимом sandbox — они эквивалентны на текущий момент. Для консистентности мы используем serverless.

Создание функции: шаг за шагом
Создадим новый проект с шаблоном JavaScript:
$ doctl serverless init --language js demo-projectВывод:
A local sandbox area ‘demo-project’ was created for you.
По умолчанию doctl создаёт структуру с минимальным примером. Развернём содержимое каталога:
$ tree demo-projectПример структуры проекта:
demo-project
├── packages
│ └── sample
│ └── hello
│ └── hello.js
└── project.yml
3 directories, 2 filesФайл project.yml — основная конфигурация проекта и пакетов (actions).
Пример минимальной конфигурации (сжатый вид):
targetNamespace: ''
parameters: {}
packages:
- name: sample
environment: {}
parameters: {}
annotations: {}
actions:
- name: hello
binary: false
main: ''
runtime: 'nodejs:default'
web: true
parameters: {}
environment: {}
annotations: {}
limits: {}Объяснение полей (одно предложение на термин):
- targetNamespace: идентификатор пространства имён функций.
- packages: логическая группа функций.
- actions: отдельные функции/эндпоинты в пакете.
- runtime: среда выполнения (например nodejs:default).
- web: если true — функция доступна по HTTP.
- limits: ресурсы (CPU / память), которые можно задать для action.
Файл hello.js (примерный код, автоматически создан):
function main(args) {
let name = args.name || 'stranger'
let greeting = 'Hello ' + name + '!'
console.log(greeting)
return {"body": greeting}
}Объяснение: функция main получает объект args с параметрами запроса (GET/POST). Она должна вернуть объект, описывающий HTTP-ответ. Поле body становится телом ответа.
Вызов и локальное тестирование
Развёртывание из текущей директории:
$ doctl serverless deploy .Пример вывода:
Deploying ‘/home/james/@scratch/demo-project’
to namespace ‘fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a’
on host ‘https://faas-lon1-917a94a7.doserverless.co’
Deployment status recorded in ‘.nimbella’
Deployed functions (‘doctl sbx fn get
- sample/hello
Тестирование функции через doctl:
$ doctl serverless functions invoke sample/hello -p name:howtogeekПример ответа:
{
“body”: “Hello howtogeek!”
}
Параметр -p задаёт аргумент для функции.
Получение URL функции:
$ URL=$(doctl serverless functions get sample/hello --url)Далее можно выполнить HTTP-запрос:
$ curl $URL?name=howtogeekОжидаемый ответ: Hello howtogeek!
Модификация функции: пример с числовым значением
Изменим hello.js, чтобы функция умножала числовое значение и возвращала JSON с таймстемпом:
function main(args) {
return {
body: {
value: (args.value * 2),
timestamp: Date.now()
},
headers: {
"Content-Type": "application/json"
}
};
}Разверните изменения снова:
$ doctl serverless deploy .Теперь можно вызвать функцию как:
$ curl $URL?value=2Ожидаемый JSON:
{
“timestamp”: 1654784122966,
“value”: 4
}
Совет по разработке: вместо постоянного ручного deploy используйте команду watch, чтобы автоматически деплоить при изменениях файлов.
$ doctl serverless watch .Вы увидите сообщения о каждом новом развертывании после изменения файлов. Это ускоряет итерации.
Логирование и отладка
Вы можете стримить логи функции в реальном времени. Это полезно при падениях или неожиданных ошибках.
$ doctl serverless activations logs --follow --function sample/helloВывод будет содержать:
- вызовы функции;
- console.log и ошибки из стандартного вывода;
- метаданные активаций.
Рекомендации по логам:
- Добавляйте идентификаторы корреляции (requestId) для сложных сценариев;
- Не логируйте секреты и пароли;
- Выводите структурированный JSON для упрощённого парсинга.
Развёртывание в продакшн через App Platform
Команда serverless deploy удобна для локальной разработки, но для продакшна рекомендуется использовать App Platform и CI/CD с Git.
Шаги:
- Инициализируйте git-репозиторий в корне вашего Functions проекта:
$ git init
$ git remote add origin git@github.com:user/repo.git
$ git add .
$ git commit -m "initial commit"
$ git push -u origin master- В панели DigitalOcean откройте Apps → Create App.
- Подключите ваш репозиторий (GitHub/GitLab) и выберите репозиторий с project.yml.
- DigitalOcean автоматически обнаружит Functions проект при наличии project.yml в корне.
- Перейдите к обзору и нажмите Create Resources, чтобы создать ресурсы и запустить первое развертывание.
После успешного развёртывания ваши функции будут доступны по URL вида:
.ondigitalocean.app// Пример вызова развернутой функции:
$ curl https://sea-lion-app.7ougx.ondigitalocean.app/sample/hello?value=2Ожидаемый ответ:
{
“timestamp”: 1654786505969,
“value”: 4
}
Вы можете привязать собственный домен в настройках App Platform.
Безопасность, секреты и конфигурация
- Храните секреты в переменных окружения App Platform или в менеджере секретов; не кладите их в репозиторий.
- Используйте HTTPS и проверяйте входные данные для предотвращения инъекций.
- Минимизируйте разрешения сервисных аккаунтов и доступ к базам данных.
- Ограничьте ресурсы (limits) для функций, чтобы избежать деградации платформы.
Практическая рекомендация: вынесите доступ к БД через отдельный сервисный пользователь с минимальными правами.
Настройка project.yml: полезные поля и паттерны
Примеры конфигураций и комментарии:
- parameters: статические параметры, доступные в args.
- environment: переменные окружения для пакета/функции.
- annotations: дополнительные метаданные (например таймауты, политики).
- limits: можно задать память и CPU — задавайте их осознанно, это влияет на стоимость и производительность.
Минимализм: начните с небольших лимитов и увеличивайте по мере необходимости.
Мониторинг и SLA
DigitalOcean предоставляет базовые метрики и логи через App Platform. Для продакшна стоит настроить внешние метрики и оповещения:
- Латентность и время выполнения функций.
- Частота ошибок (5xx/4xx).
- Количество вызовов и потреблённые GiB-секунды.
Совет: экспорируйте метрики в Prometheus/Datadog, если нужна централизованная панель и алерты.
Отказоустойчивость и стратегии обработки ошибок
- Повторные попытки: для идемпотентных операций можно реализовать retry с экспоненциальной задержкой.
- Дед-letter: помещайте неудачные задачи в очередь/таблицу для дальнейшей обработки.
- Транзакции: при работе с БД используйте атомарные операции.
Тесты и критерии приёмки
Примеры тест-кейсов для функции multiply:
- Ввод корректного числа (value=2) → ожидается value=4.
- Ввод нуля (value=0) → ожидается value=0.
- Ввод нечислового значения (value=abc) → функция должна возвращать 400 и объяснение.
- Нагрузочный тест: серия вызовов параллельно — система должна сохранять корректность и держать допустимый p99.
Критерии приёмки:
- Функция возвращает корректный JSON и заголовок Content-Type: application/json.
- Заданные лимиты памяти выдерживают пиковую нагрузку без OOM.
- Логи содержат минимум необходимой информации для отладки.
Ручной запуск rollback и runbook при инциденте
Если после deploy приложения начинаются ошибки:
- Откатитесь на предыдущий коммит в Git и нажмите Redeploy в App Platform.
- Просмотрите логи активаций через doctl:
$ doctl serverless activations logs --function sample/hello --limit 50- Если ошибка связана с конфигурацией (переменные окружения), исправьте и redeploy.
- Если превышены лимиты, увеличьте ресурс в project.yml или App Platform и redeploy.
Миграция и совместимость
- Если у вас уже есть AWS Lambda, вы можете портировать код, особенно если используете Node.js с совместимыми обработчиками.
- Обратите внимание на различия в переменных окружения, логике и таймаутах.
Роль-базированные чеклисты
Для разработчика:
- Установлен doctl и подключено пространство имён.
- Функция проходит локальные тесты.
- Логи добавлены и не содержат секретов.
Для DevOps:
- Настроен CI/CD (Git → App Platform).
- Настроен мониторинг и алерты.
- Настроены бэкапы и доступы к БД.
Для специалиста по безопасности:
- Секреты хранятся в окружении.
- Минимальные права на сервисные аккаунты.
- Проведен скан безопасности зависимостей.
Примеры конфигураций и сниппеты
Простейший snippet project.yml для одной функции:
targetNamespace: ''
packages:
- name: sample
actions:
- name: hello
runtime: nodejs:default
web: true
main: hello/hello.jsИспользование doctl для получения URL:
$ doctl serverless functions get sample/hello --urlАвтоматическое развёртывание при изменениях (watch):
$ doctl serverless watch .Примеры проблем и как их решать (edge-case gallery)
Проблема: Функция возвращает пустой ответ.
Решение: Убедитесь, что функция возвращает объект с полем body. Проверьте логи на наличие исключений.
Проблема: Ошибки CORS при вызове из браузера.
Решение: Установите заголовки Access-Control-Allow-Origin в объект headers возвращаемого ответа.
Проблема: Пиковая нагрузка вызывает тайм-ауты.
Решение: Оптимизируйте код, добавьте бэк-оф, масштабирование и/или увеличьте лимит времени выполнения.
Glossary (однострочные определения)
- Action — отдельная функция/эндпоинт в пакете.
- Package — логическая группа функций в проекте.
- Runtime — среда выполнения (Node.js, Python и т.д.).
- project.yml — конфигурационный файл проекта Functions.
- doctl — официальная CLI DigitalOcean.
Социальная превью и короткое объявление
OG title: DigitalOcean Functions — быстрое руководство
OG description: Как создать, тестировать и развернуть serverless-функцию на DigitalOcean с doctl и App Platform.
Короткое объявление (100–200 слов):
DigitalOcean представил Functions — простой способ запускать serverless-код в экосистеме DigitalOcean. Эта статья шаг за шагом покажет установку расширения serverless для doctl, создание шаблона JavaScript-функции, локальное тестирование и развёртывание в App Platform. Вы узнаете, как настраивать project.yml, автоматизировать deploy с помощью watch, стримить логи и подготовиться к продакшн-развертыванию с использованием Git. Включены рекомендации по безопасности, отладке, мониторингу и приемочные критерии. Подходит для отдельных разработчиков и небольших команд, которым нужен быстрый путь к API без администрирования серверов.
Резюме
DigitalOcean Functions даёт простой путь для разработки и запуска serverless-функций внутри DigitalOcean. Используйте doctl для локальной разработки и App Platform для продакшн-развёртываний. Следуйте базовым практикам безопасности, автоматизируйте деплой и настраивайте мониторинг, чтобы обеспечить стабильность и управляемость ваших функций.
Важные выводы
- Начните с doctl и serverless-расширения.
- Используйте project.yml для конфигурации и контроля ресурсов.
- Автоматизируйте тестирование и deploy (watch, CI → App Platform).
- Настройте логирование и мониторинг до выхода в продакшн.