gem sitemap_generator でバッチ処理で生成したファイルをS3にアップロードする

sitemap_generatorを使ってサイトマップを生成していたのですがデプロイ時に生成していたため、管理画面から新しく作られたページがサイトマップに載っていなかったり削除されたページが載ったままだったりしたので、バッチ処理で定期的に生成するようにしました。

動的に生成するgemもあるようですが、動的だとページ数が多すぎて負荷がかなりかかるのでsitemap_generatorを使ってバッチ処理をするようにしてます。

fogを使った設定

Gemfileに gem 'fog' を記入しておく必要があります。 fogを使用する場合は fogが対応しているprovider 全て使えるはずです。

SitemapGenerator::Sitemap.adapter =
  SitemapGenerator::FogAdapter.new(
    fog_directory: ENV['S3_BUCKET_NAME'],
    fog_credentials: {
      provider:              'AWS',
      aws_access_key_id:     ENV['AWS_ACCESS_KEY'],
      aws_secret_access_key: ENV['AWS_SECRET_KEY'],
      region:                ENV['AWS_REGION']
    }
  )

aws-sdkを使った設定

Gemfileに gem 'aws-sdk' を記入しておく必要があります。

SitemapGenerator::Sitemap.adapter = SitemapGenerator::AwsSdkAdapter.new(
  's3_bucket_name',
  aws_access_key_id:     ENV['AWS_ACCESS_KEY'],
  aws_secret_access_key: ENV['AWS_SECRET_KEY'],
  aws_region:            ENV['AWS_REGION']
)

wheneverでバッチ処理する

wheneverを使って定期的にサイトマップ作成を実行させます

# Gemfile
gem 'whenever', :require => false

これをGemfileに書いて下記コマンドを実行します

bundle install --path vendor/bundle
bundle exec wheneverize . 

最後に定期的に実行する設定を書いて完了です

# config/schedule.rb
every :day, at: '2:00am', roles: :batch do
  rake '-s sitemap:refresh'
end