CloudFlareとAmazonS3を連携させてリクエストを抑える


Railsをつかって 旅ペディアというサイトを作りました。
画像が結構多く、これをさばくためにAmazonS3を使っています。

金額が不安

が、個人で使うには従量課金制という料金制度は、どのくらいアクセスがくるかわからない状況だと結局いくら掛かるのかわからないというところが個人的に不安なところではありました。

なので、すこしでもS3にくるリクエストを抑え、かつ速く画像を提供できる手段はないかな...と考えました。

最初はAmazonのCloudfrontを考えましたが、こちらも従量課金制なので、結果的にかかる金額を考えるとあまり良くはない感じがしたので、

定額でかつ無料でも試せるCloudFlareを試してみることにしました。

CloudFlareって?

ここをみればいいと思います。(日本語が結構あれですが)

CloudFlareの設定

会員登録をすると、そのまま設定が始まります。
大体そのままの設定で大丈夫だと思います。
日本語に対応してるのですが、結構怪しい日本語なので、英語で見たほうがわかりやすいかも。

ここでcloudflareがキャッシュを行うドメインを設定します。

すると、cloudflare側が勝手にサブドメイン(CNAME)を設定してくれます。
(mail.hoge.comとか、direct.hoge.comとか。)

ここでいらないものは消しておいても良いと思います。

そのあとで、ドメインを取得したサービス(お名前.comとか)で、DNSの設定をcloudflare側が用意したDNSに変更します。
***.cloudflare.comみたいなやつです。

反映までに時間がかかる場合もあるので、急いでいるときはお早めに。

S3と連携させる

もとのドメインもcloudflareを使っていろいろとキャッシュしてくれたりしますが、今回やりたいことはS3との連携です。

大体ここに書いてますが、

今回は画像を配信したいので、 image.hoge.comみたいなCNAMEを設定して、cloudflareとS3を連携させてを使っていきたいと思います。
(独自ドメインをつかって画像配信とか、なんかかっこいい!と思ってました。)

まず、S3側の設定

S3側で、cloudflareと連携させるbucketを作成します。
ここで大事なのが、image.hoge.com、というCNAMEを設定する場合、S3のbucket名をimage.hoge.com、に設定しなければいけません。

そしたら、amazonS3側で、image.hoge.com.s3.amazonaws.comといった感じのドメイン(?)が生成されます。
S3のbucketにそのままアクセスすると違うurlなのですが、このようなurlも使えるようですね。

先ほどのs3 bucketのurlのrootにアクセスすると、

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>8C0D77E4DD8EECA8</RequestId>
<HostId>
pcfDdejysceCeMbamRIIOGXG+HVDRW+89T/OAO6tuVnzl0SSwypgq3VakRXyeBJJ
</HostId>
</Error>

このように表示されると思います。これでOK。

cloudflare側の設定

先ほど設定した image.hoge.com.s3.amazonaws.comをcloudflare上でCNAMEに設定します。

image is an alias of image.hoge.s3.amazonaws.com

こんな感じに。

そしたら、cloudflare側の設定も完了です!簡単!

そしたら、image.hoge.comにアクセスしてみましょう。

先ほどのS3のbucketのurlと同じ結果になっていればok!

設定の反映に結構時間がかかるので、うまくアクセスできないときは気長にまってみましょう。(ボクは待てなくて結構焦ってました。)

Rails側でPaperclipと一緒に使う

やっぱりpaperclip便利ですね。s3との連携もできるし。

独自ドメインを使う場合はちょっと設定が違うので参考までに。

has_attached_file :image,
  :storage         => :s3,
  :s3_credentials => "#{Rails.root}/config/s3.yml",
  s3_host_alias: 'image.hoge.com',
  :path => "/:class/:attachment/:id_partition/:style/:filename",
  :url => ':s3_alias_url'

大体こんな感じ。増えるのは :url => ':s3_alias_url'とかs3_host_alias: 'image.hoge.com',でしょうか。

設定さえすればあとは今までと同じように使えます。

まとめ

長くなりましたが、Cloudflare、便利だと思います!無料だし、一度試してみるのもいいのではないでしょうか。

cloudflare内には、専用のアナリティクスぽいものがあるのですが、いまのところ、大体半分ぐらいのリクエストがcloudflareのお陰でsaveできているようです!
あとはS3の請求書を待つだけ!!!!(ちょっとこわい)

あと、無料でも使えますが、月額20ドルで、サポートが手厚くなったり、(メールの返信速度が全然違う)、SSLに対応したり、htmlとかのminifyもやってくれるらしいので、よかったらupgradeしてみてもよいかも!!

今回初めてだったので、結構間違った知識があるかもしれません、気軽に編集リクエストおねがいします!