16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails から S3 にテキストファイルを保存する

Last updated at Posted at 2016-12-25

やりたいこと

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 に設定を書き込む。

config/initializers/aws.rb
Aws.config.update({
  credentials: Aws::Credentials.new('AWS のアクセスキー', 'AWS のシークレットキー'),
  region: 'ap-northeast-1'
})

保存

続いてバケット名 "sample_bucket" のバケットの
/uploads/texts/sample.txt にテキストを保存するには下記のようになる。

s3_controller.rb
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
参考も全部ドキュメントです

16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?