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.
Выбираем локацию для корзины:
$ aws ec2 describe-regions --output table ---------------------------------------------------------- | DescribeRegions | +--------------------------------------------------------+ || Regions || |+-----------------------------------+------------------+| || Endpoint | RegionName || |+-----------------------------------+------------------+| || ec2.eu-west-1.amazonaws.com | eu-west-1 || || ec2.ap-southeast-1.amazonaws.com | ap-southeast-1 || || ec2.ap-southeast-2.amazonaws.com | ap-southeast-2 || || ec2.eu-central-1.amazonaws.com | eu-central-1 || || ec2.ap-northeast-2.amazonaws.com | ap-northeast-2 || || ec2.ap-northeast-1.amazonaws.com | ap-northeast-1 || || ec2.us-east-1.amazonaws.com | us-east-1 || || ec2.sa-east-1.amazonaws.com | sa-east-1 || || ec2.us-west-1.amazonaws.com | us-west-1 || || ec2.us-west-2.amazonaws.com | us-west-2 || |+-----------------------------------+------------------+|
Создаём корзину:
$ aws s3 mb s3://rtfmcdnbucket1 --region eu-west-1 make_bucket: s3://rtfmcdnbucket1/
Проверяем:
$ aws s3 ls 2016-05-09 13:15:29 rtfmcdnbucket1
Добавляем в созданную козину данные. Например – файл file.txt
:
$ aws s3 cp file.txt s3://rtfmcdnbucket1 upload: ./file.txt to s3://rtfmcdnbucket1/file.txt
Устанавливаем права доступа на чтение Всем:
$ aws s3api put-object-acl --bucket rtfmcdnbucket1 --key file.txt --acl public-read
Проверяем:
$ aws s3api get-object-acl --bucket rtfmcdnbucket1 --key file.txt { "Owner": { "DisplayName": "1th", "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1" }, "Grants": [ { "Grantee": { "Type": "CanonicalUser", "DisplayName": "1th", "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/global/AllUsers" }, "Permission": "READ" } ] }
URL всегда (пока…) будет вида <имя_корзины>.s3.amazonaws.com/<имя_объекта>
.
Проверяем доступ по HTTPS:
$ curl -L https://rtfmcdnbucket1.s3.amazonaws.com/file.txt This is data from CloudFront
Этот файл был получен напрямую с корзины S3.
Далее – создадим CloudFront Web Distribution, что бы передавать данные через CDN.
Создание и настройка CloudFront Web Distribution
Переходим в панель управления>>> CloudFront, и жмём Create Distribution:
Создаём Web Distribution:
В поле Origin Domain Name выбираем созданную ранее корзину:
Для Default Cache Behavior Settings указываем:
Path Pattern
: какие данные будут кешироваться. По умолчанию – все (“*
“). Можно указать маску по расширению, например –images/*.jpg
.Viewer Protocol Policy
: протокол, по которому отдавать контент. Либо HTTP и HTTPS одновременно, либо переадресовывать HTTP на HTTPS, и отдавать по HTTPS, либо – можно включить только HTTPS. Подробнее – тут>>>.Allowed HTTP Methods
: разрешённые HTTP методы, по умолчанию –GET
иHEAD
.Forward Headers
: список заголовков, которые будут переданы вашему origin серверу . Параметры могут быть:All
: CloudFront будет передавать все заголовки вашему серверу, и не будет выполнять кеширование данныхWhitelist
: на ваш сервер будут переданы только заданные заголовкиNone
: CloudFront будет передавать все заголовки на ваш сервер, но не будет выполнять кеширвоание, основанное на заголовках. Подробнее о кешировании по заголовкам – см. тут>>>.
Object Caching
: время, в течении которого CloudFront будет хранить данные в кеше. Подробнее – тут>>>.Forward Cookies
: определяет передавать ли cookie на ваш сервер, и если да – то какие. Подробнее – тут>>>.Forward Query Strings
: передавать ли на ваш сервер всю строку с запросом (*/target=image.png&size=100
)Smooth Streaming
: использовать ли Microsoft Smooth StreamingRestrict Viewer Access
: использовать ли Signed URL-ы или Signed Cookie для доступа к объектам. Подробнее – тут>>>.Compress Objects Automatically
: выполнять ли сжатие для объектов, в заголовках запроса к которым указанAccept-Encoding: gzip
. Подробнее – тут>>>.
В Distribution Settings допустимы такие параметры:
Price Class
: стоимость CDN, основанная на регионах, в которых будет доступен ваш контент:- США и Европа
- США, Европа и Азия
- все локации
AWS WAF Web ACL
: если требуется использовать AWS WAF ACL – укажите его тутAlternate Domain Names
: при использовании собственного домена вместо домена от самого CloudFront – укажите его тут. Подробнее – тут>>> и дальше в посте.SSL Certificate
: настройки SSL для HTTPS:Default CloudFront Certificate
: используйте, если в приложении в качестве URL для данных указан домен CloudFront-а (например – rtfmcdnbucket1.cloudfront.net)Custom SSL Certificate
: используйте в случае, если подключаете свой домен к CDN. Подробнее – тут>>>.
Default Root Object
: объект, который будет возвращать CloudFront при обращении к корневому URL-у (например –GET http://rtfmcdnbucket1.cloudfront.net
)Logging
: логгировать ли все запросы к объектам в этой CDNDistribution State
: включение или выключение этой CDN
Эти и другие опции описаны тут>>>. Большую часть на данный момент можно не менять.
Жмём Create Distribution:
На создание сети может уйти до 15 минут.
После того, как статус изменится на Deployed – можно проверять получение данных через CDN.
Что бы использовать AWS CLI для CloudFront – её необходимо активировать, т.к. на момент написания эта возможность находится в preview:
$ aws configure set preview.cloudfront true
Проверить состояние CDN через AWS CLI можно с помощью команды get-distribution:
$ aws cloudfront get-distribution --id E1NXPHNQFOXWVP | grep Status "Status": "InProgress",
По окончании:
$ aws cloudfront get-distribution --id E1NXPHNQFOXWVP | grep Status "Status": "Deployed",
Проверяем как работает CDN.
Запрос из Киева:
$ curl -w "%{remote_ip}\n" -s https://d2ilvnn0n4hz39.cloudfront.net/file.txt -o /dev/null 54.230.228.238
И из Дублина (из дата-центра Amazon):
$ curl -w "%{remote_ip}\n" -s https://d2ilvnn0n4hz39.cloudfront.net/file.txt -o /dev/nul 54.192.29.120
Подключение своего домена
Последнее, что хотелось бы сделать – это привязать свой домен к созданной CDN.
У регистратора – создаём домен/субдомен с CNAME
домена, созданного CloudFront, в данном случае – d2ilvnn0n4hz39.cloudfront.net:
Проверяем:
$ dig cdn.setevoy.kiev.ua A +short d2ilvnn0n4hz39.cloudfront.net. 54.192.29.120 54.192.29.168 54.192.29.192 54.192.29.202 54.192.29.16 54.192.29.42 54.192.29.92 54.192.29.93
Если попробовать получить файл сейчас – 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.
Ссылки по теме
AWS: S3, Simple Storage Service – описание, примеры