Yandex Cloud
Поиск
Связаться с экспертомПопробовать бесплатно
  • Кейсы
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
  • Marketplace
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Искусственный интеллект
    • Безопасность
    • Инструменты DevOps
    • Бессерверные вычисления
    • Управление ресурсами
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
    • Акции и free tier
  • Кейсы
  • Документация
  • Блог
Создавайте контент и получайте гранты!Готовы написать своё руководство? Участвуйте в контент-программе и получайте гранты на работу с облачными сервисами!
Подробнее о программе
Проект Яндекса
© 2026 ООО «Яндекс.Облако»
Yandex Object Storage
    • Все руководства
    • Получение статистики запросов к объекту с использованием S3 Select
    • Получение статистики посещения сайта с использованием S3 Select
    • Получение статистики запросов к объектам с использованием Yandex Query
    • Анализ поресурсной детализации расходов
    • Шифрование на стороне сервера
    • Сине-зеленое и канареечное развертывание версий сервиса
    • Анализ логов с использованием DataLens
    • Монтирование бакетов к файловой системе хостов Yandex Data Processing
    • Использование Object Storage в Yandex Data Processing
    • Импорт данных из Object Storage, обработка и экспорт в Managed Service for ClickHouse®
    • Подключение бакета как диска в Windows
    • Миграция данных из Yandex Data Streams с помощью Yandex Data Transfer
    • Использование гибридного хранилища в Yandex Managed Service for ClickHouse®
    • Загрузка данных из Yandex Managed Service for OpenSearch в Yandex Object Storage с помощью Yandex Data Transfer
    • Автоматическое копирование объектов из бакета в бакет
    • Регулярное асинхронное распознавание аудиофайлов в бакете
    • Обучение модели в Yandex DataSphere на данных из Object Storage
    • Подключение к Object Storage из VPC
    • Перенос данных в Yandex Managed Service for PostgreSQL с использованием Yandex Data Transfer
    • Загрузка данных в Yandex MPP Analytics for PostgreSQL с помощью Yandex Data Transfer
    • Загрузка данных в Yandex Managed Service for ClickHouse® с помощью Yandex Data Transfer
    • Загрузка данных в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Обмен данными между Yandex Managed Service for ClickHouse® и Yandex Data Processing
    • Загрузка данных из Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Хостинг статического сайта на фреймворке Gatsby в Object Storage
    • Установка WordPress High Availability с помощью Cloud Apps
    • Установка WordPress с помощью Cloud Apps
    • Установка Ghost CMS High Availability с помощью Cloud Apps
    • Миграция базы данных из Managed Service for PostgreSQL в Object Storage
    • Обмен данными между Yandex Managed Service for ClickHouse® и Yandex Data Processing
    • Импорт данных из Yandex Managed Service for PostgreSQL в Yandex Data Processing с помощью Sqoop
    • Импорт данных из Yandex Managed Service for MySQL® в Yandex Data Processing с помощью Sqoop
    • Миграция данных из Yandex Object Storage в Yandex Managed Service for MySQL® с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for MySQL® в Yandex Object Storage
    • Выгрузка данных Greenplum® в холодное хранилище Yandex Object Storage
    • Загрузка данных из Яндекс Директ в витрину Yandex Managed Service for ClickHouse® с использованием Yandex Cloud Functions, Yandex Object Storage и Yandex Data Transfer
    • Загрузка состояний Terraform в Object Storage
    • Блокировка состояний Terraform с помощью Managed Service for YDB
    • Визуализация данных Yandex Query
    • Публикация обновлений для игр
    • Разработка пользовательской интеграции в API Gateway
    • Хранение журналов работы приложения
    • Разработка навыка Алисы и сайта с авторизацией
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Развертывание веб-приложения с использованием Java Servlet API
      • Обзор
      • Консоль управления
      • Terraform
    • Репликация логов в Object Storage с помощью Fluent Bit
    • Репликация логов в Object Storage с помощью Data Streams
    • Загрузка аудитных логов в SIEM ArcSight
    • Загрузка аудитных логов в SIEM Splunk
    • Создание сервера MLFlow для логирования экспериментов и артефактов
    • Работа с данными с помощью Yandex Query
    • Федеративные запросы к данным с помощью Query
    • Распознавание архива изображений в Vision OCR
    • Регулярное распознавание изображений и PDF-документов из бакета Object Storage
    • Автоматизация задач с помощью Managed Service for Apache Airflow™
    • Обработка файлов детализации в сервисе Yandex Cloud Billing
    • Развертывание веб-приложения с JWT-авторизацией в API Gateway и аутентификацией в Firebase
    • Поиск событий Yandex Cloud в Yandex Query
    • Поиск событий Yandex Cloud в Object Storage
    • Создание внешней таблицы на базе таблицы из бакета с помощью конфигурационного файла
    • Миграция базы данных из Google BigQuery в Managed Service for ClickHouse®
    • Использование Object Storage в Yandex Managed Service for Apache Spark™
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Логи бакета
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

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

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте инфраструктуру
  • Проверьте работу Telegram-бота
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Разработка Telegram-бота
  3. Terraform

