Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Certificate Manager
  • Начало работы
    • Все руководства
    • Установка Ingress-контроллера NGINX в Managed Service for Kubernetes
    • Организация виртуального хостинга
    • Хостинг статического сайта на фреймворке Gatsby в Object Storage
      • Обзор
      • Консоль управления
      • Terraform
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

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

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

Терминирование TLS-соединений с помощью Terraform

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

Чтобы создать инфраструктуру для терминирования TLS-соединений c помощью Terraform:

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

В качестве примера используется доменное имя my-site.com.

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

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

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

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

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

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

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

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

  • плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
  • плата за использование публичного статического IP-адреса (см. тарифы Yandex Virtual Private Cloud);
  • плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer);
  • плата за публичные DNS-запросы и зоны DNS, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).

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

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

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

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

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

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

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

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

      git clone https://github.com/yandex-cloud-examples/yc-alb-tls-termination.git
      
    2. Перейдите в директорию с репозиторием. В ней должны появиться файлы:

      • tls-termination-config.tf — конфигурация создаваемой инфраструктуры.
      • tls-terminationg.auto.tfvars — файл с пользовательскими данными.
    1. Создайте папку для конфигурационных файлов.
    2. Создайте в папке:
      1. Конфигурационный файл tls-termination-config.tf:

        tls-termination-config.tf
        # Объявление переменных для конфиденциальных параметров
        
        variable "folder_id" {
          type = string
        }
        
        variable "vm_user" {
          type = string
        }
        
        variable "ssh_key_path" {
          type = string
        }
        
        variable "domain" {
          type = string
        }
        
        variable "certificate" {
          type = string
        }
        
        variable "private_key" {
          type = string
        }
        
        # Добавление прочих переменных
        
        locals {
          sa_name          = "ig-sa"
          network_name     = "network-1"
          subnet_name_a    = "subnet-a"
          subnet_name_b    = "subnet-b"
          sg_name_balancer = "sg-balancer"
          sg_name_vms      = "sg-vms"
          cert_name        = "imported-cert"
          site_ig_name     = "site-ig"
          alb_bg_name      = "alb-bg"
          alb_host_name    = "alb-host"
          alb_router_name  = "alb-router"
          alb_name         = "alb"
          alb_zone_name    = "alb-zone"
        }
        
        # Настройка провайдера
        
        terraform {
          required_providers {
            yandex = {
              source  = "yandex-cloud/yandex"
              version = ">= 0.47.0"
            }
          }
        }
        
        provider "yandex" {
          folder_id = var.folder_id
        }
        
        # Создание сервисного аккаунта для группы ВМ
        
        resource "yandex_iam_service_account" "ig-sa" {
          name        = local.sa_name
          description = "service account to manage IG"
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "editor" {
          folder_id = var.folder_id
          role      = "editor"
          member    = "serviceAccount:${yandex_iam_service_account.ig-sa.id}"
        }
        
        # Создание облачной сети
        
        resource "yandex_vpc_network" "network-1" {
          name = local.network_name
        }
        
        resource "yandex_vpc_subnet" "subnet-a" {
          name           = local.subnet_name_a
          zone           = "ru-central1-a"
          v4_cidr_blocks = ["192.168.1.0/24"]
          network_id     = yandex_vpc_network.network-1.id
        }
        
        resource "yandex_vpc_subnet" "subnet-b" {
          name           = local.subnet_name_b
          zone           = "ru-central1-b"
          v4_cidr_blocks = ["192.168.2.0/24"]
          network_id     = yandex_vpc_network.network-1.id
        }
        
        # Создание статического публичного IP-адреса
        
        resource "yandex_vpc_address" "stat_address" {
          name = "alb-static-address"
          external_ipv4_address {
            zone_id = "ru-central1-a"
          }
        }
        
        # Создание групп безопасности
        
        resource "yandex_vpc_security_group" "sg-balancer" {
          name        = local.sg_name_balancer
          network_id  = yandex_vpc_network.network-1.id
        
          egress {
            protocol       = "ANY"
            description    = "any"
            v4_cidr_blocks = ["0.0.0.0/0"]
            from_port = 0
            to_port = 65535
          }
        
          ingress {
            protocol       = "TCP"
            description    = "ext-http"
            v4_cidr_blocks = ["0.0.0.0/0"]
            port           = 80
          }
        
          ingress {
            protocol       = "TCP"
            description    = "ext-https"
            v4_cidr_blocks = ["0.0.0.0/0"]
            port           = 443
          }
        
          ingress {
            protocol          = "TCP"
            description       = "healthchecks"
            predefined_target = "loadbalancer_healthchecks"
            port              = 30080
         }
        }
        
        resource "yandex_vpc_security_group" "sg-vms" {
          name        = local.sg_name_vms
          network_id  = yandex_vpc_network.network-1.id
        
          ingress {
            protocol          = "TCP"
            description       = "balancer"
            security_group_id = yandex_vpc_security_group.sg-balancer.id
            port              = 80
            }
        
          ingress {
            protocol       = "TCP"
            description    = "ssh"
            v4_cidr_blocks = ["0.0.0.0/0"]
            port           = 22
          }
        }
        
        # Импорт TLS-сертификат сайта
        
        resource "yandex_cm_certificate" "imported-cert" {
          name    = local.cert_name
        
          self_managed {
            certificate = "${file("${var.certificate}")}"
            private_key = "${file("${var.private_key}")}"
          }
        }
        
        # Создание группу ВМ для сайта
        
        resource "yandex_compute_image" "lemp-image" {
          source_family = "lemp"
        }
        
        resource "yandex_compute_instance_group" "site-ig" {
          name                = local.site_ig_name
          folder_id           = var.folder_id
          service_account_id  = "${yandex_iam_service_account.ig-sa.id}"
          instance_template {
            platform_id = "standard-v2"
            resources {
              memory        = 1
              cores         = 2
              core_fraction = 5
            }
        
            boot_disk {
              mode = "READ_WRITE"
              initialize_params {
                image_id = yandex_compute_image.lemp-image.id
              }
            }
        
            network_interface {
              network_id         = yandex_vpc_network.network-1.id
              subnet_ids         = [yandex_vpc_subnet.subnet-a.id,yandex_vpc_subnet.subnet-b.id]
              security_group_ids = [yandex_vpc_security_group.sg-vms.id]
              nat                = true
            }
        
            metadata = {
              user-data = "#cloud-config\nusers:\n  - name: ${var.vm_user}\n    groups: sudo\n    shell: /bin/bash\n    sudo: 'ALL=(ALL) NOPASSWD:ALL'\n    ssh_authorized_keys:\n      - ${file("${var.ssh_key_path}")}"
            }
          }
        
          scale_policy {
            fixed_scale {
              size = 2
            }
          }
        
          allocation_policy {
            zones = ["ru-central1-a","ru-central1-b"]
          }
        
          deploy_policy {
            max_unavailable = 1
            max_expansion   = 0
          }
        
          application_load_balancer {
            target_group_name        = "alb-tg"
          }
        }
        
        # Создание группу бэкендов
        
        resource "yandex_alb_backend_group" "alb-bg" {
          name                     = local.alb_bg_name
        
          http_backend {
            name                   = "alb-backend"
            weight                 = 1
            port                   = 80
            target_group_ids       = [yandex_compute_instance_group.site-ig.application_load_balancer[0].target_group_id]
            healthcheck {
              timeout              = "10s"
              interval             = "2s"
              healthcheck_port     = 80
              http_healthcheck {
                path               = "/"
              }
            }
          }
        }
        
        # Создание HTTP-роутера
        
        resource "yandex_alb_http_router" "alb-router" {
          name          = local.alb_router_name
        }
        
        resource "yandex_alb_virtual_host" "alb-host" {
          name                    = local.alb_host_name
          authority               = ["${var.domain}"]
          http_router_id          = yandex_alb_http_router.alb-router.id
          route {
            name                  = "alb-route"
            http_route {
              http_route_action {
                backend_group_id  = yandex_alb_backend_group.alb-bg.id
                timeout           = "60s"
              }
            }
          }
        }    
        
        # Создание L7-балансировщика
        
        resource "yandex_alb_load_balancer" "alb" {
          name        = local.alb_name
          network_id  = yandex_vpc_network.network-1.id
          security_group_ids = [yandex_vpc_security_group.sg-balancer.id]
        
          allocation_policy {
            location {
              zone_id   = "ru-central1-a"
              subnet_id = yandex_vpc_subnet.subnet-a.id
            }
            location {
              zone_id   = "ru-central1-b"
              subnet_id = yandex_vpc_subnet.subnet-b.id 
            }
          }
        
          listener {
            name = "list-http"
            endpoint {
              address {
                external_ipv4_address {
                  address = yandex_vpc_address.stat_address.external_ipv4_address[0].address
                }
              }
            ports = [ 80 ]
            }
            http {
              redirects {
                http_to_https = true
              }
            }
          }
        
          listener {
            name = "listener-http"
            endpoint {
              address {
                external_ipv4_address {
                  address = yandex_vpc_address.stat_address.external_ipv4_address[0].address
                }
              }
              ports = [ 443 ]
            }
            tls {
              default_handler {
                http_handler {
                  http_router_id = yandex_alb_http_router.alb-router.id
                }
                certificate_ids = [yandex_cm_certificate.imported-cert.id]
              }
              sni_handler {
                name         = "mysite-sni"
                server_names = ["${var.domain}"]
                handler {
                  http_handler {
                    http_router_id = yandex_alb_http_router.alb-router.id
                  }
                  certificate_ids = [yandex_cm_certificate.imported-cert.id]
                }
              }
            }
          }
        }
        
        # Создание DNS-зоны
        
        resource "yandex_dns_zone" "alb-zone" {
          name        = local.alb_zone_name
          description = "Public zone"
          zone        = "${var.domain}."
          public      = true
        }
        
        # Создание ресурсной записи в DNS-зоне
        
        resource "yandex_dns_recordset" "alb-record" {
          zone_id = yandex_dns_zone.alb-zone.id
          name    = "${var.domain}."
          ttl     = 600
          type    = "A"
          data    = [yandex_alb_load_balancer.alb.listener[0].endpoint[0].address[0].external_ipv4_address[0].address]
        }
        
      2. Файл с пользовательскими данными tls-termination.auto.tfvars:

        tls-termination.auto.tfvars
        folder_id    = "<идентификатор_каталога>"
        vm_user      = "<имя_пользователя_ВМ>"
        ssh_key_path = "<путь_к_публичному_SSH-ключу>"
        domain       = "<домен>"
        certificate  = "<путь_к_файлу_с_сертификатом>"
        private_key  = "<путь_к_файлу_с_закрытым_ключом>"
        

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

    • Сеть — yandex_vpc_network.
    • Подсети — yandex_vpc_subnet.
    • Статический публичный IP-адрес — yandex_vpc_address.
    • Группы безопасности — yandex_vpc_security_group.
    • TLS-сертификат — yandex_cm_certificate.
    • Образ ВМ — yandex_compute_image.
    • Сервисный аккаунт — yandex_iam_service_account.
    • Роль — yandex_resourcemanager_folder_iam_member.
    • Группа ВМ — yandex_compute_instance_group.
    • Группа бэкендов — yandex_alb_backend_group.
    • HTTP-роутер — yandex_alb_http_router.
    • Виртуальный хост — yandex_alb_virtual_host.
    • L7-балансировщик — yandex_alb_load_balancer.
    • DNS-зона — yandex_dns_zone.
    • Ресурсная запись DNS — yandex_dns_recordset.
  3. В файле tls-termination.auto.tfvars задайте пользовательские параметры:

    • folder_id — идентификатор каталога.
    • vm_user — имя пользователя ВМ.
    • ssh_key_path — путь к файлу с публичным SSH-ключом. Подробнее см. Создание пары ключей SSH.
    • domain — домен, на котором будет размещен сайт.
      Чтобы получить доступ к именам из публичной зоны, вам нужно делегировать домен. Укажите адреса серверов ns1.yandexcloud.net и ns2.yandexcloud.net в личном кабинете вашего регистратора.
    • certificate — путь к файлу с пользовательским сертификатом.
    • private_key — путь к файлу с закрытым ключом пользовательского сертификата.
  4. Создайте ресурсы:

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

  5. Получите публичные IP-адреса — они потребуются далее, чтобы проверить работу хостинга.

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

Проверьте работу хостингаПроверьте работу хостинга

Чтобы проверить работу хостинга:

  1. Создайте главную страницу сайта — файл index.html

    Пример файла index.html
    <!DOCTYPE html>
    <html>
      <head>
        <title>My site</title>
      </head>
      <body>
        <h1>This is my site</h1>
      </body>
    </html>
    
  2. Загрузите файл index.html на каждую ВМ:

    1. В блоке Сеть на странице виртуальной машины в консоли управления найдите публичный IP-адрес виртуальной машины.

    2. Подключитесь к виртуальной машине по протоколу SSH.

    3. Выдайте права на запись для вашего пользователя на директорию /var/www/html:

      Ubuntu
      CentOS
      sudo chown -R "$USER":www-data /var/www/html
      
      sudo chown -R "$USER":apache /var/www/html
      
    4. Загрузите на ВМ файлы сайта с помощью протокола SCP.

      Linux/macOS
      Windows

      Используйте утилиту командной строки scp:

      scp -r <путь_до_директории_с_файлами> <имя_пользователя_ВМ>@<IP-адрес_виртуальной_машины>:/var/www/html
      

      С помощью программы WinSCP скопируйте локальную директорию с файлами в директорию /var/www/html на ВМ.

  3. В браузере откройте сайт по адресу http://my-site.com — должно произойти перенаправление на страницу https://my-site.com, где уже подключен TLS-сертификат из Certificate Manager.

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

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

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

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

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

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

  • Терминирование TLS-соединений с помощью консоли управления.

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

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