Поиск по сайту:

Как начать работу с бессерверными функциями DigitalOcean


Functions — одно из новейших дополнений к облачной платформе DigitalOcean. Он предоставляет первоклассный метод разработки бессерверных функций, не покидая DigitalOcean. Ваш код выполняется по запросу, когда он вызывается, что исключает ручную подготовку и обслуживание сервера.

В этой статье мы объясним, что поддерживает DigitalOcean Functions, и продемонстрируем создание вашей собственной простой функции. У функций есть уровень бесплатного пользования, который обеспечивает 25 ГиБ-часов в месяц, при этом ГиБ-секунда рассчитывается как потребление памяти, умноженное на время выполнения каждого вызова функции.

Поддерживаемые функции

Сервис Functions, запущенный в мае 2022 года, предоставляет клиентам DigitalOcean встроенную возможность запуска бессерверных рабочих нагрузок. Каждая функция получает свою собственную конечную точку API, которая запускает созданный вами код. Вам не нужно настраивать собственные серверы или помещать проект в контейнер перед развертыванием. Live-функции размещаются на серверной части платформы приложений DigitalOcean.

Функции могут интегрироваться с управляемыми базами данных DigitalOcean для облегчения постоянного хранения данных. Они также поставляются с комплексным интерфейсом командной строки, который позволяет развертывать и тестировать код в терминале.

Первоначальная версия платформы поддерживает пять различных сред программирования:

  • Перейти 1.17
  • Node.js 14
  • Node.js 14 (совместим с функциями AWS Lambda)
  • PHP 8
  • Питон 3.9

Вам нужно уметь писать код на одном из этих языков, чтобы развернуть его как функцию. В будущем может поддерживаться больше сред выполнения.

Подготовка

Можно запускать новые функции с помощью веб-панели управления DigitalOcean или Doctl, его интерфейса командной строки, ориентированного на разработчиков. Для целей этой статьи мы сосредоточимся на подходе Doctl на основе терминала. Это раскрывает все возможности функций и является предполагаемым путем для всех случаев использования, кроме самых простых. Прежде чем продолжить, убедитесь, что у вас установлена последняя версия Doctl и вы прошли аутентификацию в своей учетной записи DigitalOcean.

Вам нужно будет выполнить некоторые дополнительные шаги по настройке, если вы впервые используете функции DigitalOcean. Сначала завершите установку расширения serverless для Doctl. Это добавляет полную поддержку для разработки и развертывания функций.

$ doctl serverless install
Downloading...Unpacking...Installing...Cleaning up...
Done

Затем подключите бессерверные функции к своей учетной записи DigitalOcean:

$ doctl serverless connect
Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co'

Теперь вы должны быть готовы начать писать функции. Запустите команду serverless status, чтобы проверить, все ли работает:

$ 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. На момент написания эти два ключевых слова имели одинаковую функциональность и взаимозаменяемо использовались в документации DigitalOcean. В этом руководстве мы используем стандарт serverless.

Создание функции

Используйте следующую команду для создания нового проекта Functions:

$ doctl serverless init --language js demo-project
A local sandbox area 'demo-project' was created for you.
You may deploy it by running the command shown on the next line:
  doctl sandbox deploy demo-project

Эта команда создает новую функцию JavaScript в demo-project в вашем рабочем каталоге. Просмотрите содержимое этого каталога, чтобы увидеть, что Doctl подготовил для вас:

$ tree demo-project
demo-project
├── packages
│   └── sample
│       └── hello
│           └── hello.js
└── project.yml

3 directories, 2 files

В файле project.yml вы настраиваете проект функций и предоставляемые им конечные точки.

targetNamespace: ''
parameters: {}
packages:
  - name: sample
    environment: {}
    parameters: {}
    annotations: {}
    actions:
      - name: hello
        binary: false
        main: ''
        runtime: 'nodejs:default'
        web: true
        parameters: {}
        environment: {}
        annotations: {}
        limits: {}

Начальный шаблон настраивает один пакет с именем sample. В этом пакете есть одно действие (конечная точка) с именем hello, которое выполняется с использованием среды выполнения Node. Исходный код этого действия хранится в packages/sample/hello/hello.js. Давайте посмотрим на этот файл дальше:

function main(args) {
    let name = args.name || 'stranger'
    let greeting = 'Hello ' + name + '!'
    console.log(greeting)
    return {"body": greeting}
}

Это обычный код JavaScript. Функция main() будет вызываться каждый раз при вызове вашей функции. Он получает объект, содержащий аргументы, представленные в виде данных HTTP GET и POST в запросе пользователя. Вы также можете настроить статические аргументы, используя поле parameters для действий, пакетов и проекта верхнего уровня в вашем файле project.yml.

Функции должны возвращать объект, описывающий ответ 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 <funcName> --url' for URL):
  - sample/hello

Команда serverless deploy принимает один аргумент — путь к каталогу, содержащему ваши функции. Используйте ., когда корень вашего проекта уже является вашим рабочим каталогом.

Теперь вы можете протестировать свою функцию с помощью CLI:

$ doctl serverless functions invoke sample/hello -p name:howtogeek
{
    "body": "Hello howtogeek!"
}

