cloudflare

Mastodon の S3 に Cloudflare を設定してみた

さて、この前うちの Mastodon インスタンス「リアルエスケープ」のメディアデータを無事に AWS S3 へと移行することができました。
サーバ本体と違って、そんなに面倒ではなく、単にデータ容量が大きいだけ。
データもそんなになかったのは弱小インスタンスだからね!
ホントもっと早くにやっておけばよかった。

メディアデータ容量の確保に関しては S3 で確保できたけど、次は金額的なことを考えていかなければならない。
従量課金制は確かに合理的なんだけど、いかんせん個人ではなかなかに毎月ボディーブローのように響く。
時にはアッパーを食らうくらいとも聞く(怖)

なので、少しでも安くしたいと思い、S3 へのアクセスを低減させる CDN の設定をしようと。
CDN はコンテンツデリバリネットワークで、CDN がサイトデータをキャッシュすることで配信を早くする。
本来の目的は世界中に広がる CDN ネットワークにキャッシュが置かれることで、どこでも早くサイトを見られるってことなんだけど、今回の目的はキャッシュしてくれるということは「 S3 本体への問い合わせも減るから、料金安くなるよね!」ってこと。

今回は無料で使うことのできる Cloudflare を使用。
AWS にも Cloudfront というのがあるんだけど、これまた従量課金制。
いや確かに安心の Amazon さんだけども・・・

前置きがめっちゃ長くなったけど、設定をしていく。
まずは Cloudflare に登録。
この辺りは難しくない。
画面に表示されるままに CDN に設定したいドメインを入力していくと勝手に Cloudflare が基本的なことを読み込む。
1つ注意するところは、途中で DNS を変更してという画面が出てくるので、この時にそのまま進めず、いったんドメインを購入したレジストラのサイトで DNS を言われたものに変更してから、進めていく。
注意するのはそこくらい。
あとは読み込まれた情報が足りないところをもとの DNS 設定から加えてやる。
Mastodon は https で動いているので、ノーマルの状態では、横の雲のマークの上を矢印が進む状態でキャッシュせずにそのまま DNS としてだけ Cloudflare が使用されて流すという設定のみ。
Mastodon 自体は動的だから基本的には S3 へのルート以外はこれでいい。

で、ここから S3 との連携をする。
公式のサイトに書いてある S3 との連携方法をもとに設定していく。

そうここでね、S3 のバケット名が悪くてできなかったの。
前の内容でも書いたけど、それに合わせるためにバケットを作り直しましたよ。
バケットに対して CNAME を設定するんだけど、CNAME に media という名前を付けたければ、バケット名を media.mydomain.com にしなさいということだった。
すごい大変だったわ。
うちでは頭に media をつけるようにバケットを作り直して、media.real-escape.jp になるように設定した。

その次に書いてあることは、CORS を編集して Cloudflare の API で情報を S3 に取りに行くことができるように設定してくださいと。
これが最初よくわかんなくて、上の設定して状態も Active になったのに、情報取得エラーばっかりでてなんでかわからなかった。
いろいろ調べていると S3 へ入って、作ったバケットに行き、アクセス権限をクリックするとなかに CORS が編集できる画面がある。
これか~~!!
でもここで、「また何書いたらいいの?って、もっと説明書いてないとわかんないよ!」って(笑)
うっすらと書いてある例文と、Cloudflare の例文から以下のようなものを書くとちゃんと API で情報が取得できるようになった。

これを保存すると AWS 側でちゃんと動くように少し頭のほうが修正されて保存される。

で、これでできたと思っていたら、全然キャッシュされない。
なんでかなと思っていたら、AWS へのリンクアドレスが、エンドポイント名とドメイン名のままだったから。
これをどこで修正するのか分からなくて、これも Google 先生に聞いてみると、Mastodon の中の .env.production にあった。

最初このコメントにあるように Cloudfront or Cloudflare でエイリアスを使用するとき書いてあったから、CLOUDFLONT となってたところを CLOUDFLARE にしたら動かなくて、CLOUDFRONT にしたらちゃんと動いた。
なぜ Cloudflare 使ってるのに Cloudfront にしないといけないのかわからないし、それであってるのかもわからないけど、動いたからいい!!
ちなみに最新の.env.productionには S3_ALIAS_HOSTNAME= と書かれててこれでもいけるよう。
新しいので、これのほうが良いかも。

しばらくすると、ちゃんと Cloudflare 内の Analytics が動き出す。
前回の記事に加筆してまとめてるので、そちらも見てもらえば S3 への設定はわかるかと思います。

ひとまずはこれで、少しでも S3 本体へのアクセスを軽減させて、課金が減ればいいなと。
ということで、おつかれさまでした。