Гид по технологиям

DigitalOcean Functions — практическое руководство по serverless на DigitalOcean

9 min read Облако Обновлено 19 Dec 2025
DigitalOcean Functions — руководство по serverless
DigitalOcean Functions — руководство по serverless

Быстрые ссылки

  • Поддерживаемые возможности
  • Настройка окружения
  • Создание функции
  • Вызов и развёртывание функций
  • Модификация функции
  • Развёртывание в продакшн
  • Краткое резюме

Что такое 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.

Логотип DigitalOcean в абстрактном круге

Создание функции: шаг за шагом

Создадим новый проект с шаблоном 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 –url’ for URL):

  • 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.

Шаги:

  1. Инициализируйте 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
  1. В панели DigitalOcean откройте Apps → Create App.
  2. Подключите ваш репозиторий (GitHub/GitLab) и выберите репозиторий с project.yml.
  3. DigitalOcean автоматически обнаружит Functions проект при наличии project.yml в корне.
  4. Перейдите к обзору и нажмите 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 приложения начинаются ошибки:

  1. Откатитесь на предыдущий коммит в Git и нажмите Redeploy в App Platform.
  2. Просмотрите логи активаций через doctl:
$ doctl serverless activations logs --function sample/hello --limit 50
  1. Если ошибка связана с конфигурацией (переменные окружения), исправьте и redeploy.
  2. Если превышены лимиты, увеличьте ресурс в 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).
  • Настройте логирование и мониторинг до выхода в продакшн.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как сделать коллаж на iPhone
Фотография

Как сделать коллаж на iPhone

Переименование файлов в Linux — руководство
Linux

Переименование файлов в Linux — руководство

Ярлыки папок в меню Пуск Windows 10
Windows 10

Ярлыки папок в меню Пуск Windows 10

Настройка видов папок в Outlook
Productivity

Настройка видов папок в Outlook

Назначить клавишу Windows в Windows 10
Windows

Назначить клавишу Windows в Windows 10

Как настроить фон Backdrop на Chromecast и Android TV
How-to

Как настроить фон Backdrop на Chromecast и Android TV