Как создать бота в Telegram с помощью Serverless и Terraform

Статья создана
Yandex Cloud
Улучшена
kvendingoldo
Обновлена 22 мая 2026 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте инфраструктуру
  • Проверьте работу Telegram-бота
  • Как удалить созданные ресурсы

Чтобы создать бота в Telegram с помощью Serverless и Terraform:

  1. Подготовьте облако к работе.
  2. Зарегистрируйте Telegram-бота.
  3. Создайте инфраструктуру.
  4. Проверьте работу Telegram-бота.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

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

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры Telegram-бота входят:

  • плата за вызовы функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions);
  • плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage);
  • плата за количество запросов к созданному API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway).

Зарегистрируйте Telegram-ботаЗарегистрируйте Telegram-бота

Зарегистрируйте вашего бота в Telegram и получите токен.

  1. Для регистрации нового бота запустите бота BotFather и отправьте команду.

    /newbot
    
  2. В поле name укажите имя создаваемого бота, например Serverless Hello Telegram Bot. Это имя увидят пользователи при общении с ботом.

  3. В поле username укажите имя пользователя создаваемого бота, например ServerlessHelloTelegramBot. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на ...Bot или ..._bot.

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

  4. Установите иконку для бота — файл sayhello.png из сохраненного архива. Отправьте боту BotFather команду:

    /setuserpic
    

Создайте инфраструктуруСоздайте инфраструктуру

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

Terraform распространяется под лицензией Business Source License, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0.

Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.

