Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Monitoring
  • Начало работы
    • Все инструкции
      • Создание алерта
      • Создание канала уведомлений с получателем
      • Создание канала уведомлений с вызовом функции
      • Создание webhook с вызовом внешнего API
      • Создание политики эскалаций
      • Удаление алерта
  • Управление доступом
  • Справочник Terraform
  • История изменений
  • Обучающие курсы

В этой статье:

  • Создание сервисного аккаунта
  • Создание функции
  • Создание канала
  • Создание алерта
  • Проверка вызова функции
  1. Пошаговые инструкции
  2. Работа с алертами
  3. Создание webhook с вызовом внешнего API

Webhook с использованием Cloud Functions

Статья создана
Yandex Cloud
Обновлена 25 марта 2025 г.
  • Создание сервисного аккаунта
  • Создание функции
  • Создание канала
  • Создание алерта
  • Проверка вызова функции

Для автоматической обработки инцидентов и других событий в вашем облаке вы можете вызывать в Yandex Monitoring функции Cloud Functions. В этом разделе приведен пример настройки webhook с отправкой POST-запросов при срабатывании алерта. Таким образом при срабатывании алерта вы можете вызывать методы внешнего API. Так же можно вызывать функции Cloud Functions в эскалациях.

Чтобы отправлять POST-запросы при срабатывании алерта:

  1. Разверните сервис для обработки POST-запросов со следующими атрибутами:

    • https://my.url/route/for/alarm — URL для обработки запроса, когда алерт переходит в статус Alarm;
    • https://my.url/route/for/ok — URL для обработки запроса, когда алерт переходит в статус Ok;
    • my_secret_token — токен или файл с токеном для авторизации вызовов.

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

  2. Создайте сервисный аккаунт для вызова функции.

  3. Создайте функцию, которая отправляет POST-запросы при переходе алерта в статус Alarm и Ok.

  4. Создайте канал, который будет вызывать функцию.

  5. Создайте алерт, который будет отправлять уведомления в канал с функцией.

  6. Проверьте работу функции.

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

Консоль управления
  1. В консоли управления перейдите в каталог с ресурсами, которые надо отслеживать в Monitoring.
  2. В списке сервисов выберите Identity and Access Management.
  3. Нажмите кнопку Создать сервисный аккаунт.
  4. Введите имя сервисного аккаунта, например sa-alert-webhook.
  5. Добавьте роли functions.functionInvoker и functions.viewer.
  6. Нажмите кнопку Создать.

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

Консоль управления
  1. В списке сервисов выберите Cloud Functions.

  2. Нажмите кнопку Создать функцию.

  3. Введите имя функции, например alert-webhook.

  4. Нажмите кнопку Создать.

  5. Создайте версию функции:

    1. Выберите среду выполнения Python, отключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.

    2. Выберите способ Редактор кода.

    3. Нажмите Создать файл и введите имя файла, например index.

    4. Введите код функции, указав URL для обработки POST-запросов и токен:

      import json
      import requests
      
      WEBHOOK_ALARM_URL = "https://my.url/route/for/alarm"
      WEBHOOK_OK_URL = "https://my.url/route/for/ok"
      WEBHOOK_AUTH_TOKEN = "my_secret_token"
      
      def webhook(url, alert_id):
          headers_ = {
              "Authorization": f"OAuth {WEBHOOK_AUTH_TOKEN}",
              "Content-type": "application/json"
          }
          try:
              response = requests.post(url, headers = headers_, json = { "alert_id" : alert_id })
              if response.ok:
                  return { "status": "OK", "url": url, "response": json.dumps(response.json)}
              else:
                  return { "status": "ERROR", "url": url, "code": response.status_code, "error": response.text}
          except Exception as e:
              return { "status": "EXCEPTION", "url": url, "error": e}
          
      
      def handler(event, context):
          alert = event # сохраним event в переменную alert для удобства
          required_attributes = ["alertId", "status"] # массив с обязательными входными параметрами в формате JSON
          
          # если на вход функции не передан JSON или в нем отсутствуют нужные параметры, функция не выполняется
          if not alert or all(attr in required_attributes for attr in alert):
              return
          
          result = None
          # если функция вызвана, когда алерт в статусе ALARM, отправляем запрос на адрес WEBHOOK_ALARM_URL
          # если функция вызвана, когда алерт в статусе OK, отправляем запрос на адрес WEBHOOK_OK_URL
          # при других статусах алерта ничего не вызываем
          if alert["status"] == "ALARM":
              result = webhook(WEBHOOK_ALARM_URL, alert["alertId"])
          elif alert["status"] == "OK":
              result = webhook(WEBHOOK_OK_URL, alert["alertId"])
          else:
              pass
          
          if not result:
              return
      
          # выводим в лог результат вызова
          if result["status"] == "OK":
              print(f"Succesffully invoked {result['url']}. Response: {result['response']}")
          elif result["status"] == "ERROR":
              print(f"ERROR invoking {result['url']}. Code {result['code']}, error message: {result['error']}")
          else:
              print(f"{result['status']} when invoking {result['url']}. Error message: {result['error']}")
      
  6. В блоке Параметры задайте параметры версии:

    • Точка входа: index.handler.
    • Сервисный аккаунт: sa-alert-webhook.
  7. В блоке Дополнительные настройки включите Асинхронный вызов.

  8. Нажмите кнопку Сохранить изменения.

Создание каналаСоздание канала

Консоль управления
  1. Выберите сервис Monitoring.
  2. Выберите раздел Каналы уведомлений.
  3. Нажмите кнопку Создать канал.
  4. Введите имя канала уведомлений, например channel-function.
  5. В списке Метод выберите Cloud Functions.
  6. В списке Сервисный аккаунт выберите аккаунт, созданный при добавлении функции.
  7. Нажмите Создать.

Создание алертаСоздание алерта

Консоль управления
  1. В сервисе Monitoring выберите раздел Алерты.
  2. Нажмите кнопку Создать.
  3. Введите имя алерта, например alert-function.
  4. Введите запрос, по которому будут выбираться метрики для отслеживания.
  5. Настройте условия срабатывания.
  6. В блоке Уведомления нажмите Редактировать и затем кнопку Добавить.
  7. Выберите канал channel-function.
  8. Нажмите кнопку Добавить.
  9. Нажмите кнопку Создать.

Проверка вызова функцииПроверка вызова функции

Консоль управления
  1. В списке сервисов выберите Cloud Functions.

  2. Выберите функцию alert-webhook.

  3. Выберите вкладку Тестирование.

  4. В качестве входных данных введите:

    {
      "alertId": "<идентификатор_алерта>",
      "alertName": "alert-function",
      "folderId": "<идентификатор_каталога>",
      "status": "OK"
    }
    
  5. Нажмите кнопку Запустить тест.

  6. В логах вызова функции на вкладке Тестирование или Логи посмотрите, что запрос был отправлен на URL https://my.url/route/for/ok.

Была ли статья полезна?

Предыдущая
Создание канала уведомлений с вызовом функции
Следующая
Создание политики эскалаций
Проект Яндекса
© 2025 ООО «Яндекс.Облако»