# Упрощение публикации сайта в Amazon S3

Ранее я уже затрагивал тему размещения сайта в сервисе Amazon S3 в статьях: [Оптимизация сайта для Amazon S3](http://www.juev.org/2013/04/18/amazon-s3/ "Оптимизация сайта для Amazon S3") и [Amazon S3 and Cache Control](http://www.juev.org/2013/03/08/s3-and-cache-control/ "Amazon S3 and Cache Control"). Для передачи файлов на сервера амазона использовалась отдельная программа [s3cmd](http://s3tools.org/s3cmd "s3cmd"). Скорость загрузки оставляла желать лучшего, и управление заголовками кеширования было затруднительно, не говоря уже про необходимость сжимать готовые файлы gzip. Но теперь ситуация значительно упростилась с появлением утилиты [s3\_website](https://github.com/laurilehmijoki/s3_website "s3_website").

Для её использования на компьютере должны быть установлены **Ruby** и **Java**. Устанавливаем утилиту:

```shell
$ sudo gem install s3_website
```

Или прописываем `s3_website` в Gemfile и проводим установку с помощью [bundle](http://bundler.io "Bundler").

Для создания файла конфигурации используется команда:

```shell
$ s3_website cfg create
```

Примеры заполнения созданного файла конфигурации приведены на [официальной странице](https://github.com/laurilehmijoki/s3_website "s3_website") и на странице [примеров конфигураций](https://github.com/laurilehmijoki/s3_website/blob/master/additional-docs/example-configurations.md "Example-configurations").

Применяем конфигурацию и проводим загрузку файлов на сервер командами:

```shell
$ s3_website cfg apply
$ s3_website push
```

Во время запуска первой команды, если корзина для размещения файлов не была ранее создана, она создается автоматически с использованием того имени, что было указано в файле конфигурации.

Из плюсов данной утилиты хочется отметить упростившуюся процедуру настройки кеширования различных типов файлов. К примеру, задать для всех файлов время жизни в 300 секунд, а для файлов, находящихся в директории `assets` в 6000 секунд:

```yaml
max_age:
  "assets/*": 6000
  "*": 300
```

Можно также задать автоматическое сжатие gzip всех файлов, или только для файлов определенного типа:

```yaml
gzip:
  - .html
  - .css
  - .md
```

И сама загрузка на сервера амазона производиться в несколько потоков (по умолчанию в три потока), что приводит к значительному ускорению передачи файлов. К примеру, для моего сайта:

```shell
$ time s3_website push --force
[info] Deploying /Users/juev/Projects/Github/juev.org/public/* to test.juev.org
[succ] Updated index.html (no-cache; max-age=0 | text/html; charset=utf-8 | gzip)
...
[succ] Invalidated 414 items on CloudFront
[info] Summary: Updated 413 files. Transferred 1.6 MB, 826.0 kB/s.
[info] Successfully pushed the website to http://test.juev.org.s3-website-eu-west-1.amazonaws.com

real    0m41.954s
user    0m40.617s
sys 0m3.059s
```

Как видно, 413 файлов были переданы за 41 секунду. При использовании `s3cmd` это время растягивается на несколько минут.

Провел тесты полученных сайтов с использованием сервиса webpagetest.org, получил следующие результаты:

1. [При использовании S3](http://www.webpagetest.org/result/150412_CH_FT7/)
2. [При использовании CloudFront](http://www.webpagetest.org/result/150412_2T_GPN/)

В обоих случаях скорость полной загрузки страницы порядка 1 секунды для первого посещения, и при этом нет критических замечаний по оптимизации. В случае CloudFront время повторной загрузки страницы уменьшается почти в два раза.

Значение Google PageSpeed для обоих вариантов, что для S3, что для CloudFront, составило 95 балов из 100.

Из тестов видно, что размещение сайта в CloudFront эффективнее в плане скорости, но при каждом обновлении сайта придется проводиться инвалидацию кеша, чтобы контент обновился. На это уходит время. К примеру, для моего сайта из 413 файлов, инвалидация проходила более 10 минут (значение не точное, указано минимальное значение). И это нужно учитывать. После генерации и загрузки, результат будет виден только по прошествии времени, необходимое для обновления кеша.

Исходя из [стоимости](http://aws.amazon.com/s3/pricing/ "Amazon S3 Pricing") размещения файлов в Amazon S3 и стоимости их передачи, для сайта, подобного моему, общая стоимость размещения в месяц будет выражаться максимум в 20-30 центов. А при использовании утилиты s3\_website, работа с ним будет максимально простой.

