Выполнить действие по событию в Объектном хранилище

Объектное хранилище позволяет вызывать пользовательскую функцию при операциях с объектами. Настройка данной функциональности выполняется в два этапа:

  1. Настроить контейнер.
  2. Настроить реакцию serverless на события с пользовательскими объектами.

Настроить контейнер

  1. В панели управления перейдите в раздел Облачное хранилище ⟶ Хранилище ⟶ вкладка Контейнеры.
  2. Создайте контейнер. Мы рекомендуем использовать отдельные контейнеры для работы с Облачными функциями.
  3. Откройте страницу контейнера вкладка Настройки контейнера ⟶ карточка Управление доступом.
  4. Введите имя пользователя, выдайте права.
  5. Получите token для работы с Объектным хранилищем через API:

    curl -i -XGET https://api.selcdn.ru/auth/v1.0 -H "X-Auth-User: <user>" -H "X-Auth-Key: <password>"

    Укажите:

    • <user> — имя пользователя Объектного хранилища;
    • <password> — пароль пользователя Объектного хранилища. При успешном выполнении запроса токен будет указан в заголовке x-auth-token. Сохраните токен.
  6. Установите типы событий, за которыми надо следить:

    curl -i -XPOST https://api.selcdn.ru/v1/SEL_<domain_id>/<container_name> -H "X-Auth-Token: <token>" -H "X-Container-Meta-Notify-Lambda: <method>" -H "X-Container-Meta-Notify-Lambda-Glob: "

    Укажите:

    • <domain_id> — номер вашего аккаунта;
    • <container_name> — имя контейнера из шага 2;
    • <token> — полученный токен из шага 5;
    • <method> — один или несколько http-методов.

Настроить реакцию serverless на события

  1. Создайте новую облачную функцию.
  2. Создайте триггер на событие в Объектном хранилище. В этом примере функция будет вызвана на событие типа PUT:

    curl -XPUT ‘<https://ru-1.api.serverless.selcloud.ru/v1/feeds/create>’ -H "X-Auth-Token: <auth_token>"-H "project-id: project_id"  -d   ‘{"feed_action": "/whisk.system/kafkaS3Feed/kafkaS3Feed", "action_name": "<function_name>", "parameters": {"domainId": {domain_id}, "containerName": "container_name", "eventType": "PUT"}}’

    Укажите:

    • <auth_token> — токен для Облачной платформы (не путать с Токен Selectel). Подробнее о получении токена;
    • <project_id> — ID проекта Облачной платформы;
    • <function_name> — имя функции из шага 1;
    • <domain_id> — номер вашего аккаунта;
    • <container_name> — имя созданного контейнера.

Проверить работу

  1. В панели управления перейдите в раздел Облачное хранилище ⟶ Хранилище ⟶ вкладка Контейнеры.
  2. Откройте страницу контейнера ⟶ Объекты.
  3. Загрузите файл в созданный контейнер.
  4. В панели управления перейдите в раздел Облачная платформа ⟶ Функции.
  5. Откройте страницу функции вкладка Логи.

Заголовки контейнеров

Для того чтобы Облачное хранилище начало отправлять события при изменении пользовательских объектов, установите на контейнер следующие заголовки:

  • X-Container-Meta-Notify-Lambda: <method>[,method...] — в значении данного заголовка укажите http-методы для которых нужно генерировать событие.

    Поддерживаемые методы: PUT, DELETE, COPY.

    Метод PUT также включает в себя POST, то есть при запросе POST на объект будет сгенерировано событие PUT.

    Метод PUT с заголовком X-Copy-From генерирует PUT событие, а не COPY. Только запрос COPY с заголовком Destination генерирует COPY событие указывающее на объект назначения.

    По умолчанию события будут генерироваться для всех объектов в контейнере.

  • X-Container-Meta-Notify-Lambda-Glob: <glob> — опциональный заголовок, при его отсутствии события генерируются для всех объектов. В значении данного заголовка укажите паттерн, с которым будет сверяться имя объекта в контейнере.

    Заголовок позволяет сузить количество объектов в контейнере, для которых будет происходить генерация событий.

    Формат паттерна схож с shell-expansion в командной строке. Поддерживаются символы * для обозначения любого набора символов, кроме /, а также ? для обозначения любого символа, кроме /.

Примеры

События для всех объектов в контейнере

События генерируются при создании/изменении/удалении любого объекта в контейнере:

X-Container-Meta-Notify-Lambda: PUT,DELETE

События для одного каталога в контейнере

События генерируются при создании/изменении/удалении любого объекта в каталоге mydir, если его имя начинается с img_ и он имеет расширение .jpg:

X-Container-Meta-Notify-Lambda: PUT,DELETE
X-Container-Meta-Notify-Lambda-Glob: mydir/img_*.jpg

События только на создание/изменение объектов

События генерируются при создании/изменении любого объекта в корне контейнера, если он имеет расширение .txt:

X-Container-Meta-Notify-Lambda: PUT
X-Container-Meta-Notify-Lambda-Glob: *.txt