AWS: CloudFront — описание, примеры

Автор: | 05/09/2016
 

aws-logo-square-02CloudFront — веб-сервис от Amazon, который призван ускорить доставку статического и динамического контента, такого как .html, .css, .php и файлы изображений конечному пользователю.

CloudFront распределяет ваши данные по сети датацентров, которые называются «пограничными локациями» (edge locations). Когда пользователь запрашивает контент, который обслуживается с помощью CloudFront — его запрос отправляется к ближайшей такой «локации», которая предоставляет наилучшее время ответа, и контент передаётся пользователю с неё, уменьшая таким образом время ответа сервера пользователю.

Если данные уже имеются на пограничном сервере — они будут переданы сразу же. В случае, если в CDN запрашиваемых данных ещё нет — они будут запрошены с S3 корзины или у HTTP-сервера, который будет указан в качестве исходного местаположения этих данных.

Настройка CloudFront для доставки контента

Процесс настройки ваших данных к CloudFront включает в себя несколько шагов.

  1. Вы настраиваете сервера с исходными данными (origin server), с которых CloudFront распределяет их по сети своих серверов. В роли вашего сервера данных могужет выступать корзина S3, HTTP сервера на EC2 или любой другой сервер вне AWS («custom origins»).
  2. Вы загружаете данные на ваши сервера. Эти данные, далее называемые объектами, как правило представляют собой веб страницы, файлы изображения и любые другие данные, которые могут быть переданы по HTTP.
  3. Вы создаете CloudFront Web Distribution, где указываете — с каких серверов CloudFront должен осбирать данные, когда пользователи запрашивают их в вашем веб-приложении. Там же вы указываете другие параметры вашего CDN, такие как — логгирование запросов к объектам в CDN.
  4. CloudFront отправляет данные с вашими настройками (но не сами данные объектов) по всей сети AWS CDN.
  5. В настройках вашего веб-приложения — вы используете доменное имя, которое генерируется и предоставляется CloudFront в ваших URL-ах. Например — CloudFront возвращает доменное имя вида d111111abcdef8.cloudfront.net. Тогда URL в файлу с логотипом будет выглядеть как http://d111111abcdef8.cloudfront.net/logo.jpg. Вы так же можете настроить CloudFront на использование вашего собственного домена.
  6. Вы так же можете дополнительно настроить то, как именно CDN будет возвращать ваши данные. Например — можно добавить заголовки, которые будут указывать — сколько времени CloudFront должен держать данные в кеше. По умолчанию — данные хранятся 24 часа. Подробнее — тут>>>.

Как CloudFront доставляет контент пользователям

Вот что происходит после того, как вы настроите CloudFront:

  1. Пользователь обращается к веб-приложению и запрашивает один или больше объектов, таких как изображения или HTML-файлы.
  2. DNS отправляет запрос к ближайшей локации CloudFront.
  3. В локации — CloudFront проверяет свой кеш на наличие запрашиваемого объекта. Если объект уже есть в кеше — CloudFront сразу вернёт его пользователю. Если нет — CloudFront выполняет следующие шаги:
    1. CloudFront проверяет запрос с вашими настройками и перенаправляет запрос к подходящему источнику оригинальных данных, например — к корзине S3 для загрузки изображения или EC2 машине с HTTP сервером — для загрузки HTML файла.
    2. Ваш источник возвращает данные на пограничные сервера CloudFront.
    3. Как только CloudFront получает первые байты информации от вашего источника — он начинает их передачу пользователю и сохраняет объект в своём кеше для последующих запросов.
  4. После того, как объект просуществовал в кеше CloudFront более определенного времени (24 часа или время, указанное в заголовках ваших объектов) — происходит слеюущее:
    1. CloudFront перенаправляет следующий запрос к вашему серверу, что бы проверить — содержится ли в кеше CloudFront последняя актуальная версия файла.
    2. Если версия объекта не изменилась — CloudFront возвращает объект пользователю. Если же объект был изменён — CloudFront обновляет данные в кеше, и после этого продолжает отдавать их пользователю.

Настройка Amazon CloudFront

  1. Создание корзины S3 и доабвление контента
  2. Создание и настройка CloudFront Web Distribution
  3. Подключение своего домена

Создание корзины 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:

aws_cloudfront_setup_1

Создаём Web Distribution:

aws_cloudfront_setup_2

В поле Origin Domain Name выбираем созданную ранее корзину:

AWS: CloudFront - описание, примеры

AWS: CloudFront - описание, примеры

Для 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 серверу . Параметры могут быть:
    • AllCloudFront будет передавать все заголовки вашему серверу, и не будет выполнять кеширование данных
    • Whitelist: на ваш сервер будут переданы только заданные заголовки
    • None: CloudFront будет передавать все заголовки на ваш сервер, но не будет выполнять кеширвоание, основанное на заголовках. Подробнее о кешировании по заголовкам — см. тут>>>.
  • Object Caching: время, в течении которого CloudFront будет хранить данные в кеше. Подробнее — тут>>>.
  • Forward Cookies: определяет передавать ли cookie  на ваш сервер, и если да — то какие. Подробнее — тут>>>.
  • Forward Query Strings: передавать ли на ваш сервер всю строку с запросом (*/target=image.png&size=100)
  • Smooth Streaming: использовать ли Microsoft Smooth Streaming
  • Restrict 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: логгировать ли все запросы к объектам в этой CDN
  • Distribution State: включение или выключение этой CDN

Эти и другие опции описаны тут>>>. Большую часть на данный момент можно не менять.

Жмём Create Distribution:

aws_cloudfront_setup_5

На создание сети может уйти до 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:

aws_cloudfront_setup_6

aws_cloudfront_setup_7

Проверяем:

$ 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 указываем созданный домен:

aws_cloudfront_setup_8

aws_cloudfront_setup_9

Опять-таки — необходимо подождать, пока CloudFront применит новые параметры в своей сети:

aws_cloudfront_setup_10

Проверяем:

$ 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 CLI Cloudfront

What Is Amazon CloudFront?

AWS: S3, Simple Storage Service – описание, примеры