やりたいこと
Railsで以下のような条件のデータをCloudFrontにキャッシュさせる
- レスポンスをはやくしたい
- 更新頻度が低い
- 最新の情報を配信する必要が無い
デフォルトの動作
RailsのデフォルトのレスポンスにはCache-Control: max-age=3600, private
というヘッダが付与されているため、CloudFrontのキャッシュ対象(X-Cache: Miss from cloudfront
)にならない。
$ curl -i https://xxxxx.cloudfront.net/users.json
HTTP/2 200
...
Cache-Control: max-age=3600, private
...
X-Cache: Miss from cloudfront
...
キャッシュ対象にする
controllerでキャッシュのポリシー(expires_in
)を設定する
app/controllers/users_controller.rb
class UsersController < ApplicationController
def index
@users = User.all
# キャッシュの期間と共有を有効化
expires_in 1.hour, public: true
end
end
キャッシュが有効化されたことを確認
Railsのレスポンスヘッダにcache-control: max-age=3600, public
が付与され、CloudFrontのキャッシュ対象(x-cache: Hit from cloudfront
)になった
curl -i https://xxxxx.cloudfront.net/users.json
HTTP/2 200
...
cache-control: max-age=3600, public
...
x-cache: Hit from cloudfront
...
参考
Railsのキャッシュについて以下の投稿を参考にさせていただきました。
Rails でブラウザのキャッシュを利用する - Qiita