Для создания инфраструктуры с помощью Terraform:

  1. Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).

  2. Подготовьте файлы с описанием инфраструктуры:

    Готовая конфигурация
    Вручную
    1. Клонируйте репозиторий с конфигурационными файлами, необходимым для создания бота, для этого в терминале выполните команду git:

      git clone https://git@git.sourcecraft.dev/yandex-cloud-examples/yc-telegram-bot-serverless.git
      
    2. Перейдите в директорию с репозиторием. В ней должны появиться файлы:

      • telegram-bot.tf — конфигурация создаваемой инфраструктуры;
      • telegram-bot.auto.tfvars — файл с пользовательскими данными;
      • telegram-bot-function.tpl — шаблон для создания функции Yandex Cloud Functions;
      • telegram-bot-gw-spec.tpl — шаблон спецификации API-шлюза;
      • sayhello.png — изображение для бота;
      • package.json — манифест для функции Node.js.
    1. Создайте папку для конфигурационных файлов.

    2. Создайте в папке:

      1. Конфигурационный файл telegram-bot.tf:

        telegram-bot.tf
        # Объявление переменных для конфиденциальных параметров
        
        variable "cloud_id" {
          type = string
        }
        
        variable "folder_id" {
          type = string
        }
        
        variable "bucket_name" {
          type = string
        }
        
        variable "bot_token" {
          type      = string
          sensitive = true
        }
        
        # Настройка провайдера
        
        terraform {
          required_providers {
            yandex = {
              source = "yandex-cloud/yandex"
            }
          }
        }
        
        provider "yandex" {
          cloud_id  = var.cloud_id
          folder_id = var.folder_id
        }
        
        # Создание сервисного аккаунта
        
        resource "yandex_iam_service_account" "bot_sa" {
          name        = "telegram-bot-sa"
          description = "Service Account for Telegram bot"
        }
        
        # Назначение роли сервисному аккаунту
        
        resource "yandex_resourcemanager_folder_iam_member" "sa_editor" {
          folder_id = var.folder_id
          role      = "editor"
          member    = "serviceAccount:${yandex_iam_service_account.bot_sa.id}"
        
          depends_on = [yandex_iam_service_account.bot_sa]
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "sa_invoker" {
          folder_id = var.folder_id
          role      = "functions.functionInvoker"
          member    = "serviceAccount:${yandex_iam_service_account.bot_sa.id}"
        
          depends_on = [yandex_iam_service_account.bot_sa]
        }
        
        # Создание статических ключей доступа
        
        resource "yandex_iam_service_account_static_access_key" "bot_sa_key" {
          service_account_id = yandex_iam_service_account.bot_sa.id
          description        = "Static key for bot service account"
        
          depends_on = [
            yandex_resourcemanager_folder_iam_member.sa_editor
          ]
        }
        
        # Создание бакета
        
        resource "yandex_storage_bucket" "bot_bucket" {
          bucket     = var.bucket_name
          access_key = yandex_iam_service_account_static_access_key.bot_sa_key.access_key
          secret_key = yandex_iam_service_account_static_access_key.bot_sa_key.secret_key
          anonymous_access_flags {
            read = true
          }
        
          depends_on = [
            yandex_iam_service_account_static_access_key.bot_sa_key
          ]
        }
        
        # Загрузка картинки в бакет
        
        resource "yandex_storage_object" "sayhello_png" {
          bucket       = yandex_storage_bucket.bot_bucket.bucket
          key          = "sayhello.png"
          source       = "sayhello.png"
          acl          = "public-read"
          access_key   = yandex_iam_service_account_static_access_key.bot_sa_key.access_key
          secret_key   = yandex_iam_service_account_static_access_key.bot_sa_key.secret_key
          content_type = "image/png"
        
          depends_on = [yandex_storage_bucket.bot_bucket]
        }
        
        # Создание zip-архива для функции
        
        data "archive_file" "function" {
          type        = "zip"
          source {
            content  = templatefile("telegram-bot-function.tpl", {
              API_GW_URL = yandex_api_gateway.bot_gateway.domain
            })
            filename = "index.js"
          }
          source {
            content  = "${file("package.json")}"
            filename = "package.json"
          }
          output_path = "function.zip"
        
          depends_on = [yandex_api_gateway.bot_gateway]
        }
        
        # Создание публичной функции
        
        resource "yandex_function" "telegram_bot_function" {
          name               = "fshtb-function"
          description        = "Serverless Telegram bot on Node.js"
          runtime            = "nodejs22"
          entrypoint         = "index.handler"
          memory             = 256
          execution_timeout  = 5
          service_account_id = yandex_iam_service_account.bot_sa.id
        
          environment = {
            BOT_TOKEN = var.bot_token
          }
        
          content {
            zip_filename = "function.zip"
          }
        
          user_hash = filesha256("telegram-bot-function.tpl")
        
          depends_on = [
            yandex_resourcemanager_folder_iam_member.sa_editor,
            yandex_resourcemanager_folder_iam_member.sa_invoker,
            data.archive_file.function
          ]
        }
        
        resource "yandex_function_iam_binding" "public_invoker" {
          function_id = yandex_function.telegram_bot_function.id
          role        = "functions.functionInvoker"
          members     = ["system:allUsers"]
        }
        
        # Создание API-шлюза
        
        resource "yandex_api_gateway" "bot_gateway" {
          name        = "forserverless-hello-telegram-bot"
          description = "API gateway for telegram bot"
        
          spec = templatefile("telegram-bot-gw-spec.tpl", {
            BUCKET_NAME = yandex_storage_bucket.bot_bucket.id
            OBJECT_NAME = yandex_storage_object.sayhello_png.key
            SA_ID       = yandex_iam_service_account.bot_sa.id
          })
        }
        
      2. Шаблон для создания функции Yandex Cloud Functions telegram-bot-function.tpl:

        telegram-bot-function.tpl
        const { Telegraf } = require('telegraf');
        
        const bot = new Telegraf(process.env.BOT_TOKEN);
        bot.start((ctx) => ctx.reply(`Hello. \nMy name Serverless Hello Telegram Bot \nI'm working on Cloud Function in the Yandex.Cloud.`))
        bot.help((ctx) => ctx.reply(`Hello, ${ctx.message.from.username}.\nI can say Hello and nothing more`))
        bot.on('text', (ctx) => {
            ctx.replyWithPhoto({url: 'https://${API_GW_URL}/sayhello.png'});
            ctx.reply(`Hello, ${ctx.message.from.username}`);
        });
        
        module.exports.handler = async function (event, context) {
            const message = JSON.parse(event.body);
            await bot.handleUpdate(message);
            return {
                statusCode: 200,
                body: '',
            };
        }; 
        
      3. Шаблон спецификации API-шлюза telegram-bot-gw-spec.tpl:

        telegram-bot-gw-spec.tpl
        openapi: 3.0.0
        info:
          title: for-serverless-hello-telegram-bot
          version: 1.0.0
        paths:
          /sayhello.png:
            get:
              x-yc-apigateway-integration:
                type: object-storage
                bucket: ${BUCKET_NAME}
                object: ${OBJECT_NAME}
                presigned_redirect: false
                service_account: ${SA_ID}
              operationId: static
        
      4. Файл с пользовательскими данными telegram-bot.auto.tfvars:

        bot_token   = "<токен_Telegram-бота>"
        bucket_name = "<имя_бакета>"
        cloud_id    = "<идентификатор_облака>"
        folder_id   = "<идентификатор_каталога>"
        
      5. Манифест для функции Node.js package.json:

        {
          "name": "ycf-telegram-example",
          "version": "1.0.0",
          "description": "",
          "main": "index.js",
          "scripts": {
            "test": "echo \"Error: no test specified\" && exit 1"
          },
          "author": "",
          "license": "MIT",
          "dependencies": {
            "telegraf": "^4.12.0"
          }
        }
        

    Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:

    • Сервисный аккаунт — yandex_iam_service_account.
    • Назначение роли сервисному аккаунту — yandex_resourcemanager_folder_iam_member.
    • Статический ключ доступа — yandex_iam_service_account_static_access_key.
    • Бакет — yandex_storage_bucket.
    • Объект — yandex_storage_object.
    • API-шлюз — yandex_api_gateway.
    • Функция — yandex_function.
    • Назначение роли на функцию — yandex_function_iam_binding.
  3. В файле telegram-bot.auto.tfvars задайте пользовательские параметры:

    • bot_token — токен Telegram-бота.
    • bucket_name — имя бакета.
    • cloud_id — идентификатор облака.
    • folder_id — идентификатор каталога.
  4. Создайте ресурсы:

    1. В терминале перейдите в директорию с конфигурационным файлом.

    2. Проверьте корректность конфигурации с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

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

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

  5. Настройте связь между функцией и Telegram-ботом.

    1. Измените спецификацию API-шлюза — после имеющихся строчек кода добавьте секцию fshtb-function:

        /fshtb-function:
          post:
            x-yc-apigateway-integration:
              type: cloud_functions
              function_id: <идентификатор_функции>
            operationId: fshtb-function
      

      Где function_id — идентификатор функции fshtb-function.

    2. Примените изменения конфигурации:

      terraform apply
      
    3. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

    4. В терминале выполните следующую команду: вместо <токен_бота> укажите токен Telegram-бота, вместо <домен_API-шлюза> — служебный домен API-шлюза:

      • Linux, macOS:

        curl \
          --request POST \
          --url https://api.telegram.org/bot<токен_бота>/setWebhook \
          --header 'content-type: application/json' \
          --data '{"url": "<домен_API-шлюза>/fshtb-function"}'
        
      • Windows (cmd):

        curl ^
          --request POST ^
          --url https://api.telegram.org/bot<токен_бота>/setWebhook ^
          --header "content-type: application/json" ^
          --data "{\"url\": \"<домен_API-шлюза>/fshtb-function\"}"
        
      • Windows (PowerShell):

        curl.exe `
          --request POST `
          --url https://api.telegram.org/bot<токен_бота>/setWebhook `
          --header '"content-type: application/json"' `
          --data '"{ \"url\": \"<домен_API-шлюза>/fshtb-function\" }"'
        

      Результат:

      {"ok":true,"result":true,"description":"Webhook was set"}
      

Проверьте работу Telegram-ботаПроверьте работу Telegram-бота

Поговорите с ботом:

  1. Откройте Telegram и найдите бота по имени пользователя username, созданному ранее.

  2. Отправьте в чат сообщение /start.

    Бот должен ответить:

    Hello.
    My name Serverless Hello Telegram Bot
    I'm working on Cloud Function in the Yandex Cloud.
    
  3. Отправьте в чат сообщение /help.

    Бот должен ответить:

    Hello, <username>.
    I can say Hello and nothing more
    
  4. Отправьте в чат любое текстовое сообщение. Бот должен в ответ прислать изображение и сообщение: Hello, <username>.

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Откройте конфигурационный файл telegram-bot.tf и удалите описание создаваемой инфраструктуры из файла.

  2. Примените изменения:

    1. В терминале перейдите в директорию с конфигурационным файлом.

    2. Проверьте корректность конфигурации с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

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

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

См. такжеСм. также

  • Как создать бота в Telegram с помощью Serverless в консоли управления

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

Предыдущая
Консоль управления
Следующая
Репликация логов в Object Storage с помощью Fluent Bit
Создавайте контент и получайте гранты!Готовы написать своё руководство? Участвуйте в контент-программе и получайте гранты на работу с облачными сервисами!
Подробнее о программе
Проект Яндекса
© 2026 ООО «Яндекс.Облако»