背景
herokuで動かしている web ページのサイトマップをGoogle Search Console で登録したい。
※ Herokuのダイナモはエフェメラル(一時的)ファイルシステムを採用しているため、デプロイごとにリセットされます。そのため、サイトマップのような定期的に更新されるファイルは、Heroku上で直接生成しても、次のデプロイ時に消えてしまいます。そのため、永続的なストレージへの保存(例えばAmazon S3など)が必要になります。
Storing static files elsewhere is crucial for Heroku apps since dynos have an ephemeral filesystem. Whenever you replace a dyno or when it restarts, which happens daily, all files that aren’t part of your application’s slug are lost. Use a storage solution like S3 to offload the storage of static files from your app.
下記のような色んな参考記事が出てきますが、
Googl Search Consoleのサイトマップ登録では、/sitemap で S3 の sitemap.xml.gz ヘリダイレクトがうまくいかずに失敗しているようでした。
原因
Amazon S3 のパス形式の URL を使っていることが原因でした。
現在、Amazon S3 はすべての AWS リージョンで仮想ホスト スタイルとパス スタイルの両方の URL アクセスをサポートしています。ただし、パス スタイルの URL は将来廃止される予定です。詳細については、次の重要な注意事項を参照してください。
Virtual Hosted-Style URLを使用することで、解決しました。
- get '/sitemap', to: redirect("https://s3-ap-northeast-1.amazonaws.com/#{バケット名}/sitemaps/sitemap.xml.gz")
+ get '/sitemap', to: redirect("https://#{バケット名}.s3.ap-northeast-1.amazonaws.com/sitemaps/sitemap.xml.gz")
もとの状態でも正常にサイトマップのダウンロードがうまくいくので、気付くまでとても時間がかかりました。