はじめに
RailsのActive Storageを使ってCloudflare R2に画像をアップロードしようとした際に、Aws::S3::Errors::InvalidRequest (You can only specify one non-default checksum at a time.) というエラーに遭遇しました。
このエラーの原因と、その解決策について共有します。
こちらのisuueを参考にしたので、気になる方は参照ください。
エラーの原因
このエラーは、S3互換ストレージサービス(この場合はCloudflare R2)へのアップロード時に、AWS SDKがデフォルト以外の複数のチェックサム(checksum)を同時に指定しようとすることで発生します。
こちらのaws-sdk-rubyのissueで解説してくれてます。
解決策
この問題を解決するには、config/storage.yml ファイル内のCloudflare R2の設定に、request_checksum_calculation と response_checksum_validation の2つのオプションを追加し、それぞれ"when_required"に設定します。
具体的には以下のように変更します。
cloudflare:
service: S3
access_key_id: <%= Rails.application.credentials.dig(:cloudflare, :access_key_id) %>
secret_access_key: <%= Rails.application.credentials.dig(:cloudflare, :secret_access_key) %>
region: auto
bucket: <%= Rails.application.credentials.dig(:cloudflare, :bucket_name) %>
endpoint: https://<%= Rails.application.credentials.dig(:cloudflare, :account_id) %>.r2.cloudflarestorage.com
public: true
request_checksum_calculation: "when_required" # <- この行を追加
response_checksum_validation: "when_required" # <- この行を追加
まとめ
issueを読むとすぐに分かることではありますが、日本語で参考にできるものがあると便利だと思ったので、この記事を書いてみました!