В качестве разминки в свободное время попробовал перенести свой блог ctrld.me на AWS. До этого он уже там жил достаточно долго, затем трафик поднялся из-за хостинга подкаста (нет, продолжать мы не собираемся) и я съехал на Digital Ocean.

Начал было вспоминать, как я это делал раньше, полез за json с описанием policy для конфигурирования bucket’а под публикацию для IAM, и тут понял, что есть более элегантное решение. Terraform.

Вот такой main.tf при использовании модуля terraform-website-s3-cloudfront-route53:

module "site-main" {
   source = "github.com/ringods/terraform-website-s3-cloudfront-route53//site-main"
   region = "eu-central-1"
   domain = "ctrld.me"
   duplicate-content-penalty-secret = "..."
   deployer = "ctrld.me"
   acm-certificate-arn = "arn:aws:acm:us-east-1:042588059738:certificate/707e5cf7-26ee-4312-9dfe-c8c7b0c3b74d"
   not-found-response-path = "/404.html"
}
module "dns-alias" {
   source = "github.com/ringods/terraform-website-s3-cloudfront-route53//r53-alias"
   domain = "ctrld.me"
   target = "${module.site-main.website_cdn_hostname}"
   cdn_hosted_zone_id = "${module.site-main.website_cdn_zone_id}"
   route53_zone_id = "Z29S0FURW76EDM"
}

Ручная работа — добавил SSL-сертификат для сайта в AWS Certificate Manager (до этого никогда с сервисом не работал).

S3 bucket, CloudFront distribution с подстановкой SSL-сертификата, публикация через отдельного IAM-пользователя контента, создание записей Route53 — всё делается автоматически после выполнения команд (после установки переменных окружения для AWS):

$ terraform validate
$ terraform plan
$ terraform apply

Почему мне эта тема очень нравится? Потому что прекрасно помню простыню инструкций из 10-15 пунктов, которые нужно было сделать при моём первом переносе блога на AWS. Тут же описал “инфрастуктуру как код” и всё, можешь повторять, сколько вздумается с абсолютным минимумом действий.

Дальше — выгрузка контента в S3 bucket через s3_website.

Попробовал, норма. Галочку поставил.

Процесс деплоя CloudFront не быстрый. Понадобилось минут 30-60, чтобы из “In progress” перешло в рабочий режим. И автоматического удаления CF Distribution не получилось из-за ошибки “что-то там Lambda требует ещё один параметр” (issue на Github есть”, нужно поправить в модуле параметр retain_on_delete). Пришлось вручную переводить в режим Disable, ждать минут 30 и затем удалять. Terraform ещё не удаляет непустой S3 bucket (что абсолютно правильно), сделал это командой:

$ aws s3 rb s3://site.ctrld-me --force --profile personal

На AWS блог не оставлю, смысла особого не вижу, да и не хочется заморачиваться с переделкой процесса генерации и публикации. Он и так мягко говоря непрост как для домашнего блога.

P.S. Продержал сайт в режиме PoC (Proof of Concept) на AWS день, потом прибил.