Этот репозиторий содержит демонстрационные примеры для статьи Развертывание статического веб-сайта в отказоустойчивой конфигурации в Yandex Cloud. В статье рассматриваются сильные и слабые стороны различных вариантов размещения статического сайта (лендинга) в инфраструктуре Yandex Cloud.
Демонстрационный пример представляет собой статический сайт и форму регистрации. В результате заполнения формы введенные пользователем данные отправляются в письме на заданный адрес электронной почты.
Все операции по развертыванию инфраструктуры и приложения выполняются с помощью файлов конфигурации Terraform. При изменении файлов конфигурации Terraform автоматически определяет, какая часть конфигурации уже развернута и не требует изменений, какие ресурсы следует создать, а какие — изменить или удалить.
Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигурации, содержащих описание инфраструктуры на языке HCL (HashiCorp Configuration Language). Terraform и его провайдеры распространяются под лицензией Business Source License.
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.
Для развертывания инфраструктуры, описанной в статье, используются компоненты следующих сервисов Yandex Cloud:
- Yandex Object Storage
- Yandex Cloud CDN
- Yandex Certificate Manager
- Yandex Cloud DNS
- Yandex Cloud Functions
- Yandex API Gateway
- Yandex Application Load Balancer
- Yandex Virtual Private Cloud
Для вариантов решения Бакет Yandex Object Storage с публичным доступом и раздачей контента через Yandex Cloud CDN и Бакет Yandex Object Storage без публичного доступа с Yandex API Gateway и раздачей контента через Yandex Cloud CDN расходы на потребление сервисов в тестовом режиме (установка — проверка — удаление) укладываются в рамки уровня нетарифицируемого использования (Free Tier), за исключением услуги хостинга публичной зоны Cloud DNS (расходы менее 2 рублей в сутки, подробнее в разделе Правила тарификации для Cloud DNS).
Для варианта решения Бакет Yandex Object Storage без публичного доступа с Yandex Application Load Balancer к расходам добавляется стоимость использования L7-балансировщика. Подробнее в разделе Правила тарификации для Yandex Application Load Balancer.
bootstrap/— файлы конфигурации Terraform для создания общей части инфраструктуры.cdn-s3/— пример конфигурации Terraform для развертывания варианта решения Бакет Yandex Object Storage с публичным доступом и раздачей контента через Yandex Cloud CDN.cdn-apigw-s3/— пример конфигурации Terraform для развертывания варианта решения Бакет Yandex Object Storage без публичного доступа с Yandex API Gateway и раздачей контента через Yandex Cloud CDN.alb-s3-pe/— пример конфигурации Terraform для развертывания варианта решения Бакет Yandex Object Storage без публичного доступа с Yandex Application Load Balancer.static-site/— исходный код статического сайта и функции-обработчика формы регистрации.tf-modules/— общие модули конфигурации Terraform.tf-state/— каталог хранения состояния (state) bootstrap-части конфигурации.
Создание инфраструктуры состоит из двух этапов:
-
Создание общих объектов: DNS-зона, служебные DNS-записи, сертификат Let's Encrypt, почтовый адрес Yandex Cloud Postbox для рассылок.
-
Создание инфраструктуры для варианта решения из сценария.
Одновременно можно создать инфраструктуру только для одного варианта решения. Прежде чем развертывать инфраструктуру для какого-либо варианта, убедитесь, что ресурсы, созданные для других вариантов решения, были удалены.
Чтобы создать инфраструктуру для вариантов решений из статьи с помощью Terraform, выполните следующие шаги:
-
Установите Terraform, получите данные для аутентификации и настройте провайдер.
-
Клонируйте этот репозиторий:
git clone git@github.com:yandex-cloud-examples/yc-object-storage-cdn-static-site.git
-
Перейдите в каталог репозитория:
cd yc-object-storage-cdn-static-site -
В файле
bootstrap/terraform.tfvarsзадайте пользовательские параметры:-
folder_id— идентификатор каталога. -
site_domain— доменное имя, по которому будет доступен развернутый сайт: допускается использование доменных имен второго уровня и выше.Для успешного создания инфраструктуры необходимо, чтобы домен более низкого уровня был делегирован сервису Yandex Cloud DNS.
Например:
- если приложение будет опубликовано на домене
staticsite.yc.example.com, в Yandex Cloud DNS должна быть делегирована зонаyc.example.comилиexample.com; - если приложение будет опубликовано на домене
my.example.com, то делегировать нужно доменexample.com.
- если приложение будет опубликовано на домене
-
email_recipient— адрес получателя сообщений о регистрации. -
dns_origin— имя доменной зоны, делегированной в Yandex Cloud DNS.Если делегируется домен третьего уровня и выше (например,
my.example.com,my.new.example.com,my.other.new.example.comи т.д.), в переменнойdns_originукажите имя делегируемого домена. Если делегируется домен второго уровня (например,example.com), то задавать эту переменную не нужно.
Пример файла
bootstrap/terraform.tfvarsfolder_id = "b1gt6g8ht345********" site_domain = "my.example.com" email_recipient = "myemail@example.com" dns_origin = "example.com" # Имя делегируемого домена, требуется указать если делегируется домен третьего уровня и выше
-
-
Инициализируйте Terraform в каталоге
bootstrap:terraform -chdir=bootstrap/ init
-
Проверьте корректность конфигурационных файлов с помощью команды:
terraform -chdir=bootstrap/ validate
Если конфигурация корректна, Terraform выведет сообщение:
Success! The configuration is valid. -
Создайте IAM-токен для авторизации провайдера Terraform в Yandex Cloud:
YC_TOKEN=$(yc iam create-token) && export YC_TOKEN
-
Посмотрите список и параметры ресурсов, которые будут созданы при развертывании инфраструктуры:
terraform -chdir=bootstrap/ plan
В терминале будет выведен список запланированных к созданию ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Разверните инфраструктуру:
terraform -chdir=bootstrap/ apply
В процессе выполнения команды Terraform запросит подтверждение создания инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения создания всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Apply complete! Resources: 57 added, 0 changed, 0 destroyed. Outputs: ... -
После создания инфраструктуры дождитесь перехода SSL-сертификата в состояние
Issued. На это может потребоваться до 40 минут.
-
Создайте IAM-токен для авторизации провайдера Terraform в Yandex Cloud:
YC_TOKEN=$(yc iam create-token) && export YC_TOKEN
-
Инициализируйте Terraform в каталоге
cdn-s3:terraform -chdir=cdn-s3/ init
-
Проверьте корректность конфигурационных файлов и посмотрите список ресурсов, планируемых к созданию, с помощью команд:
terraform -chdir=cdn-s3/ validate terraform -chdir=cdn-s3/ plan
-
Разверните инфраструктуру:
terraform -chdir=cdn-s3/ apply
В процессе выполнения команды Terraform запросит подтверждение создания инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения создания всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Apply complete! Resources: 57 added, 0 changed, 0 destroyed. Outputs: ... -
Убедитесь в работоспособности сайта. Для этого в браузере откройте сайт по адресу, который был указан в параметре
site_domain. Например:https://my.example.com.После создания инфраструктуры может дополнительно потребоваться до 30 минут, чтобы внесенные изменения применились в Yandex Cloud CDN и сайт стал доступен.
-
Заполните форму случайными данными и нажмите кнопку, чтобы отправить их.
-
Убедитесь, что письмо с уведомлением о регистрации доставлено на адрес, указанный в параметре
email_recipient. -
Убедитесь, что сайт недоступен по служебным адресам бакета, таким как
http://storage.yandexcloud.net/my.example.com.Подробнее о служебных адресах бакета читайте в разделах URL бакета и Хостинг статических сайтов.
-
Удалите созданные ранее ресурсы:
terraform -chdir=cdn-s3/ destroy
В процессе выполнения команды Terraform запросит подтверждение удаления инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения удаления всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Destroy complete! Resources: 57 destroyed.
Бакет Yandex Object Storage без публичного доступа с Yandex API Gateway и раздачей контента через Yandex Cloud CDN
-
Создайте IAM-токен для авторизации провайдера Terraform в Yandex Cloud:
YC_TOKEN=$(yc iam create-token) && export YC_TOKEN
-
Инициализируйте Terraform в каталоге
cdn-apigw-s3:terraform -chdir=cdn-apigw-s3/ init
-
Проверьте корректность конфигурационных файлов и посмотрите список ресурсов, планируемых к созданию, с помощью команд:
terraform -chdir=cdn-apigw-s3/ validate terraform -chdir=cdn-apigw-s3/ plan
-
Разверните инфраструктуру:
terraform -chdir=cdn-apigw-s3/ apply
В процессе выполнения команды Terraform запросит подтверждение создания инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения создания всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Apply complete! Resources: 57 added, 0 changed, 0 destroyed. Outputs: ... -
Убедитесь в работоспособности сайта. Для этого в браузере откройте сайт по адресу, который был указан в параметре
site_domain. Например:https://my.example.com.После создания инфраструктуры может дополнительно потребоваться до 30 минут, чтобы внесенные изменения применились в Yandex Cloud CDN и сайт стал доступен.
-
Заполните форму случайными данными и нажмите кнопку, чтобы отправить их.
-
Убедитесь, что письмо с уведомлением о регистрации доставлено на адрес, указанный в параметре
email_recipient. -
Убедитесь, что сайт недоступен по служебным адресам бакета, таким как
http://secretbucket-xxxxx.storage.yandexcloud.net.Подробнее о служебных адресах бакета читайте в разделе URL бакета.
-
Удалите созданные ранее ресурсы:
terraform -chdir=cdn-apigw-s3/ destroy
В процессе выполнения команды Terraform запросит подтверждение удаления инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения удаления всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Destroy complete! Resources: 57 destroyed.
-
Создайте IAM-токен для авторизации провайдера Terraform в Yandex Cloud:
YC_TOKEN=$(yc iam create-token) && export YC_TOKEN
-
Инициализируйте Terraform в каталоге
alb-s3-pe:terraform -chdir=alb-s3-pe/ init
-
Проверьте корректность конфигурационных файлов и посмотрите список ресурсов, планируемых к созданию, с помощью команд:
terraform -chdir=alb-s3-pe/ validate terraform -chdir=alb-s3-pe/ plan
-
Разверните инфраструктуру:
terraform -chdir=alb-s3-pe/ apply
В процессе выполнения команды Terraform запросит подтверждение создания инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения создания всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Apply complete! Resources: 57 added, 0 changed, 0 destroyed. Outputs: ... -
Убедитесь в работоспособности сайта. Для этого в браузере откройте сайт по адресу, который был указан в параметре
site_domain. Например:https://my.example.com.После создания инфраструктуры может дополнительно потребоваться до 10 минут, чтобы внесенные изменения применились в DNS.
-
Заполните форму случайными данными и нажмите кнопку, чтобы отправить их.
-
Убедитесь, что письмо с уведомлением о регистрации доставлено на адрес, указанный в параметре
email_recipient. -
Убедитесь, что сайт недоступен по служебным адресам бакета, таким как
http://secretbucket-xxxxx.storage.yandexcloud.net.Подробнее о служебных адресах бакета читайте в разделе URL бакета.
-
Удалите созданные ранее ресурсы:
terraform -chdir=alb-s3-pe/ destroy
В процессе выполнения команды Terraform запросит подтверждение удаления инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения удаления всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Destroy complete! Resources: 57 destroyed.
-
Удалите созданные ранее ресурсы:
terraform -chdir=bootstrap/ destroy
В процессе выполнения команды Terraform запросит подтверждение удаления инфраструктуры: в терминале введите слово
yesи нажмите Enter. -
Дождитесь завершения удаления всех ресурсов. В случае успеха вывод Terraform не будет содержать ошибок и завершится финальным уведомлением:
Destroy complete! Resources: 57 destroyed.