Задача

Есть AWS аккаунт, на котором требуется поднять статический сайт (html, js, css, png, jpg) на своём домене example.com.

Ссылки: http://example.com, http://www.example.com, https://www.example.com должны перенаправлять на основной сайт https://example.com.

План действий

  • Покупка домена

  • Выпуск SSL сертификата

  • Заливка файлов html, js, css в S3.

  • Создание двух CloudFront distributions (основного и для редиректа с www)

  • Привязка CloudFront функции редиректа к CloudFront distribution

  • Создание A-записей в DNS

Покупка домена

Route 53Registered domainsRegister domains
Ищем нужный домен example.com, оплачиваем. Домен появляется в списке Registered domains.
В разделе Route 53Hosted zones будет создана hosted zone для выбранного домена example.com с DNS записями NS и SOA.

Выпуск SSL сертификата

Выпускаем Amazon issued SSL certificate для двух доменов: example.com и www.example.com.
AWS Certificate ManagerCertificatesRequest certificate
Request a public certificate, Next.
Fully qualified domain name: example.com
Нажать Add another name to this certificate. Добавить www.example.com
Validation method: DNS validation - recommended
Нажать Request.
View certificate. Нажать Create records in Route 53.
В течение нескольких минут статус сертификата поменяется на Issued. Он будет автоматически перевыпускаться до истечения срока действия (год).

Заливка файлов в S3

S3Create bucket.
Bucket name: example-com (точки меняем на дефис)
AWS Region: любой по желанию.
Включить Block all public access. (Публичный доступ к файлам в S3 крайне не рекомендуется, AWS предоставляет другие способы доступа)
Нажать Create bucket.
В корень бакета заливаем файл index.html и другие статические файлы любым удобным способом (перетаскиванием или AWS CLI, если файлов много или сложная структура папок) с настройками по умолчанию.

CloudFront distribution для example.com

