アップロード用のS3互換オブジェクトストレージプロバイダーを設定する

Cloudflare の R2 がついに一般公開されました(1 年かかったようです)。(元の発表はこちらです: https://blog.cloudflare.com/introducing-r2-object-storage/)

バケットを作成しました。

トークンを作成しました。トークンを作成したところ、以下の権限が含まれていました。「編集: すべてのオブジェクトの編集アクセスと、すべてのバケットのリスト、書き込み、削除操作を許可」

試したことは以下の通りです。

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: redacted
  DISCOURSE_S3_SECRET_ACCESS_KEY: redacted
  DISCOURSE_S3_CDN_URL: https://pub-72eaa03782c542edbe00598fd1666be1.r2.dev
  DISCOURSE_S3_BUCKET: lc-testing
  DISCOURSE_S3_BACKUP_BUCKET: lc-testing/backups
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_ENDPOINT: https://cb46accbfcc3db1bdbba2bce07f8b509.r2.cloudflarestorage.com
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  FORCE_S3_UPLOADS: 1

しかし、アセットのアップロードは次のようなエラーで失敗します。

Aws::S3::Errors::NotImplemented: Header 'x-amz-acl' with value 'public-read' not implemented

そして、Public buckets · Cloudflare R2 docs で説明されているように、バケットを公開する必要があることを思い出しました。

しかし、それでも機能しませんでした。

S3 API compatibility · Cloudflare R2 docs を見ると、x-amz-acl が実装されていないことが示されています。

Discourse のコードをざっと見ましたが、コアに変更を加えないと R2 が機能する可能性があるかどうかは明らかではありませんでした。

アップロードを無効にした後、バックアップは機能したので、R2 は S3 バックアップを持つための非常に安価な方法のようです。しかし、そのバケットを公開していたため、バックアップも公開されていました(ファイル名を推測できれば)、したがって、これが解決された場合、バックアップとアップロードには別のバケットを用意したいと思うでしょう。

この行を削除したところ、ファイルがアップロードされ、カスタムドメインを s3_cdn_url として使用してアクセスできることがわかりました。(同様の編集を s3 rake タスクに加えることで、アセットのアップロードが可能になります。)

「いいね!」 5