Привязка доменного имени к ВМ с веб-сервером
В этом руководстве вы привяжете собственное доменное имя к виртуальной машине с веб-сервером. Доменное имя может быть зарегистрировано у любого регистратора доменных имен.
Виртуальная машина будет создана из публичного образа LAMP с предустановленным веб-сервером Apache HTTP Server
Чтобы привязать доменное имя к ВМ с веб-сервером в Cloud DNS:
- Подготовьте облако к работе.
- Создайте виртуальную машину с веб-сервером.
- Создайте публичную зону DNS.
- Делегируйте домен сервису Cloud DNS.
- Создайте ресурсную запись типа A.
- Проверьте работу сайта.
Если созданные ресурсы вам больше не нужны, удалите их.
Также привязать доменное имя к виртуальной машине с веб-сервером можно через Terraform с помощью готового файла конфигурации.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки создаваемого решения входят:
- плата за использование публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за вычислительные ресурсы и диски ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичной DNS-зоны и публичные DNS-запросы (см. тарифы Yandex Cloud DNS).
Создайте облачную сеть и подсеть
- В консоли управления
выберите ваш каталог. - В списке сервисов выберите Virtual Private Cloud.
- Справа сверху нажмите кнопку Создать сеть.
- В поле Имя укажите
webserver-network
. - В поле Дополнительно отключите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
- На панели слева выберите Подсети.
- Справа сверху нажмите Создать.
- В поле Имя укажите
webserver-subnet-ru-central1-b
. - В поле Зона выберите зону доступности
ru-central1-b
. - В поле Сеть выберите облачную сеть
webserver-network
. - В поле CIDR укажите
192.168.1.0/24
. - Нажмите кнопку Создать подсеть.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте облачную сеть
webserver-network
:yc vpc network create webserver-network
Результат:
id: enp1gg8kr3pv******** folder_id: b1gt6g8ht345******** created_at: "2023-12-20T20:08:11Z" name: webserver-network default_security_group_id: enppne4l2eg5********
Подробнее о команде
yc vpc network create
читайте в справочнике CLI. -
Создайте подсеть в зоне доступности
ru-central1-b
:yc vpc subnet create webserver-subnet-ru-central1-b \ --zone ru-central1-b \ --network-name webserver-network \ --range 192.168.1.0/24
Результат:
id: e2li9tcgi7ii******** folder_id: b1gt6g8ht345******** created_at: "2023-12-20T20:11:16Z" name: webserver-subnet-ru-central1-b network_id: enp1gg8kr3pv******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.1.0/24
Подробнее о команде
yc vpc subnet create
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
-
Чтобы создать облачную сеть, воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
-
Чтобы создать подсеть, воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
Создайте группу безопасности
Создайте группу безопасности, разрешающую входящий TCP-трафик для портов 22
, 80
и 443
, а также любой исходящий трафик.
-
В консоли управления
выберите ваш каталог. -
В списке сервисов выберите Virtual Private Cloud.
-
На панели слева выберите
Группы безопасности. -
Нажмите кнопку Создать группу безопасности.
-
В поле Имя укажите имя
webserver-sg
. -
В поле Сеть выберите созданную ранее сеть
webserver-network
. -
В блоке Правила создайте следующие правила для управления трафиком:
Направление
трафикаОписание Диапазон портов Протокол Источник /
НазначениеCIDR блоки Входящий http
80
TCP
CIDR
0.0.0.0/0
Входящий https
443
TCP
CIDR
0.0.0.0/0
Входящий ssh
22
TCP
CIDR
0.0.0.0/0
Исходящий any
Весь
Любой
CIDR
0.0.0.0/0
-
Нажмите кнопку Сохранить.
Выполните команду:
yc vpc security-group create \
--name webserver-sg \
--rule "description=http,direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=https,direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=ssh,direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=any,direction=egress,port=any,protocol=any,v4-cidrs=[0.0.0.0/0]" \
--network-name webserver-network
Результат:
id: enp4htsnl1sa********
folder_id: b1gt6g8ht345********
created_at: "2023-12-23T19:07:03Z"
name: webserver-sg
network_id: enp37qpnksl2********
status: ACTIVE
rules:
- id: enpdu0t8san9********
description: http
direction: INGRESS
ports:
from_port: "80"
to_port: "80"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpr7oirpff5********
description: https
direction: INGRESS
ports:
from_port: "443"
to_port: "443"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enp0bgk6dkdd********
description: ssh
direction: INGRESS
ports:
from_port: "22"
to_port: "22"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpspns0tfml********
description: any
direction: EGRESS
protocol_name: ANY
protocol_number: "-1"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
Подробнее о команде yc vpc security-group create
читайте в справочнике CLI.
Сохраните полученный идентификатор (id
) группы безопасности: он пригодится при создании виртуальной машины.
См. раздел Как создать инфраструктуру с помощью Terraform.
Чтобы создать группу безопасности, воспользуйтесь методом REST API create для ресурса SecurityGroup или вызовом gRPC API SecurityGroupService/Create.
Создайте виртуальную машину с веб-сервером
Перед тем как приступать к созданию виртуальной машины, подготовьте пару ключей (открытый и закрытый) для доступа к ВМ по SSH.
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска:
- Перейдите на вкладку Marketplace.
- Нажмите кнопку Показать все продукты Marketplace.
- В списке публичных образов выберите LAMP и нажмите кнопку Использовать.
-
В блоке Расположение выберите зону доступности
ru-central1-b
. -
В блоке Сетевые настройки:
- В поле Подсеть выберите созданную ранее подсеть
webserver-subnet-ru-central1-b
. - В поле Публичный адрес выберите
Автоматически
. - В поле Группы безопасности выберите созданную ранее группу безопасности
webserver-sg
.
- В поле Подсеть выберите созданную ранее подсеть
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
- В поле Логин введите имя пользователя
yc-user
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
- В поле Логин введите имя пользователя
-
В блоке Общая информация задайте имя ВМ:
mywebserver
. -
Нажмите кнопку Создать ВМ.
Выполните команду, указав сохраненный на предыдущем шаге идентификатор группы безопасности:
yc compute instance create \
--name mywebserver \
--zone ru-central1-b \
--network-interface subnet-name=webserver-subnet-ru-central1-b,nat-ip-version=ipv4,security-group-ids=<идентификатор_группы_безопасности> \
--create-boot-disk image-folder-id=standard-images,image-id=fd8jtn9i7e9ha5q25niu \
--ssh-key <SSH-ключ>
Где --ssh-key
— путь к файлу с открытым SSH-ключом и его имя. Например ~/.ssh/id_ed25519.pub
.
Результат:
done (32s)
id: fhmaq4shfrcm********
folder_id: b1gt6g8ht345********
created_at: "2023-12-23T05:36:34Z"
name: mywebserver
zone_id: ru-central1-b
platform_id: standard-v2
resources:
memory: "2147483648"
cores: "2"
core_fraction: "100"
status: RUNNING
metadata_options:
gce_http_endpoint: ENABLED
aws_v1_http_endpoint: ENABLED
gce_http_token: ENABLED
aws_v1_http_token: DISABLED
boot_disk:
mode: READ_WRITE
device_name: fhmprher1d0q********
auto_delete: true
disk_id: fhmprher1d0q********
network_interfaces:
- index: "0"
mac_address: d0:0d:ad:13:91:7e
subnet_id: e9bk1m87r4m4********
primary_v4_address:
address: 192.168.1.11
one_to_one_nat:
address: 158.160.***.***
ip_version: IPV4
security_group_ids:
- enpa5j0mrgm4********
gpu_settings: {}
fqdn: fhmaq4shfrcm********.auto.internal
scheduling_policy: {}
network_settings:
type: STANDARD
placement_policy: {}
Подробнее о команде yc compute instance create
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Чтобы создать виртуальную машину, воспользуйтесь методом REST API create для ресурса Instance или вызовом gRPC API InstanceService/Create.
В вашем каталоге будет создана виртуальная машина mywebserver
. Чтобы подключиться к ней по SSH, используйте логин yc-user
и публичный IP-адрес этой ВМ. Если вы планируете пользоваться созданным веб-сервером длительное время, сделайте публичный IP-адрес этой ВМ статическим.
Создайте публичную зону DNS
-
В консоли управления
выберите ваш каталог. -
Выберите сервис Cloud DNS.
-
Нажмите кнопку Создать зону.
-
Задайте настройки зоны DNS, соответствующие вашему домену:
- Зона — доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоны
example.com.
соответствует доменуexample.com
. Публичные зоны верхнего уровня (TLD-зоны) создавать нельзя. Чтобы создать доменную зону с нелатинскими символами, используйте кодировку Punycode . - Тип —
Публичная
. - Имя — имя зоны.
- Зона — доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоны
-
Нажмите кнопку Создать.
Выполните команду:
yc dns zone create \
--name <имя_зоны> \
--zone <доменная_зона> \
--public-visibility
Где:
--name
— имя зоны DNS.--zone
— доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоныexample.com.
соответствует доменуexample.com
. Публичные зоны верхнего уровня (TLD-зоны) создавать нельзя. Чтобы создать доменную зону с нелатинскими символами, используйте кодировку Punycode .
Результат:
id: dns39gihj0ef********
folder_id: b1gt6g8ht345********
created_at: "2023-12-21T16:43:37.883Z"
name: my-domain-zone
zone: example.com.
public_visibility: {}
Подробнее о команде yc dns zone create
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Чтобы создать публичную зону DNS, воспользуйтесь методом REST API create для ресурса DnsZone или вызовом gRPC API DnsZoneService/Create.
Делегируйте домен сервису Cloud DNS
Чтобы делегировать домен сервису Cloud DNS, в личном кабинете вашего регистратора домена укажите в настройках домена адреса DNS-серверов:
ns1.yandexcloud.net
ns2.yandexcloud.net
Делегирование происходит не сразу. Серверы интернет-провайдеров обычно обновляют записи до 24 часов (86400 секунд). Это обусловлено значением TTL, в течение которого кэшируются записи для доменов.
Проверить делегирование домена можно с помощью сервиса Whoisdig
:
dig +short NS example.com
Результат:
ns2.yandexcloud.net.
ns1.yandexcloud.net.
Создайте ресурсную запись типа A
Создайте в вашей зоне DNS ресурсную запись типа А, указывающую на публичный IP-адрес веб-сервера:
-
В консоли управления
выберите ваш каталог. -
Выберите сервис Cloud DNS.
-
Выберите созданную ранее DNS-зону.
-
Нажмите кнопку Создать запись.
-
Задайте параметры записи:
-
В поле Имя выберите
Совпадает с именем зоны (@)
. -
В поле Тип выберите тип записи
A
. -
В поле Значение укажите публичный IP-адрес веб-сервера.
Узнать IP-адрес виртуальной машины можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get <имя_ВМ>
.
-
-
Нажмите кнопку Создать.
Выполните команду:
yc dns zone add-records \
--name <имя_зоны> \
--record "<доменное_имя> 600 A <IP-адрес_ВМ>"
Где:
--name
— имя созданной ранее публичной зоны DNS.--record
— параметры создаваемой ресурсной записи:-
<доменное_имя>
— доменное имя, должно заканчиваться точкой. Например, для доменаexample.com
здесь нужно указатьexample.com.
-
<IP-адрес_ВМ>
— публичный IP-адрес веб-сервера.Узнать IP-адрес виртуальной машины можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get <имя_ВМ>
.
-
Результат:
+--------+--------------+------+---------------+-----+
| ACTION | NAME | TYPE | DATA | TTL |
+--------+--------------+------+---------------+-----+
| + | example.com. | A | 51.250.**.*** | 600 |
+--------+--------------+------+---------------+-----+
Подробнее о команде yc dns zone add-records
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Чтобы создать ресурсную запись в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
Проверьте работу сайта
Теперь сайт на вашем веб-сервере доступен по доменному имени. Чтобы проверить работу сайта, введите в браузере его IP-адрес или доменное имя:
http://<публичный_IP-адрес_ВМ>
http://example.com
Как удалить созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- В сервисе Compute Cloud удалите созданную виртуальную машину.
- В сервисе Cloud DNS удалите созданную доменную зону.
- В сервисе Virtual Private Cloud удалите созданную группу безопасности, затем удалите созданную подсеть, затем удалите созданную сеть.
Как создать инфраструктуру с помощью Terraform
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Чтобы создать инфраструктуру для привязки доменного имени к ВМ с веб-сервером в Cloud DNS с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файл с описанием инфраструктуры:
Готовый архивСоздание вручную- Создайте папку для файла с описанием инфраструктуры.
- Скачайте архив
(2 КБ). - Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл
bind-domain-to-vm.tf
и файл с пользовательскими даннымиbind-domain-to-vm.auto.tfvars
.
-
Создайте папку для файла с описанием инфраструктуры.
-
Создайте в папке конфигурационный файл
bind-domain-to-vm.tf
:bind-domain-to-vm.tf
# Объявление переменных для пользовательских параметров variable "folder_id" { type = string } variable "domain_name" { type = string } variable "ssh_key_path" { type = string } # Добавление прочих переменных locals { network_name = "webserver-network" subnet_name = "webserver-subnet-ru-central1-b" sg_name = "webserver-sg" vm_name = "mywebserver" domain_zone_name = "my-domain-zone" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Создание облачной сети resource "yandex_vpc_network" "webserver-network" { name = local.network_name } # Создание подсети resource "yandex_vpc_subnet" "webserver-subnet-b" { name = local.subnet_name zone = "ru-central1-b" network_id = "${yandex_vpc_network.webserver-network.id}" v4_cidr_blocks = ["192.168.1.0/24"] } # Создание группы безопасности resource "yandex_vpc_security_group" "webserver-sg" { name = local.sg_name network_id = "${yandex_vpc_network.webserver-network.id}" ingress { protocol = "TCP" description = "http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } ingress { protocol = "TCP" description = "ssh" v4_cidr_blocks = ["0.0.0.0/0"] port = 22 } egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] from_port = 0 to_port = 65535 } } # Создание ВМ resource "yandex_compute_instance" "mywebserver" { name = local.vm_name platform_id = "standard-v2" zone = "ru-central1-b" resources { cores = "2" memory = "2" } boot_disk { initialize_params { image_id = "fd8jtn9i7e9ha5q25niu" } } network_interface { subnet_id = "${yandex_vpc_subnet.webserver-subnet-b.id}" nat = true security_group_ids = ["${yandex_vpc_security_group.webserver-sg.id}"] } metadata = { user-data = "#cloud-config\nusers:\n - name: yc-user\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ${file("${var.ssh_key_path}")}" } } # Создание зоны DNS resource "yandex_dns_zone" "my-domain-zone" { name = local.domain_zone_name zone = "${var.domain_name}." public = true } # Создание ресурсной записи типа А resource "yandex_dns_recordset" "rsА1" { zone_id = yandex_dns_zone.my-domain-zone.id name = "${yandex_dns_zone.my-domain-zone.zone}" type = "A" ttl = 600 data = ["${yandex_compute_instance.mywebserver.network_interface.0.nat_ip_address}"] }
-
Создайте в папке файл с пользовательскими данными
bind-domain-to-vm.auto.tfvars
:bind-domain-to-vm.auto.tfvars
folder_id = "<идентификатор_каталога>" ssh_key_path = "<путь_к_SSH-ключу>" domain_name = "<имя_домена>"
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
В файле
bind-domain-to-vm.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ, например~/.ssh/id_ed25519.pub
. Подробнее см. Создание пары ключей SSH.domain_name
— имя вашего домена, напримерexample.com
.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-