CloudFrontDistributionsCreate distribution
Origin domain: выбрать из списка example-com.s3.amazonaws.com (это S3 бакет, созданный на предыдущем шаге).
Origin access: Origin access control settings (recommended)
Нажать Create control setting. Нажать Create. Выбрать его из списка.
Появится предупреждение: You must update the S3 bucket policy
Viewer protocol policy: Redirect HTTP to HTTPS (для редиректа http://example.comhttps://example.com)
Отметить Do not enable security protections
Price class: выбрать нужный по балансу цена/время отклика.
Alternate domain name (CNAME) → Add item → example.com
Custom SSL certificate: Выбрать SSL сертификат из списка.
Default root object: index.html
Нажать Create distribution.

CloudFront функция для редиректа www.example.com → example.com

CloudFront Functions появились в 2021г. как более простая и дешёвая замена Lambda@Edge функций для программной модификации HTTP ответов и заголовков. Эта функция будет использована во вспомогательном CloudFront distribution (www.example.com) на следующем шаге. Когда бразер запрашивает страницу из distribution, к которому привязана эта функция, она мгновенно, без доступа к файлам в S3, вернёт HTTP ответ с кодом 301 (Permanently Moved) и новым URL, https://example.com.

CloudFrontFunctionsCreate function
Name: Redirect-www-example-com
Description: Redirect www.example.com to https://example.com
Нажать Create function.
На вкладке Development заменить код функции на такой, изменив значение ключа location на свой домен:

function handler(event) {
    // NOTE: This example function is for a viewer request event trigger. 
    // Choose viewer request for event trigger when you associate this function with a distribution. 
    var response = {
        statusCode: 301,
        statusDescription: 'Moved Permanently',
        headers: {
            'cloudfront-functions': { value: 'generated-by-CloudFront-Functions' },
            'location': { value: 'https://example.com' }
        }
    };
    return response;
}

Нажать Save changes. Вкладка Publish → кнопка Publish function.

CloudFront distribution для редиректа www.example.com → example.com

CloudFrontDistributionsCreate distribution
Origin domain: выбрать из списка example-com.s3.amazonaws.com (выбранное значение не важно, т.к. будет настроен редирект).
Origin access: Origin access control settings (recommended)
Origin access control: выбрать ранее созданный.
Viewer protocol policy: HTTP and HTTPS
В разделе Function associations, в строке Viewer request выбрать CloudFront Functions, выбрать Redirect-www-example-com (функция, созданная на предыдущем шаге)
Отметить Do not enable security protections
Price class: выбрать нужный по балансу цена/время отклика.
Alternate domain name (CNAME) → Add item → www.example.com
Custom SSL certificate: Выбрать тот же SSL сертификат из списка.
Default root object: оставить пустым (не имеет значения).
Нажать Create distribution.
После создания distribution скопировать в буфер текст policy для S3.
Текст policy вставить в S3 → example-com → Permissions → Bucket policy.

Создание A-записи для example.com

Route 53Hosted zones → example.com
Create record.
Record name: example.com (поле ввода subdomain - пустое)
Record type: A.
Alias: Yes.
Route traffic to: Alias to CloudFront distribution.
Choose distribution: example.com (*.cloudfront.net).
Нажать Create records.

Создание A-записи для www.example.com

Route 53Hosted zones → example.com
Create record.
Record name: www.example.com (в поле ввода subdomain вписать www)
Record type: A.
Alias: Yes.
Route traffic to: Alias to CloudFront distribution.
Choose distribution: www.example.com (*.cloudfront.net).
Нажать Create records.
Обычно записи активируются в течение пары минут.

Результат

Сайт работает по главной ссылке https://example.com.
CloudFront обеспечивает быструю загрузку файлов сайта при любой нагрузке. Обслуживание не требуется.
Ссылки http://www.example.com, https://www.example.com, http://example.com перенаправляют (HTTP code 301) на основной сайт https://example.com.
Обратное перенаправление (example.comwww.example.com) при необходимости делается похожим образом.

Такой способ хостинга отлично работает для небольших сайтов с невысокой нагрузкой. При наличии тяжёлой графики и высокой частоты запросов итоговая цена может оказаться высоковата и стоит задуматься об альтернативах.

Комментарии (20)


  1. Sanes
    28.12.2023 20:09
    -1

    Для чего это? Хостинг стоит копейки.


    1. WondeRu
      28.12.2023 20:09
      +2

      Когда вся инфра в aws, бывает проще сделать на том же решении.


      1. Sanes
        28.12.2023 20:09

        Это по-вашему проще?


  1. BogdanPetrov
    28.12.2023 20:09

    Во сколько в итоге это обойдется? На yandex cloud похожий вариант у меня получился за ~ 30 рублей в месяц, так как нужно оплачивать Cloud DNS, остальное укладывается в бесплатные лимиты.


    1. Andreyul Автор
      28.12.2023 20:09

      Минимум: годовая оплата за доменное имя ($13/год за .com) и $0.5/месяц за управление зоной DNS Route53. Остальные затраты зависят от текущей нагрузки на сайт и объёма переданных ГБ: от пары центов до сотен $ в месяц.


      1. Tempest23
        28.12.2023 20:09
        +1

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


  1. savostin
    28.12.2023 20:09

    А можно тоже самое, но только отдельную папку домена хостить на S3, а весь сайт на Lambda/EC2?


    1. Andreyul Автор
      28.12.2023 20:09

      К этому решению возможно добавить Ajax запросы из JS в бэкенд на API Gateway + Lambda.


      1. YegorP
        28.12.2023 20:09
        +1

        Лямбда это отдельный головняк из-за холодных стартов.


  1. denis-isaev
    28.12.2023 20:09
    +6

    У дедов проще было )

    server {
        listen       80;
        server_name  example.com www.example.com;
        return       301 https://example.com$request_uri;
    }
    server {
        listen       443;
        server_name  www.example.com;
        return       301 https://example.com$request_uri;
    }
    server {
        listen       443;
        server_name  example.com;
        ...
    }


    1. Vaderom
      28.12.2023 20:09
      +1

      Да, только статический сайт в конфигурации в статье даёт вам сразу кучу преимуществ:

      • Он дешевле, т.к не нужен сервер с процессором для того чтоб запускать апач

      • Он надежнее т.к у S3 хранилища и остальных компонент аптайм выше чем у вашего сервера с апачем

      • Он быстрее, т.к тут вы получаете CDN в комплекте

      • Он требует меньше головняка ибо не нужно обновлять сертификат

      Да и насчёт простоты - конфигурация описанная в статье поднимается 30 строками терраформ кода которые можно найти в гитхабе готовым модулем. При желании сразу интегрированным с гитхабом для авто-обновления сайта с билдом (если скажем страничка на nodejs с webpack). И не нужно покупать сервер, ставить операционку, ставить апач и различные fail2ban и иже с ними механизмы как обезопасить сервер.

      Так что не уверен что на самом деле проще. Наверное только github pages и всякие такие.

      (автор сего камента сам много лет apt-get install apache2 пока не ушел в девопс, если что)


      1. denis-isaev
        28.12.2023 20:09
        +6

        Вообще мой коммент был лулзов ради, но с вашими утверждениями готов поспорить :)

        Он дешевле, т.к не нужен сервер с процессором

        Сервер вам все равно нужен :) Обязательно с процессором :) Причем он будет нагружен кроме вашего редиректа еще тоннами логики приложений высокого уровня абстракций, которые скрывают от вас тот низкий уровень абстракции, где апач и процессор.
        А сравнивать стоимость облака с необлаком без конкретных величин трафика, и т.п. бессмысленно. Каждый будет прав.

        для того чтоб запускать апач

        В моем примере апач запускать не надо :)

        Он надежнее т.к у S3 хранилища и остальных компонент аптайм выше чем у вашего сервера с апачем

        Дискуссионное утверждение )

        Он быстрее, т.к тут вы получаете CDN в комплекте

        Точно быстрее? После фразы в статье "Price class: выбрать нужный по балансу цена/время отклика."? Более того, тут вот пишут, что для этих функций latency 100мс - это офигеть как круто.

        Он требует меньше головняка

        Меньше головняка, что аж статью написали о том как это сделать :) Причем через 2 года она скорее всего устареет т.к. админ интерфейсы у прова изменятся и кнопки тыкать нужно будет в других местах.

        И не нужно покупать сервер, ставить операционку, ставить апач и различные fail2ban и иже с ними механизмы как обезопасить сервер.

        Ну да, без fail2ban на каком-нить vsp, если вдруг вы заинтересовали какого-нибуть доморощенного кулхацкера, у вас будет лежать сервер с вашей статикой, а на serverless, у вас будет лежать на столе счет на несколько килобаксов, т.к. хардлимитов из коробки нет, а прикрутить костыли для гашения всего этого добра, если оно начало жрать финансы, модуля терраформ не нашлось )

        P.S.
        Но я не хейчу облака, если что ) Они вполне круты для определенного рода задач.


        1. Vaderom
          28.12.2023 20:09


          Данное в статье решение, емнип, умещается в free tier амазона, так что сильно волноватся насчет внезапного счёта на пару килобаксов я бы не стал. Хотя если это волнует больше чем аптайм сайта, склонен согласится. Я в данном случае возможно забил бы на редирект с http вообще, ибо не помню где и кто последние пару лет куда либо тыкался по http, тем самым уменьшил риск на перерасход квоты запусков.

          Время отдачи самого cloudfront на порядок быстрее чем запуск фукнции, и это то что вы получите при прямом доступе к файлам по https. И это будет более-менее одинаково безотносительно того как далеко юзер от вашего сервера.

          Если не рассматривать варианты физического сервера (или кустарщину а-ля подавать сайт с домашнего компа) - альтернативы облаку в данном случае все сами по себе "облачные", будь то vpc-шка в хецнере или что либо другое. Так что для данных требований на сегодняшний день, если ты не организация у которой есть своя платформа для раздачи статики - шило на мыло, а мыло в этом случае означает админить свой сервак. Для дедов у которых конфиги апача от зубов отскакивают - не вопрос. А для тех кто родился после 2000 года - уже не факт ))

          И вам придётся таки жёстко поспорить за утверждение что S3 + cloudfront не обгоняют по надёжности сервачок с апачем, даже если его админит сам Линус ))

          а прикрутить костыли для гашения всего этого добра, если оно начало жрать финансы, модуля терраформ не нашлось )

          terraform destroy
          Проблема не гасить, проблема узнать что есть проблема, особенно в амазоне где обновления билинга могут опаздывать аж на сутки, за которы может утечь много воды баксов.

          Хотя в целом, если требуется поднять статический сайт хоть как-то за 2 копейки я бы тоже не шёл в амазон а выбрал бы решение где биллинг фиксирован и есть защита от такой ерунды, даже если это будет стоить на пару копеек больше, зато фикс.


          1. Arkasha
            28.12.2023 20:09
            +1

            Вы сами пишете, что счёт может быть несколько сотен баксов, потом - что "Он дешевле", а потом - что нет нормальной защиты от гигантских счетов (при чём амазоны специально всё путают)

            Время отдачи самого cloudfront на порядок быстрее чем запуск фукнции

            В примере nginx файлы отдаёт. Он быстрый. Вы бы лучше написали, какая нагрузка планируется, чтобы вам можно было наглядно на примере ответить по финансам

            льтернативы облаку в данном случае все сами по себе "облачные", будь то vpc-шка в хецнере или что либо другое

            Альтернатива - vps. Без "облаков" (как хостинги жили и живут без этого слова - загадка)

            И вам придётся таки жёстко поспорить за утверждение что S3 + cloudfront не обгоняют по надёжности сервачок с апачем

            Есть вероятность, что у вас деньги на "облако" раньше закончатся, чем vps-ка ляжет, в остальном тут не о чем спорить.


            1. Dmitri-D
              28.12.2023 20:09
              +1

              да, но только скорость nginx не играет никакой роли если а) у вас тормозной диск, а файлов много и они не влазят в кеш б) если клиент с другой стороны земли и до него сигнал даже со скоростью света, без учета тормозов раутеров, всё равно идет десятки миллисекунд. Скажете это не много? Но в силу особенностей протокола HTTP вам нужно сначала запросить страницу, потом получить ее - вот уже пакет туда и пакет обратно. А потом надо запросить все ресурсы на этой странице (картинки и стили) и снова пакет туда, пакет обратно. Уже 4 раз. Это еще если сессия SSL уже установлена. А если нет - браузер еще должен получить сертификат и сбегать проверить его цепочку. Обычно и сертификаты цепочки - в той же стране.
              AWS решает эту проблему наличием датацентров во всех уголках мира, за исключением некоторых стран, напр. России. Врочем, судя по всему, Россия была в планах тоже. Поэтому 30ms на RTT сокращаются до минимума и всё работает быстрее.
              И S3 надежнее, конечно, чем одиночный диск, не нужно с этим спорить. И горизонтально масштабируется очень хорошо.


              1. denis-isaev
                28.12.2023 20:09

                100мс форы, которую дает latency этих CloudFront Functions покроют удаленность клиента от сервера при отсутствии CDN.

                Касательно надежности S3, я вот тут нашел SLA амазона на S3 в котором они пишут, что за просадки до 99.9 они вообще никак не отвечают, а за просадки до 99.0 они отвечают 10% платежа. Т.е. получается они официально могут лежать до 40 минут в месяц без штрафов, а за штраф в 10% могут спокойно валяться 7.5 часов каждый месяц. Не сказал бы, что это крутой SLA. Вот тут попсовый beget обещает такой же SLA на свои VPS-ки.

                Если что я не хейчу облака или CDN - это важные штуки, но пользоваться ими надо уметь, бездумное использование может приводить к забавным последствиям.
                В гугле целый плейлист запилили на несколько часов посмотра на предмет "как не залететь". И это только верхушка айсберга )


    1. chilic
      28.12.2023 20:09
      +1

      У дедов было так:

      <IfModule mod_rewrite.c>
      RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
      RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
      </IfModule>


      1. denis-isaev
        28.12.2023 20:09

        Тогда уж виртуалхостами: ) И тогда надо наоборот non_www -> www, в те времена именно так редиректили :)


  1. zabanen2
    28.12.2023 20:09

    я в восторге от гайда!
    1) структурированность
    2) восхитительная последовательность ссылок вместо обычных скриншотов или описания действий!
    3) текст вместо скриншотов!
    4) компактность!
    5) единичная статья с нормальными тегами


  1. BobArctor
    28.12.2023 20:09

    И пачка случайно (или не очень) пришедших ботов отправляет ваш баланс привязанной карты в минус (пока "бесконечно масштабируемое решение" не стукнется о lambda concurrency soft limit)