ユーザーが自分のアイコンをアップできるよくあるサービスの場合、

Amazon CloudFrontの使用上の注意とTipsまとめ|Media Technology Labs (MTL) : メディアテクノロジーラボ

よって、更新にしろ、削除にしろ、24時間くらいずれても、いいコンテンツでないとCloudFront には向かないことになります。

写真共有サイトでつかう場合だと、写真の加工とかがあった場合は、必ずファイル名を変更するような対応が必要です。

アップしたアイコンがなかなか反映されずに困る。そりゃそうだ。「誰かがなんとかしてくれてるはず」みたいないい加減な思いでCloudFrontつかっちゃってた。反省。

papaerclipを使ってる場合の良い方法は無いかな?

追記:

Using Amazon’s CloudFront with Rails & Paperclip – Tristan Media Blog

このブログに書いてあるようにpaperclipのinterpolatesを使ってtimestampをファイル名に埋め込むのがいいのかも。でもこれだとファイルがどんどん増えちゃうからexpiresを長くするとお金がかかってしまう。

CloudFrontのファイルを即時削除する方法が見つからなかった。それがあったとしてアップする前に削除するっていう処理を書くのも大変だなあ。みんなどうやってるんでしょう?

追記2:

paperclipだけS3のみにすることで対応した。(assetsはcloudfront)

paperclipで画像をアップロードしてた場合、S3に移行するのは簡単。paperclipはDB内にファイルのパスを持ってるわけじゃないので、サーバーファイルシステム上の画像を全部S3にコピーした上でアプリの設定を変えれば良い。

# Gemfile:
gem 'paperclip'
gem 'aws-s3'
gem 'aws-sdk'
# config/initializers/paperlicp.rb:
if Rails.env.production?       
  Paperclip::Attachment.default_options.update(
    storage: :s3,              
    s3_credentials: "#{Rails.root}/config/s3.yml",
    s3_host_alias: Settings.cdn_host,
    path: ":class/:id/:attachment/:style",
    url: ':s3_alias_url'
  )   
end
# config/s3.yml:
production:
  bucket: kowabana-jp
  access_key_id: xxx
  secret_access_key: xxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

development:
  bucket: bucket_name
  access_key_id: xxx
  secret_access_key: xxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

test:
  bucket: bucket_name
  access_key_id: xxx
  secret_access_key: xxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

modelのhas_attached_fileに渡すオプションが環境毎に違ってたりする場合はinitializers以下に書いた方がスッキリする。productionでだけS3(ここではCloudFrontを使うのもの一緒にやってます)にする場合は上記。(staging環境で何か動かす時にもS3に影響が出ちゃうので注意する)