Help us understand the problem. What is going on with this article?

Heroku + Rails + S3でサイトマップを設置

Herokuを使うと、サイトマップの設置がめんどいです。
レンタルサーバー時代はweb上の適当なツールで自動生成して、FTPでアップロードするだけの超単純な作業だったのですが、今回は色々と大変でした。

とは言えやり方がわかってしまえばそこまで大変な作業ではないので、今後のために手順をまとめておきます。

全体の流れ

  • AWSのアカウントを作る
  • S3のバケットを作る
  • アクセスキー、シークレットアクセスキーを取得する
  • 環境変数を登録する
  • gemをインストールする
  • サイトマップ用の設定ファイルを作る
  • ルーティングを追加する
  • サイトマップをS3にアップロードする
  • robots.txtを編集する
  • Google Search Consoleにサイトマップの場所を登録する

環境変数登録の部分から説明していきます。
アクセスキーの取得までは、「S3 バケット作成」等でググって頑張ってください。

環境変数を登録する

ローカル、Herokuそれぞれに、以下の3つの環境変数を登録します。
AWS_ACCESS_KEY_ID:AWSのアクセスキー
AWS_SECRET_ACCESS_KEY:AWSのシークレットキー
S3_BUCKET_NAME:作成したバケットの名前

私の場合、ローカルはdotenv-railsを使い、Herokuは管理画面上から登録しました。

gemをインストールする

Gemfile
gem 'sitemap_generator' #サイトマップ作成用
gem 'aws-sdk' #AWS接続用
$ bundle install

サイトマップ用の設定ファイルを作る

$ rails sitemap:install

以下のように書き換える

config/sitemap.rb
SitemapGenerator::Sitemap.default_host = 'https://example.com'
SitemapGenerator::Sitemap.sitemaps_host = "https://s3-ap-northeast-1.amazonaws.com/#{ENV['S3_BUCKET_NAME']}"
SitemapGenerator::Sitemap.adapter = SitemapGenerator::AwsSdkAdapter.new(
  ENV['S3_BUCKET_NAME'],
  aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  aws_region: 'ap-northeast-1',
)

SitemapGenerator::Sitemap.create do
  #ここからサイトマップに登録したいページのパスを書いていく
  add root_path
  add mcs_genre_path
  mcs = Mc.all
  mcs.each do |mc|
    add mcs_detail_path(mc_id: mc.id)
  end
  add rankings_p_line_path
  add comments_path
.
.
end

ルーティングを追加する

config/routes.rb
get '/sitemap', to: redirect("https://s3-ap-northeast-1.amazonaws.com/#{ENV['S3_BUCKET_NAME']}/sitemaps/sitemap.xml.gz")

サイトマップをS3にアップロードする

ここまでの変更をHerokuにデプロイした後、以下のコマンドを打ち込むと、サイトマップが作成されS3に保存されます。

$ heroku run rails sitemap:refresh

※S3のパブリックアクセスの設定が上手くできていないとエラーが発生するので注意。
AWS S3で「Access Denied」を解決する

robots.txtを編集する

以下の1行を追加

public/robots.txt
Sitemap: https://example.com/sitemap

Google Search Consoleにサイトマップの場所を登録する

Search Consoleにログイン後、画面左のサイドバーから「サイトマップ」を選択し、それっぽいところにURLを入力して送信します。

参考

d0ne1s
Qiitaの記事検索サービス【Qiigle】を運営。 フリーランスエンジニア。Ruby on Rails、Tailwind CSS、Heroku、Cloudflareが好き。少ない人数で高速で開発することに強い関心があります。ちょっとした情報はTwitterで🦈
https://twitter.com/d0ne1s
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away