[Rails]AWS SDK for Ruby(2.5系)を使用してファイルをS3にアップロードしてみた
2016年09月06日
まだまだ日中は夏のような暑さですが、
日が暮れると風が涼しく、ひぐらしも鳴き始め、もうすぐ夏も終わりなんだなー
っとしみじみと感じている榊原です。
今回はタイトル通り、AWS様が提供しているAWS SDK for Rubyを使用して、
S3にファイル(今回はCSVファイル)をアップロードするまでの流れをさっくり書きたいと思います。
Qiita、公式等、色々なところでやり方について書かれているので、今更と思う人がいるかもしれませんが、
AWS SDK for Rubyを最新にしたことによって色々変わっていたので、今更と思わず、すこし見ていただけたらなと思います。
AWS SDKとは
まず、AWS SDKとはなんぞやということですが、簡潔に言うと、各言語にてAWSサービスを簡単に利用するためのライブラリという認識ですが、間違えていたらご指摘ください…
AWS SDK for Rubyのインストール
bundlerを利用してAWS SDKのインストールを行います
まず、Gemfileに以下のような記述を追加します。
gem 'aws-sdk', '~> 2.1'
その後、コンソールから以下のコマンドを実行して、
AWS SDKのインストールを行います、インストールするフォルダを指定する場合は、
--pathオプションを忘れないようにしてください
$ bundle install
bundle installで正常終了したら、コンソールから以下のコマンドを実行していただき、
同じような結果が表示されていればインストール完了となります
今回のGemfileに記述した'aws-sdk', '~> 2.1'は2.1から3.0の手前までの最新Verをインストールするという記述になるため、
実行するタイミングによって、Verが更に新しいものになる可能性があるという点にご注意ください
$ bundle list | grep aws-sdk
* aws-sdk (2.5.3)
* aws-sdk-core (2.5.3)
* aws-sdk-resources (2.5.3)
S3へのファイルのアップロード
まずはじめにQiitaの記事を参考にした下記の内容で試してみました。
AWS.config(
access_key_id: 'YOUR_ACCESS_KEY_ID',
secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
)
s3 = AWS::S3.new
bucket = s3.buckets[bucket_name]
obj = bucket.objects[s3_path + '/' + file_name]
obj.write(file: upload_file_path + '/' + file_name)
結果としては、「uninitialized constant AWS」という内容で、AWS.config実行のタイミングでエラーとなりました。
インストールされたライブラリの中身を見てみるとモジュール名が「Aws」になっており、どのVerからかは不明ですが、モジュール名がアッパーキャメルケースに変更されていたようです。
次に公式の日本語ドキュメントを参考にした下記の内容で試してみました。
s3 = Aws::S3::Resource.new(region:'region')
obj = s3.bucket('bucket-name').object('key')
obj.upload_file('/path/to/source/file')
結果としては、実行する以前にIDEの方で「Found 1 extra argument(s). Required 0」となり、
そもそも引数していできないよとのこで、当然実行してもエラーとなりました。
最終的に問題なく動作したものは公式の英語ドキュメントを参考にした下記の内容のものとなります。
Aws.config.update({
region: 'region'
credentials: Aws::Credentials.new('YOUR_ACCESS_KEY_ID', 'YOUR_SECRET_ACCESS_KEY')
})
s3 = Aws::S3::Resource.new
obj = s3.bucket('bucket-name').object('key')
obj.put(body: String)
今回はput部分にCSVの文字列を引き渡す形にしましたが、ファイルでも同様のことができるかと思います。
また、一点確認していない部分なのですが、今回、Aws.config.updateの部分でregionとcredentialを指定しています。
しかし、ドキュメントのConfiguration部分をGoogle翻訳にかけてざっくり見てみたところ、どうやら指定の環境変数、または、iniファイルに記述することで、Aws.config.updateで記述しなくても設定してくれるようです。
セキュリティ的にはソースに直接書くよりも、環境変数、または、iniファイルに記述した方がいいと思うので、そちらも試してみようと思います。
まとめ
AWSを使用している人がかなり多いこともありQiita、ブログ、公式ドキュメントなど様々なところに情報があります。
ただし、サービスの追加、更新、SDKの更新等がかなり頻繁に行われているので、古い情報というのも多くあり、公式ドキュメント見たほうがいいとはわかっていましたが、文章が難しいとか、目的の情報をうまく見つけられない等で敬遠していました。
新しいサービスを使っているなら、好き嫌いせずに公式ドキュメントをしっかり見よう!
っということで、今回はこのあたりで閉めさせていただきます、次回は、すこしAWS Lambdaについて書こうかなーっと考え中です
その他
この頃、静岡のJAWS-UGでLT等で話させていただいていますが、2016.10.22[sat]に名古屋でJAWS FESTA 東海道 2016という大きなイベントを開催するそうなので、AWSに興味があるという方はぜひ参加してみてください。
参加については、connpassのこちらで募集しています。先着順となっていますので、お早めに!
こちらはすでに終わってしまったのですが、2016.08.27に行われたJAWS-UG東海道 in 浜松に登壇させていただきました。
内容はasciiさんの以下のページにて掲載していただいておりますので、内容に興味があるよという方は、次回の参加をお待ちしております!
http://ascii.jp/elem/000/001/209/1209985/
【未経験者にもおすすめ!】 おすすめプログラミング勉強サイト「Progate」
[Rails]多言語対応をさっくりやってみた
[Rails]Railsのバージョンを上げたことでspatial_adapterが使用できなくなりました
[Rails]多言語対応をさっくりやってみた
[Rails]Railsのバージョンを上げたことでspatial_adapterが使用できなくなりました