MastodonのオブジェクトストレージをAmazon S3からCloudflare R2に移した話
はじめに
Mastodonで使っているオブジェクトストレージを、Amazon S3からCloudflareが提供しているS3互換ストレージであるR2に移行した時の覚え書きです。
やり方
実はCloudflareによるドキュメントがあります。
大雑把にまとめると、下記のステップになります。
前提条件
- 使用するドメインのDNSがCloudflareで管理されていること[1]
大雑把な手順
- R2のBucketやAPIキーを作成する
- bukectにドメインを割り当て、パブリックアクセスを有効にする
- Mastodonの
env.production
を書き換え、R2を向くようにする - Mastodonの各サービスを再起動し、変更を反映させる
- 既存のメディアをS3からR2に移行する
S3からR2へのメディア移行
今回はCloudflareが提供しているデータ移行ツールを使用しました。
Data Migration · Cloudflare R2 docs
必要になる情報は
- 移行元となるS3のBucket名、GETが可能なAPIキー
- 移行先となるR2のBucket名、PUTが可能なAPIキー
50GBを超えるファイルは移行できませんが、Mastodonのメディアを移行する場合は特に問題は無いでしょう。
ハマりポイント
R2に限らす、Mastodonでオブジェクトストレージを使用する場合、CORSポリシーを適切に設定しないとオーディオプレイヤーが正常に動作しません。
これを解決するには、オブジェクトストレージ側でCORSヘッダーを付与するように設定するか、Mastodonサーバー側でメディアをプロキシする等の方法がありますが、今回は前者で解決します。
CloudflareのダッシュボードでMastodonで使用するBucketの設定画面を開いて、CORS Policyを下記のように編集します。
反映されるまで多少のタイムラグがあります。
[
{
"AllowedOrigins": [
"*"
],
"AllowedMethods": [
"GET"
],
"AllowedHeaders": [
"*"
]
}
]
運用コストはどれくらい変わるのか?
価格比較表
Amazon S3[2] | Cloudflare R2 | |
---|---|---|
ストレージ | $0.025/GB | $0.015/GB[3] |
Tier1 / Class Aリクエスト (PUT, LIST, COPY など) |
$0.0047/1k | $4.5/1 million[4] |
Tire2 / Class Bリクエスト (GET など) |
$0.00037/1k | $0.36/1 million[5] |
データ転送料(out) | $0.114/GB[6] | $0 |
料金は総じてR2が安いですが、リクエストの課金単位が100万リクエスト毎なので、1000リクエストのS3と比べると、超えた場合に一度に課金される額が大きくなります。
ただし、Class Aは100万、Class Bは1000万リクエストと大きな無料枠があるので、小規模サーバーであれば移行時を除いてほぼ超えることは無さそうです。
移行コストはどれくらいかかるのか?
正直、ここが一番悩ましいところです。
S3からデータを取り出すのも、データを転送するのも、R2に保存するのもお金がかかるので、多少の移行コストがかかってしまいます。
今回はどちらかと言うとR2を使ってみることが目的だったことと、もともとのS3のコストが大した額ではない($4/monthくらい)なので、移行してみることにしました。
移行対象のバケット
- サイズ:約85GB
- オブジェクト数:約75万
データ転送料
これまでの構成ではS3からCloudfront経由でメディアをサーブしていたため、S3の無料枠がまるまる残っている状態でした。
100GBの無料枠があるので、今回は追加料金はかかりませんでした。
S3からのデータ取り出し
オブジェクト数と同数のGETリクエストが発生します。
1000リクエスト毎に$0.00037のGETリクエストが75万回なので、$0.2775かかりました。
R2へのデータ保存
オブジェクト数と同数のPUTリクエストが発生します。
75万回のPUTリクエストが発生しますが、100万リクエストまで無料のため、移行時点では追加料金はかかりませんでした。
ただし、月末時点でClass Aリクエストが100万を超えた場合、追加料金が$4.5かかります。
月末に移行すると、PUTが一番必要な時に最大の無料枠が使えるので、移行する時期を調整すると費用が少なく済むかもしれません。
移行費用まとめ
費用 | |
---|---|
データ転送料 | $0 |
S3からのデータ取り出し | $0.2775 |
R2へのデータ保存 | $0 〜 $4.5 |
合計 | $0.2775 〜 $4.7775 |
もうちょっとかかりそうな気がしていたけど、案外かからなかったな、という感じです。
Mastodonのメディアのような比較的小さなファイルを大量に移行する場合、GETとPUTのリクエスト数が大きくなるので、予めtootctl media remove
,tootctl media remove-orphans
, tootctl preview_cards remove
などを実行してメディアの数を減らしておくと、移行費用を低くできるかもしれません。
実際にいくらかかったか?(2023/07/29追記)
AWS、Cloudflareの請求額が確定したので、移行費用にいくらかかったのか計算しました。
6月分利用量 | 6月分料金 | 7月分利用量 | 7月分料金 | |
---|---|---|---|---|
S3 Tier1 Requests | 246,058 | $1.16 | 181,241 | $0.85 |
S3 Tier2 Requests | 381,335 | $0.14 | 1,690,081 | $0.63 |
S3 Storage | 73.837 GB-Mo | $1.85 | 27.921 GB-Mo | $0.70 |
R2 Storage | 43.85295 GB-Mo | $0.51 | ||
合計 | $3.15 | $2.69 |
移行にかかった費用を含めても、前月のS3の請求額より安くなりました。
- S3を使う期間が減ったことで、S3のTier1 Requestとストレージ費用が抑えられた
- オブジェクトの移行によるS3のTier2 Requestが増加したが、他の費用が減った分で相殺できた
- R2へのリクエストは無料枠で収まり、ストレージ費用のみかかった
おわりに
S3からR2に移行するとランニングコストが下がるのは確実ですが、オブジェクトストレージの移行は少なからずコストが発生するので、いざ移行しようとする時はお財布と相談しましょう。
Discussion