Параметр -p задает аргумент, который передается вашему коду. Этот пример демонстрирует, как возвращаемое значение вашей функции становится телом ответа HTTP.

Затем попробуйте сделать реальный запрос API к вашей функции. Вы можете узнать его URL-адрес с помощью следующей команды:

$ URL=$(doctl serverless functions get sample/hello --url)

Используйте curl или свой любимый HTTP-клиент, чтобы добраться до этой конечной точки:

$ curl $URL?name=howtogeek
Hello howtogeek!

Параметр строки запроса name успешно передан функции.

Изменение вашей функции

Пока что мы используем пример кода DigitalOcean без каких-либо изменений. Это не уведет вас далеко в вашем бессерверном путешествии! Отредактируйте файл hello.js, чтобы он выглядел следующим образом:

function main(args) {
    return {
        body: {
            value: (args.value * 2),
            timestamp: Date.now()
        },
        headers: {
            "Content-Type": "application/json"
        }
    };
}

Повторно разверните свою функцию:

$ doctl serverless deploy .

Эта функция наивно удваивает число, заданное параметром запроса value. Он также включает отметку времени для каждого тела ответа. Поле headers используется в объекте ответа для применения правильного JSON Content-Type.

Вы можете вызвать эту функцию с помощью Doctl или curl в том же стиле, что и раньше:

$ curl $URL?value=2
{
  "timestamp": 1654784122966,
  "value": 4
}

Повторное развертывание функции вручную после каждого изменения утомительно и требует много времени. Запустите команду watch во время работы, чтобы автоматически внедрять изменения после изменения файлов:

$ doctl serverless watch .
Watching '.' [use Control-C to terminate]

Держите окно терминала открытым во время разработки своей функции. Каждое новое развертывание будет регистрировать сообщение, чтобы вы знали, когда можно протестировать свои изменения. Это облегчает эффективную итерацию по мере разработки ваших функций.

Вы также можете передавать журналы из своих функций. Это бесценно, когда функция дает сбой или ведет себя не так, как вы ожидали. Запустите эту команду, чтобы получить доступ к журналам, связанным с вашей демонстрационной функцией:

$ doctl serverless activations logs --follow --function sample/hello

При каждом вызове функции будет выводиться новая строка. Журналы также включают сообщения, которые ваш код отправляет в стандартный вывод среды и потоки ошибок.

Развертывание в рабочей среде

Команда serverless deploy в настоящее время предназначена только для разработчиков. Вы можете развернуть его в рабочей среде, создав репозиторий Git для своего проекта «Функции» и запустив его с помощью платформы приложений DigitalOcean.

Создайте новый проект на GitHub или GitLab и загрузите свой код:

$ 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 и нажмите ссылку «Приложения» на левой боковой панели. Нажмите появившуюся кнопку «Создать приложение». На следующем экране следуйте инструкциям, чтобы подключиться к своей учетной записи GitHub и выбрать новый репозиторий. Нажмите синюю кнопку «Далее».

DigitalOcean автоматически обнаружит ваш репозиторий как проект Functions, если у вас есть project.yml в его корне. Нажмите кнопку «Перейти к просмотру», чтобы продолжить.

Следующий экран должен подтвердить, что вам будет выставлен счет с использованием плана «Функции».

Нажмите «Создать ресурсы», чтобы подготовить приложение и начать его первое развертывание. Прогресс будет отображаться на панели инструментов.

Конечные точки вашей функции станут общедоступными после завершения развертывания. Вы можете найти домен ondigitalocean.app вашего приложения по умолчанию, прокрутив вниз страницу настроек приложения на панели инструментов. В нашем примере домен приложения — sea-lion-app.7ougx.ondigitalocean.app.

Функции автоматически отображаются как URI следующего формата:

<app>.ondigitalocean.app/<function-package>/<function-action>

Вы можете вызвать образец функции, созданный ранее, выполнив следующий запрос:

$ curl https://sea-lion-app.7ougx.ondigitalocean.app/sample/hello?value=2
{
  "timestamp": 1654786505969,
  "value": 4
}

Функция успешно развернута! Теперь вы можете использовать вкладку «Домены» в настройках вашего приложения, чтобы прикрепить собственный домен вместо домена по умолчанию.

Краткое содержание

DigitalOcean Functions — новейший конкурент на все более переполненной арене бессерверных функций. Платформа позволяет разрабатывать функциональные возможности на стороне сервера без управления виртуальными машинами или контейнеризации кода вручную.

Functions предоставляет комплексный интерфейс командной строки для создания и тестирования конечных точек. Затем вы можете развернуть свои функции в существующем решении платформы приложений DigitalOcean либо как отдельный проект, либо как часть более крупного приложения.

После того, как вы запустили базовую функцию, вы можете обратиться к документации DigitalOcean, чтобы приступить к настройке более продвинутого поведения. Вы можете настроить переменные среды, несколько действий и ограничения ресурсов, используя поля в файле project.yml, что дает вам быстрый и простой способ создания относительно сложных конечных точек по запросу.




Все права защищены. © Linux-Console.net • 2019-2024