📑

Active Storage のアップロード先として Cloudflare R2 を使う方法

2022/05/12に公開

Amazon S3 互換のAPIを備えるオブジェクトストレージである Cloudflare R2 がオープンβなったことで注目を集めていますね。

https://blog.cloudflare.com/r2-open-beta/

https://blog.cloudflare.com/ja-jp/introducing-r2-object-storage-ja-jp/

https://zenn.dev/voluntas/scraps/cdf40295c848c6

Amazon S3 互換ということは、Active StorageのS3サービスでファイルのアップロード先として R2 を使用できるはずです。試してみました。

利用方法

1. R2 の準備

アクセスキーの取得

Manage R2 API Tokens をクリック

Create API token をクリック

バケットへのアップロードを行いたいので Edit: Allow List, Write, and Delete operations of all buckets を選択して Create API Token

Secret Access KeyAccess Key ID を控える

アカウントIDの取得

R2のダッシュボード右の Account ID を控える

バケットの作成

Create a bucket をクリックし、バケット名を指定、作成する

2. config/storage.yml の変更

準備しておいたアクセスキーなどを設定します。

region: autoforce_path_style: true が必要なことに注意して下さい。(設定値は Aws::S3::Client.new にそのまま渡されるので、AWS SDKのドキュメントを確認してください。

# config/storage.yml

cloudflare:
  service: S3
  access_key_id: <Access Key ID>
  secret_access_key: <Secret Access Key>
  endpoint: https://<Account ID>.r2.cloudflarestorage.com
  bucket: <バケット名>
  region: auto
  force_path_style: true

なお、実際にはキーはべた書きせず Credentials を使うのが一般的かと思います。

https://github.com/takeyuweb/rails-activestorage-r2/blob/8d080ad7500ec1be52361449227b82de8fc3d23c/config/storage.yml#L9-L16

3. config/environments/development.rb の変更

config/storage.yml に記載したサービスを使うように変更します。

config.active_storage.service = :cloudflare
# 2022年9月の一般公開にあわせて署名付きURLに対応したため、この設定は不要になりました
# config.active_storage.resolve_model_to_route = :rails_storage_proxy

https://github.com/takeyuweb/rails-activestorage-r2/blob/46b4fe8db97bfe325d32bccd9dbe9e53a0c83c1c/config/environments/development.rb#L36-L40

config.active_storage.resolve_model_to_route = :rails_storage_proxy

アップロードしたファイル(や加工したファイル)をダウンロードさせる際、デフォルトでは S3 の署名付きURLを発行してリダイレクトするようになっています。(リダイレクトモード

<s>しかしながら、現在のところ R2 は署名付きURLによるインターネットからの直接読み込みはサポートされていない ため、アプリケーションサーバーでプロキシしてやる必要があります。(または取得用のCloudflare Workerを自分で用意するか)</s>

<s>:rails_storage_proxy によって、アプリケーションサーバーがファイルデータを R2 からダウンロードして配信するようになります。(プロキシモード)</s>

追記:2022年9月に署名付きURLに対応したため、この対応は不要になりました。

サンプルコード

https://github.com/takeyuweb/rails-activestorage-r2

オープンβ時点では利用できない機能

署名付きURLによるダウンロード(リダイレクトモード)

現在のところR2は署名付きURLによる読み取りをサポートしていませんが、将来的にはサポートする予定のようです。

We’ll then focus on expanding R2 capabilities beyond the basic S3 API. In the near term, we’re focused on delivering:

  • Pre-signed URL support, which delegates read and write access for a specific key to a token.

https://blog.cloudflare.com/r2-open-beta/

サポートされればプロキシモードを使わずに、リダイレクトモードで済みますね。

追記:対応しました!

2022年9月に署名付きURLに対応したため、利用できるようになりました。
リダイレクトモードが利用でき、Railsサーバーを通さずに配信できますね。

ダイレクトアップロード

Active Storage では簡単にストレージサービスへのダイレクトアップロードに対応することができます。

<%= form.file_field :attachment, direct_upload: true %>

しかしながら、現在のところR2は署名付きURLによる書き込みをサポートしていません。将来的にはサポートする予定のようです。

We’ll then focus on expanding R2 capabilities beyond the basic S3 API. In the near term, we’re focused on delivering:

  • Pre-signed URL support, which delegates read and write access for a specific key to a token.

https://blog.cloudflare.com/r2-open-beta/

追記:対応しました!

2022年9月に署名付きURLに対応したため、利用できるようになりました。

まとめ

今回はActive StorageのファイルストレージサービスとしてCloudflare R2を使ってみました。

  • Active Storage の動作に必要な最低限の S3 API に対応しているので利用できた
  • ただ使うだけならS3と比べてR2側の設定はとても簡単だった
    • Cloudflare Workers を使えばもっといろいろなことができそう
      • WebP変換をして返すようにするとか
  • Active Storage のリダイレクトモードは今のところ利用できず、プロキシモードが必要
    • またはインターネット公開用の Cloudflare Workers を作るか
  • ダイレクトアップロードは今のところ利用できない
タケユー・ウェブ株式会社

Discussion