Lambda Scripts

Lambda Scripts — это вычислительный ресурс, позволяющий загрузить ваш собственный код и запустить его в ответ на определенные условия.

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

Скрипты можно использовать для расширения функционала Carrot quest с помощью индивидуального кода и создания собственных интеграций. Работает на базе технологии AWS Lambda.

На данный момент доступны две среды выполнения:

  • Python 2.7
  • JavaScript (NodeJS v0.10.36)

ОС: Amazon Limux AMI. Версия ядра Linux: 3.14.48-33.39.amzn1.x86_64.

Более подробную информацию о лежащих в основе технологиях можно узнать в документации к AWS Lambda.

  1. Сценарии использования
  2. Создание нового скрипта
  3. Написание кода скрипта
  4. Запуск скрипта
  5. Content-Type
  6. Асинхронный вызов
  7. Примеры

Сценарии использования

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

  1. Использовать лямбда скрипт как webhook в стороннем сервисе. Тем самым проще соединять другие сервисы с Carrot quest

  2. Использовать как адрес для webhook в нашем же сервисе — можно преобразовать данные в нужный формат, тем самым более гибко соединять Carrot quest с другими сервисами

  3. Периодически выполнять скрипт (например, синхронизировать базу лидов с другим сервисом)

Создание нового скрипта

Скрипты создаются в разделе "Интеграции", группа "Интеграции своими руками".

После создания скрипта будет доступен URL, по которому будет находиться ваш скрипт. Адрес формируется следующим образом:

https://lambda-script.carrotquest.io/{id}/{token}/{run-type}

{id} содержит идентификатор интеграции

{token} токен скрипта

{run-type} может принимать два значения:

  • sync при вызове скрипт будет выполнен синхронно и вернет результат
  • async скрипт будет выполнен асинхронно без возврата результата

Написание кода скрипта

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

Входной функции будет передано два параметра: event и context:

  • event будет содержать параметры, с которыми был вызван ваш скрипт:

    • event.method будет содержать HTTP-метод
    • event.query будет содержать GET-параметры
    • event.body будет содержать POST-параметры

    • Для Python event будет иметь тип dict, для JavaScript — Object

  • context содержит служебную информацию (подробнее для Python, для JavaScript)

Пример скрипта

Этот скрипт записывает строку в лог и возвращает HTTP-метод, который был использован для вызова:

# Python
def run(event, context):
    print 'Hello, world!'
    return 'I was invoked via %s!' % event['method']


// JavaScript
exports.run = function(event, context) {
    console.log('Hello, console');
    context.succeed('I was invoked via %s!' % event.method);
}

Для Python event будет иметь тип dict, для JavaScript — Object.

Запуск скрипта

После создания скрипта в панели администратора ему присваивается уникальный URL. Например: https://lambda-script.carrotquest.io/162/2f8efdb8-7bfb-4494-b913-f320a5eb7c74/sync.

По этому URL можно выполнять HTTP-запросы типа GET, POST, PATCH, PUT или DELETE.

Попробуем сделать тестовый запрос:

curl -X POST \
  --data-urlencode "param1=value1" \
  --data-urlencode "param2=value2" \
  https://lambda-script.carrotquest.io/my/func/sync?param3=value3

Будет вызван ваш скрипт, в котором параметр event будет таким:

{
    "method": "POST",
    "body": {
        "param2": "value2",
        "param1": "value1"
    },
    "query": {
        "param3": "value3"
    }
}

Content-Type

Мы поддерживаем следующие типы кодировок тела HTTP-запроса:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json

Для первых двух отдельные параметры будет соответствовать ключам в объекте event.body.

При использовании application/json тело запроса будет без изменений скопировано в event.body.

Если есть несколько GET или POST параметров с одинаковым именем, то они будут объединены в массив. Например:

curl https://lambda-script.carrotquest.io/my/func/sync?x=1&x=2&y=3
{
    "method": "GET",
    "body": {},
    "query": {
        "x": ["1", "2"],
        "y": 3
    }
}

Асинхронный вызов

В некоторых случаях не нужно дожидаться результата работы lambda-скрипта. Например, вы пишете обработчик webhook стороннего сервиса и нет необходимости возвращать какое-то значение.

При асинхронном запросе будет запущен скрипт на выполнение, а затем немедленно возвращен ответ со статусом 200.

Чтобы вызвать скрипт асинхронно, нужно заменить последнюю часть адреса sync на async. Пример асинхронного адреса:

https://lambda-script.carrotquest.io/162/xxxx-xxxx/async

Примеры

Для тестирования параметра events вы можете использовать тестовый скрипт: https://lambda-script.carrotquest.io/shared/echo/sync.

curl -X GET "https://lambda-script.carrotquest.io/shared/echo/sync?x=10"
{
  "body": {},
  "query": {
    "x": "10"
  },
  "method": "GET"
}