CloudFront — веб-сервис от Amazon, который призван ускорить доставку статического и динамического контента, такого как .html, .css, .php и файлы изображений конечному пользователю.
CloudFront распределяет ваши данные по сети датацентров, которые называются «пограничными локациями» (edge locations). Когда пользователь запрашивает контент, который обслуживается с помощью CloudFront — его запрос отправляется к ближайшей такой «локации», которая предоставляет наилучшее время ответа, и контент передаётся пользователю с неё, уменьшая таким образом время ответа сервера пользователю.
Если данные уже имеются на пограничном сервере — они будут переданы сразу же. В случае, если в CDN запрашиваемых данных ещё нет — они будут запрошены с S3 корзины или у HTTP-сервера, который будет указан в качестве исходного местаположения этих данных.
Содержание
Настройка CloudFront для доставки контента
Процесс настройки ваших данных к CloudFront включает в себя несколько шагов.
Вы настраиваете сервера с исходными данными (origin server), с которых CloudFront распределяет их по сети своих серверов. В роли вашего сервера данных могужет выступать корзина S3, HTTP сервера на EC2 или любой другой сервер вне AWS («custom origins»).
Вы загружаете данные на ваши сервера. Эти данные, далее называемые объектами, как правило представляют собой веб страницы, файлы изображения и любые другие данные, которые могут быть переданы по HTTP.
Вы создаете CloudFront Web Distribution, где указываете — с каких серверов CloudFront должен осбирать данные, когда пользователи запрашивают их в вашем веб-приложении. Там же вы указываете другие параметры вашего CDN, такие как — логгирование запросов к объектам в CDN.
CloudFront отправляет данные с вашими настройками (но не сами данные объектов) по всей сети AWS CDN.
В настройках вашего веб-приложения — вы используете доменное имя, которое генерируется и предоставляется CloudFront в ваших URL-ах. Например — CloudFront возвращает доменное имя вида d111111abcdef8.cloudfront.net. Тогда URL в файлу с логотипом будет выглядеть как http://d111111abcdef8.cloudfront.net/logo.jpg. Вы так же можете настроить CloudFront на использование вашего собственного домена.
Вы так же можете дополнительно настроить то, как именно CDN будет возвращать ваши данные. Например — можно добавить заголовки, которые будут указывать — сколько времени CloudFront должен держать данные в кеше. По умолчанию — данные хранятся 24 часа. Подробнее — тут>>>.
Как CloudFront доставляет контент пользователям
Вот что происходит после того, как вы настроите CloudFront:
Пользователь обращается к веб-приложению и запрашивает один или больше объектов, таких как изображения или HTML-файлы.
DNS отправляет запрос к ближайшей локации CloudFront.
В локации — CloudFront проверяет свой кеш на наличие запрашиваемого объекта. Если объект уже есть в кеше — CloudFront сразу вернёт его пользователю. Если нет — CloudFront выполняет следующие шаги:
CloudFront проверяет запрос с вашими настройками и перенаправляет запрос к подходящему источнику оригинальных данных, например — к корзине S3 для загрузки изображения или EC2 машине с HTTP сервером — для загрузки HTML файла.
Ваш источник возвращает данные на пограничные сервера CloudFront.
Как только CloudFront получает первые байты информации от вашего источника — он начинает их передачу пользователю и сохраняет объект в своём кеше для последующих запросов.
После того, как объект просуществовал в кеше CloudFront более определенного времени (24 часа или время, указанное в заголовках ваших объектов) — происходит слеюущее:
CloudFront перенаправляет следующий запрос к вашему серверу, что бы проверить — содержится ли в кеше CloudFront последняя актуальная версия файла.
Если версия объекта не изменилась — CloudFront возвращает объект пользователю. Если же объект был изменён — CloudFront обновляет данные в кеше, и после этого продолжает отдавать их пользователю.
Настройка Amazon CloudFront
Создание корзины S3 и доабвление контента
Создание и настройка CloudFront Web Distribution
Подключение своего домена
Создание корзины S3 и доабвление контента
По умолчанию — все данные в корзинах S3 являются приватными и недоступны для чтения. Вы должны явно указать права доступа для каждого объекта, который будет обслуживаться CDN.
Для ограничения доступа к данным в CDN — вы можете использовать настройки приватного контента в CloudFront.
В поле Origin Domain Name выбираем созданную ранее корзину:
Для Default Cache Behavior Settings указываем:
Path Pattern: какие данные будут кешироваться. По умолчанию — все («*«). Можно указать маску по расширению, например — images/*.jpg.
Viewer Protocol Policy: протокол, по которому отдавать контент. Либо HTTP и HTTPS одновременно, либо переадресовывать HTTP на HTTPS, и отдавать по HTTPS, либо — можно включить только HTTPS. Подробнее — тут>>>.
Forward Headers: список заголовков, которые будут переданы вашему origin серверу . Параметры могут быть:
All: CloudFront будет передавать все заголовки вашему серверу, и не будет выполнять кеширование данных
Whitelist: на ваш сервер будут переданы только заданные заголовки
None: CloudFront будет передавать все заголовки на ваш сервер, но не будет выполнять кеширвоание, основанное на заголовках. Подробнее о кешировании по заголовкам — см. тут>>>.
Object Caching: время, в течении которого CloudFront будет хранить данные в кеше. Подробнее — тут>>>.
Forward Cookies: определяет передавать ли cookie на ваш сервер, и если да — то какие. Подробнее — тут>>>.
Forward Query Strings: передавать ли на ваш сервер всю строку с запросом (*/target=image.png&size=100)
Alternate Domain Names: при использовании собственного домена вместо домена от самого CloudFront — укажите его тут. Подробнее — тут>>> и дальше в посте.
Default CloudFront Certificate: используйте, если в приложении в качестве URL для данных указан домен CloudFront-а (например — rtfmcdnbucket1.cloudfront.net)
Custom SSL Certificate: используйте в случае, если подключаете свой домен к CDN. Подробнее — тут>>>.
Default Root Object: объект, который будет возвращать CloudFront при обращении к корневому URL-у (например — GET http://rtfmcdnbucket1.cloudfront.net)
Logging: логгировать ли все запросы к объектам в этой CDN
Если попробовать получить файл сейчас — CloudFront сообщит об ошибке:
$ curl -L http://cdn.setevoy.kiev.ua/file.txt
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
Bad request.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: CNIoP8Azon3VethMjpFWwyD4pkEbV06kOSCX7AUJ2-QdKu3fTuwAJQ==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
Переходим в управление CloudFront и редактируем созданное подключение, где в Alternate Domain Names указываем созданный домен:
Опять-таки — необходимо подождать, пока CloudFront применит новые параметры в своей сети:
Проверяем:
$ curl http://cdn.setevoy.kiev.ua/file.txt
This is data from CloudFront
Либо через HTTPS:
$ curl https://cdn.setevoy.kiev.ua/file.txt --insecure
This is data from CloudFront
--insecure требуется, т.к. используется сертификат самого CloudFront (параметр SSL Certificate из Distribution Details).
Собственно — это всё, что потребуется для начала работы с CloudFront от Amazon.
Дальше — запилим свой WordPress блог с CloudFront и статическими данными в корзине S3.