Настройка хостинга статического сайта в бакете Yandex Object Storage с доступом через Yandex Cloud CDN с помощью Terraform
Чтобы создать инфраструктуру для хостинга сайта в бакете с доступом через Yandex Cloud CDN с помощью Terraform:
- Подготовьте облако к работе.
- Добавьте сертификат в Certificate Manager.
- Создайте инфраструктуру.
- Проверьте работу CDN.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для сайта в бакете с доступом через CDN входят:
- плата за исходящий трафик с CDN-серверов (см. тарифы Cloud CDN);
- плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage);
- плата за публичные DNS-запросы и DNS-зоны, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).
Добавьте сертификат в Certificate Manager
Поддерживаются сертификаты из Yandex Certificate Manager. Вы можете выпустить новый сертификат Let's Encrypt® или загрузить собственный.
Сертификат должен находиться в том же каталоге, в котором расположен ваш CDN-ресурс.
Для сертификата Let's Encrypt® пройдите проверку прав на домен, который указан в сертификате.
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-s3-cdn-hosting.git -
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
index.html— файл главной страницы сайта.yc-cdn-hosting.tf— конфигурация создаваемой инфраструктуры.yc-cdn-hosting.auto.tfvars— файл с пользовательскими данными.
- Создайте папку для конфигурационных файлов.
- Создайте в папке:
-
Файл главной страницы сайта
index.html:index.html
<!DOCTYPE html> <html> <head> <title>My site</title> </head> <body> <p>The site is working</p> </body> </html> -
Конфигурационный файл
yc-cdn-hosting.tf:yc-cdn-hosting.tf
# Объявление переменных для конфиденциальных параметров variable "folder_id" { type = string } variable "domain" { type = string } variable "cert_id" { type = string } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">=0.136.0" } # Получение информации о TLS-сертификате data "yandex_cm_certificate" "example_by_id" { certificate_id = var.cert_id } # Создание бакета resource "yandex_storage_bucket" "main-bucket" { bucket = var.domain folder_id = var.folder_id max_size = "1073741824" website { index_document = "index.html" } https { certificate_id = data.yandex_cm_certificate.example_by_id.id } depends_on = [data.yandex_cm_certificate.example_by_id] } # Настройка прав доступа для бакета resource "yandex_storage_bucket_grant" "my_grant_main" { bucket = yandex_storage_bucket.main-bucket.id grant { uri = "http://acs.amazonaws.com/groups/global/AllUsers" permissions = ["READ"] type = "Group" } depends_on = [yandex_storage_bucket.main-bucket] } # Загрузка объекта в бакет resource "yandex_storage_object" "index-page" { bucket = yandex_storage_bucket.main-bucket.id key = "index.html" source = "index.html" depends_on = [yandex_storage_bucket_grant.my_grant_main] } # Создание зоны DNS resource "yandex_dns_zone" "zone1" { name = "mydnszone" zone = "${var.domain}." public = true } # Создание записи DNS resource "yandex_dns_recordset" "rs1" { zone_id = yandex_dns_zone.zone1.id name = "cdn" type = "CNAME" ttl = 600 data = ["${data.yandex_cdn_resource.my_resource.provider_cname}"] depends_on = [yandex_cdn_resource.my_resource] } # Получение информации о ресурсе CDN data "yandex_cdn_resource" "my_resource" { resource_id = yandex_cdn_resource.my_resource.id } # Создание группы источников resource "yandex_cdn_origin_group" "my_group" { name = "updates-origin-group" use_next = true origin { source = "${var.domain}.website.yandexcloud.net" } } # Создание ресурса CDN resource "yandex_cdn_resource" "my_resource" { cname = "cdn.${var.domain}" active = true origin_protocol = "http" origin_group_name = yandex_cdn_origin_group.my_group.name options { custom_host_header = "${var.domain}.website.yandexcloud.net" redirect_http_to_https = true } ssl_certificate { type = "certificate_manager" certificate_manager_id = data.yandex_cm_certificate.example_by_id.id } } -
Файл с пользовательскими данными
yc-cdn-hosting.auto.tfvars:yc-cdn-hosting.auto.tfvars
folder_id = "<идентификатор_каталога>" domain = "<доменное_имя>" cert_id = "<идентификатор_TLS-сертификата>"
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- TLS-сертификат — источник данных yandex_cm_certificate.
- Бакет — yandex_storage_bucket.
- Настройка прав доступа к бакету с помощью ACL Object Storage — yandex_storage_bucket_grant.
- Объект — yandex_storage_object.
- DNS-зона — yandex_dns_zone.
- Ресурсная запись DNS — yandex_dns_recordset.
- CDN-ресурс — yandex_cdn_resource.
- Группа источников — yandex_cdn_origin_group.
-
-
В файле
yc-cdn-hosting.auto.tfvarsзадайте пользовательские параметры:folder_id— идентификатор каталога.domain— основное доменное имя, напримерexample.com.
Чтобы получить доступ к именам из публичной зоны, вам нужно делегировать домен. Укажите адреса серверовns1.yandexcloud.netиns2.yandexcloud.netв личном кабинете вашего регистратора.cert_id— идентификатор TLS-сертификата Certificate Manager с пройденной проверкой прав на домен.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
Важно
После создания CDN-ресурса может пройти до 15 минут, прежде чем ресурс фактически заработает.
Перед тем как приступать к следующим шагам, убедитесь, что вновь созданный CDN-ресурс полностью работоспособен.
Проверьте работу CDN
Дождитесь обновления DNS-записей — на это может потребоваться несколько часов.
Проверьте доступность сайта: откройте его по новому URL cdn.example.com. Должно произойти перенаправление на страницу https://cdn.example.com, где уже подключен TLS-сертификат из Certificate Manager и источником для раздачи является Cloud CDN.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
yc-cdn-hosting.tfи удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-