🌏

MastodonのオブジェクトストレージをAmazon S3からCloudflare R2に移した話

2023/07/11に公開

はじめに

Mastodonで使っているオブジェクトストレージを、Amazon S3からCloudflareが提供しているS3互換ストレージであるR2に移行した時の覚え書きです。

やり方

実はCloudflareによるドキュメントがあります。

Mastodon · Cloudflare R2 docs

大雑把にまとめると、下記のステップになります。

前提条件

  • 使用するドメインの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に移行するとランニングコストが下がるのは確実ですが、オブジェクトストレージの移行は少なからずコストが発生するので、いざ移行しようとする時はお財布と相談しましょう。

脚注
  1. R2でパブリックアクセスを有効にするにはドメインを割り当てる必要があります。この設定はDNSのレコードをCloudflareで管理していないとできません。 ↩︎

  2. 東京リーションの価格 ↩︎

  3. 10GB/monthの無料枠あり ↩︎

  4. 1 million/monthの無料枠あり ↩︎

  5. 10 million/monthの無料枠あり ↩︎

  6. 100GB/monthの無料枠あり ↩︎

Discussion