Цены Amazon S3: методы экономии

Amazon S3 предоставляет почти безграничный объем хранилища, который обойдется достаточно дешево для небольшого веб-проекта. Но с увеличением объема данных, нужно платить не только за хранилище, но также за трафик, запросы GET, PUT, COPY, POST и LIST. Amazon S3 pricey

Стоимость

Расценки перечислены на странице AWS, посчитать можно в калькуляторе.

Бесплатный ограниченный доступ дает 5 ГБ хранилища, 20 000 запросов GET и 2000 запросов PUT на год. Затем придется выкладывать по $30 за терабайт хранилища и $90 за каждый терабайт трафика. Сайт со 100 тыс. просмотров в сутки, который содержит по 5 фото на каждой странице, как раз и будет генерировать такой трафик. А при росте популярности в 10 раз платить придется почти $1000 в месяц.

Cloudfront

Amazon S3 — не CDN. Намного дешевле раздавать статику для популярного веб-приложения при помощи собственных серверов или отдельного провайдера CDN.

У Amazon есть своя сеть доставки контента — CloudFront. Она быстрее и дешевле S3, к тому же интегрирована в другие службы AWS.

Передача данных из S3 в CloudFront бесплатна, загрузка данных на CDN из внешнего источника стоит всего $20 за 1 ТБ, а раздача первых 10 ТБ в месяц будет стоить $850. При этом цена уменьшается с увеличением трафика.

Проще всего подключить CloudFront через веб-консоль AWS, или при помощи CLI:

aws cloudfront create-distribution \
  --origin-domain-name my-bucket.s3.amazonaws.com \
  --default-root-object index.html

# Указывает домен или контейнер S3

Кэширование

Объем трафика наиболее существенно влияет на стоимость S3. Amazon S3 caching

Поэтому кэширование снизит трафик и месячный чек от Amazon — файлы загружаются на S3, а отдаются через собственные кэш-сервера.

Для этого подходит Varnish, который умеет работать с AWS:

backend s3 {
  .host = "s3.amazonaws.com";
  .port = "80";
}

sub vcl_recv {
  if (req.url ~ "\.(gif|jpg|jpeg|png)$") {
      unset req.http.cookie;
      unset req.http.cache-control;
      unset req.http.pragma;
      unset req.http.expires;
      unset req.http.etag;

      set req.backend = s3;
      set req.http.host = "test-bucket.s3.amazonaws.com";

      lookup;
  }
}

sub vcl_fetch {
    set obj.ttl = 3w;
}

# Будет кэшировать картинки из test-bucket

BitTorrent

Если же вы планируете отдавать большие файлы через S3, то есть смысл воспользоваться встроенной поддержкой BitTorrent. Так что используя сеть peer-to-peer каждый клиент будет скачивать и раздавать файлы, тем самым уменьшая трафик S3.

Создать торрент-файл очень просто — нужно добавить ?torrent к ссылке на файл, размещенный на S3:

 # Было
http://s3.amazonaws.com/test_bucket/somefile


# Стало
http://s3.amazonaws.com/test_bucket/somefile?torrent

# Клиенты автоматически скачают торрент-файл

Glacier

Если S3 по большей части используется для хранения резервных копий, рассмотрите вариант использования Glacier — хранилища резервных копий. Сервис ни в коем случае не заменит S3, но позволит держать редко используемые файлы, которые не нужны в реальном времени.

Примечательно, что Glacier, в виду своей ограниченности, существенно дешевле S3 — хранение 1 ТБ данных обойдется в $7 в месяц, а скачивание 1 ТБ в $90.

Чтобы подключить сервис, нужно создать политику жизненного цикла, включив Glacier в transfer:

<LifecycleConfiguration>
    <Rule>
        <ID>sample-rule</ID>
        <Prefix></Prefix>
        <Status>Enabled</Status>
        <Transition>
      		<Days>30</Days>
      		<StorageClass>GLACIER</StorageClass>
    	</Transition>    
        <Expiration>
             <Days>365</Days>
        </Expiration>
    </Rule>
</LifecycleConfiguration>

# Автоматическая выгрузка файлов в Glacier по истечении 30 дней

Самое главное

Не используйте Amazon S3 качестве CDN, кэширование при помощи отдельных недорогих серверов и включение BitTorrent для отдачи файлов помогут существенно сэкономить без снижения производительности веб-приложения.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень