Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Разграничение прав доступа для групп пользователей
    • Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
    • Централизованная публикация в интернете и защита приложений от DDoS
      • Обзор
      • Консоль управления
      • Terraform
    • Передача логов с виртуальной машины в Cloud Logging
    • Запись логов балансировщика в PostgreSQL
    • Безопасное хранение паролей для GitLab CI в виде секретов Yandex Lockbox
    • Сервисный аккаунт с профилем OS Login для управления ВМ с помощью Ansible
    • Передача логов с Container Optimized Image в Cloud Logging
    • Добавление HTML-страницы для работы SmartCaptcha
    • Создание L7-балансировщика с профилем безопасности
    • Настройка алертов в Monitoring
    • Загрузка аудитных логов в MaxPatrol SIEM
    • Загрузка аудитных логов в SIEM Splunk
    • Загрузка аудитных логов в SIEM ArcSight
    • Шифрование для бакета Object Storage на стороне сервера
    • Шифрование секретов в HashiCorp Terraform
    • Управление ключами KMS с HashiCorp Terraform
    • Auto Unseal в HashiCorp Vault

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

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

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

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

Чтобы создать инфраструктуру для терминирования 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 или в зеркале.

Для создания инфраструктуры 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-соединений с помощью консоли управления

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

Предыдущая
Консоль управления
Следующая
Передача логов с виртуальной машины в Cloud Logging
Проект Яндекса
© 2025 ООО «Яндекс.Облако»