Date January 02, 2017
Tags aws / s3
Share このエントリーをはてなブックマークに追加

このブログは静的ファイルジェネレータのPelicanで作成したHTMLファイルをAWSのS3にホストしているのですが(過去記事)、今回URLを変更して、それに伴うリダイレクトをコマンドラインから設定しました。

detour sign
flickr photo shared by ShanMcG213 under a Creative Commons ( BY-SA ) license

記事の年月日をURLからなくすことにしました。特に必要な理由もないし、短い方がいいなと思ったので。

前: http://rn4ru.com/blog/posts/YYYY/bbb/DD/hogehoge/
後: http://rn4ru.com/blog/posts/hogehoge/

すると問題になるのがリダイレクトです。URLを変更すると以前のURLでリンクされている記事が軒並みNotFoundになってしまい、せっかく見に来てくれた人をがっかりさせてしまうことになります。

もしApacheのmod_rewriteを利用しているなら年月日を取り除くのは正規表現一発でできそうですが、AWSのS3ではどうでしょうか。

結論から言うと、S3をWebsiteとして利用している場合には各オブジェクトに対してリダイレクトを設定することができます。ただし、すべてのリダイレクトを手作業でやっていくにはちょっと骨が折れそうです。

そこでAWSのCLIを使ってS3のAPIを叩くことにします(リファレンス)。リダイレクトをオブジェクトに設定するコマンドは以下の通りです。ここではPelicanについてきたMakefileに追記しました。

REDIRECT=aws s3api put-object --acl public-read --bucket hoge --key $(1) --website-redirect-location $(2)

リダイレクト前のオブジェクトを$(1)、リダイレクト対象のオブジェクトを$(2)に指定してください。あとはリダイレクト前、後のパスを一行に書いたリストのファイルを用意しておいてwhileループを回します。

redirect:
 @while read line; do \
      $(call REDIRECT,$${line%% *},$${line##* }); \
 done < redirect_file

0バイトのオブジェクトがS3上にできてしまうので、ちょっと気持ち悪いこともなくはないですが、無事にリダイレクトを設定することができました。


Comments

comments powered by Disqus