Yandex Cloud
Поиск
Связаться с экспертомПопробовать бесплатно
  • Кейсы
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
  • Marketplace
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Искусственный интеллект
    • Безопасность
    • Инструменты DevOps
    • Бессерверные вычисления
    • Управление ресурсами
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
    • Акции и free tier
  • Кейсы
  • Документация
  • Блог
Создавайте контент и получайте гранты!Готовы написать своё руководство? Участвуйте в контент-программе и получайте гранты на работу с облачными сервисами!
Подробнее о программе
Проект Яндекса
© 2026 ООО «Яндекс.Облако»
Yandex Cloud Functions
  • Сопоставление с другими сервисами Yandex Cloud
    • Все практические руководства
      • Разработка Slack-бота
        • Обзор
        • Консоль управления
        • Terraform
      • Разработка Telegram-бота для распознавания текста и аудио
  • Инструменты
  • Правила тарификации
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Публичные материалы
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

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

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте инфраструктуру
  • Проверьте работу Telegram-бота
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Боты на Serverless
  3. Разработка Telegram-бота
  4. 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 в консоли управления

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

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