#rmagickで生成した画像をS3にあげたい
carrierwaveを利用すればええやんと思ったのですが、今回は利用していません。
サービスの機能として、アップロードする際にモーダルからファイルを選んで投稿。。。。とかではなく、インスタンスをsaveするタイミングで、画像も同時に生成されるようにしたかったからです。つまりよくあるファイルを選んでください。
みたいなものはないわけです。
せっかくなんでcarrierwaveを使わずにやってみたいというのもありましたので、
・carrierwaveを使わない
・インスタンスがsaveされた段階で、そのインスタンスのもつtitleカラムやauthorカラムが画像処理され、awsのバケットに入る
みたいなことをやってみました。
#実際の作業とコード
今回はバケットがすでに生成されていること前提です。
まずは2つのgemをインストール
dotenvはセキュリティのため、aws-sdkはrubyからawsを操作できるようにするgemです。
bundle install
gem 'dotenv'
gem 'aws-sdk'
次にモデルの方に記述。
require 'aws-sdk'
def upload_aws
Aws.config.update({
credentials: Aws::Credentials.new(ENV['ACCESS_KEY_ID'], ENV['SECRET_ACCESS_KEY'])})
s3 = Aws::S3::Resource.new(region: 'ap-northeast-1')
bucket = s3.bucket('bucket')
object = bucket.object('object.png')
object.upload_file("object_img.png")
end
requireは必須ぽい。ドキュメントに書いてあります。
ENVを使って実際のkeyは.envファイルに逃す。あとは普通にインスタンスを生成してメソッド追加していくだけです。(格納するオブジェクトを生成する。)
リージョンは東京。
最後のobject_img.pngがrmagickで生成されている画像です。
最終的にその画像がバケット内に格納されます。
#感想
自分今までaws苦手意識がありましたが、今回で少し理解できたような気がしました。(上のコード実装できたとき気持ちよかった)
あとドキュメントをちゃんと読む、一次情報に当たることが大切だと気づけました。色々な参考webページもあったんですが、awsの仕様がどんどん更新されており、古くなっている気がしています。。。
=> 特にここのドキュメントを参考にしました。アマゾン公式です。
https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/hello.html
ただまだあげられるようになっただけなので、これから改修するべきところはいくつもあるのでそちらをやっていきます。
(上のコードだと、あげられた画像が全て同じファイル名になってしまう。。。)