やりたいこと
Rails アプリからテキストを S3 に保存して、それを URL から参照する。
準備
今回は AWSさん直々に用意してくれている aws-sdk を使った。
gem 'aws-sdk'
注意) aws-sdk の最新バージョンは2.0系で、1.0系の記事も多く出ており、書き方等変わっているので自分の使っている gem のバージョンにあった方法でやる必要がある。
というか上げた方がいいと思う。
いざ aws-sdk をいじろう
aws-sdk は本当に様々な機能を用意してくれている。
今回やりたいこと(Railsアプリから S3 にテキストを保存する)も含めて、S3内の リソースを操作するのに主に
- Aws::S3::Client
- Aws::S3::Resource
の2つがある。今回テキストを渡すのは後者の Aws::S3::Resource で行った。
設定ファイル
まずはじめに S3 につなぐために、AWS のアクセスキーやらシークレットキーなどが必要になるので設定する。
config/initializers/aws.rb に設定を書き込む。
Aws.config.update({
credentials: Aws::Credentials.new('AWS のアクセスキー', 'AWS のシークレットキー'),
region: 'ap-northeast-1'
})
保存
続いてバケット名 "sample_bucket" のバケットの
/uploads/texts/sample.txt にテキストを保存するには下記のようになる。
def save_text
text = 'このテキストが保存されます'
if Rails.env.development?
File.open(File.join(Rails.root, 'tmp', 'sample.txt'), 'w'){|f| f< << text}
else
s3 = Aws::S3::Resource.new
bucket = s3.bucket('sample_bucket')
object = bucket.object('uploads/texts/sample.txt')
object.put(body: text, acl: 'public-read')
end
end
ローカル環境ではアクションが通るたびに S3 にファイルが作成されるのはウザいので
tmp 以下に保存するようにしている。
あとは aws-sdk さんが用意してくれているメソッドを使ってバケットを指定して、さらにオブジェクトを key を使って指定して、そこにテキストを保存している。
また保存する時にオブジェクトの acl を public-read に変更して、外部から URL を叩いてオブジェクトの中身(テキスト)を参照できるようにしないといけないので注意。
これにアクセスするには
https://sample_bucket.amazonaws.com/uploads/texts/sample.txt
などでできるかと
まとめ
たったこれだけで保存できるし、便利。
自分は RSS 保存するために使ったけどファイル形式にしてからファイルごと保存するのも似たような方法でできるので、機会があったらやってみる
コードを書いたらそれを担保するテストを書きたいのだがそれはまたの今度書こうかと。
なんやかんや言うてドキュメントが充実してるのでそれ見るのが一番ww
参考も全部ドキュメントです