Ruby on RailsとCarrierWaveを使ってS3互換のストレージサービスWasabiに画像ファイルをアップロードする

安い、早いは正義。

Wasabiのコントロールパネル

コスパ最強のオブジェクトストレージWasabiに東京リージョンが追加されて、やったぜ状態なのでさっそくWasabiを契約しました。(WebAreana経由)

開発環境はこちら(本番環境との違いはVagrantの有無だけ)

  • Vagrant
  • Ubuntu 18.04
  • Docker
  • Rails6

しかしまあ、Wasabi関連の情報がすくないです。完全に手探り。

今回はgemは

#Gemfile

gem 'carrierwave'
gem 'fog'

を使います。ActiveRecordは使っていません。


やっていくです

CarrierWaveの導入方法は割愛します。

CarrierWaveの動作確認ができたら、uploaders/hoge_image_uploader.rbのstorageの行を書き換えましょう。
環境によってアップロード先を分けたい場合はここにRails.env.development?とかで分岐しましょう。
今回は動くかどうかみたいだけなのでローカル(Vagrant)のdevelopment環境からfogでWasabiに接続していきます。

# strota :file
storage :fog

動作に必要な設定ファイルを追加します。

$ touch config/initializers/carrierwave.rb

ここまでできたら、Wasabiでグループ・ユーザー・バケットを作って、アクセスキーとシークレットキーを控えておきましょう。
こちらの記事がわかりやすいです。

Mastodon移住の話からMastodonメディアをwasabiという安いオブジェクトストレージに移管した話まで

今回はもちろん東京リージョン(ap-northeast-1)を使いました。
endpointとregionは選択リージョンによって適宜書き換えて下さい

#config/initializers/carrierwave.rb

CarrierWave.configure do |config|
    config.fog_credentials = {
        provider: "AWS",
        service: "S3",
        endpoint: 'https://s3.ap-northeast-1.wasabisys.com',
        aws_access_key_id: 'ここにアクセスキー'
        aws_secret_access_key: 'ここにシークレットキー',
        region: 'ap-northeast-1' #リージョン
    }
    config.fog_directory  = 'fuga' #バケット名
    config.fog_public     = false
    config.fog_authenticated_url_expiration = 60
    CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
    config.cache_storage = :fog
end

バケット名は、credentialの中にbucketを追加するのではなく、fog_directoryで設定。
ぼくはここでつまづきました。
セキュリティ上、アクセスキーとシークレットキー、それからバケット名は環境変数にしておくと良いでしょう。

設定終わり。Dockerをビルドして再起動しましょう。

$ docker-compose build
$ docker-compose restart

完了です!

アップロード先がWasabiになりました!やったね!

続き

[fog][DEPRECATION]が出る。RailsからオブジェクトストレージWasabiに接続|きょうのはるきょ


※これまでは米国・欧州リージョンしかなかったので物理距離による転送速度の遅さが導入のボトルネックになっていたと言われている。

※本家Wasabiだと転送量制限付きで30日間無料トライアルもあるので、触ってみたい人はそちらから入ってみるといいかもしれん。

※ちなみにWasabiではユーザーをすべて消してしまうと、サブユーザーでコンパネにログインはできるけどIAM情報が必要な権限の操作やユーザーやグループの作成ができなくなります。復帰不能なのでアカウント作り直しになります。簡単に消せちゃうんだよなあ・・・笑

公開日