RubyでS3にファイルをアップロード
Rubyでaws-sdk-s3を使用してログファイルをアップロードしてみた。
■環境
$ rbenv -v
rbenv 1.1.2-26-gc6324ff
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
■目次
- 事前準備
- ruby環境準備
- AWS準備
- 必要なファイル準備
- 作業
- SDK追加
- 環境変数準備
- Ruby処理追加
- 実行
- 確認
- 参考
■内容
1. 事前準備
1-1. ruby環境準備
・rubyインストール → Ruby環境をmacに構築
・bunlerのインストール
$ rbenv exec gem install bundler
$ which bundler
/Users/y-agatsuma/.rbenv/shims/bundler
1-2. AWS準備
以下の情報が必要になります。
1-2-1. access_key / secret_key
- access_key
- secret_key
今回はこの記事を参考に。
s3用のユーザーを作成して上げて、role/policyはs3のみに制限してあげた形で、access_key/secret_keyを発行し、メモしておきます。
1-2-2. s3バケット
- bucket_name
- region
バケットをパブリックにて作成します。
1-3. 必要なファイル準備
$ mkdir sample
$ cd sample
$ touch Gemfile
$ touch upload_s3.rb
# ディレクトリは以下構造
sample
|- Gemfile
|- upload.rb
2. 作業
2-1. SDK追加
公式: aws-sdk-ruby
# Gemfile
gem 'aws-sdk-s3', '~> 1.0.0.rc2'
$ bundle install
$ bundler exec gem list | grep aws-sdk-s3
aws-sdk-s3 (1.0.0)
2-2. 環境変数準備
$ export AWS_ACCESS_KEY=【準備したアクセスキー】
$ export AWS_SECRET_KEY=【準備したシークレットキー】
$ env | grep AWS
AWS_ACCESS_KEY=【準備したアクセスキー】
AWS_SECRET_KEY=【準備したシークレットキー】
↓
# 環境変数から取り除く時はunset
$ unset AWS_ACCESS_KEY
$ unset AWS_SECRET_KEY
2-3. Ruby処理追加
# upload_s3.rb
require 'aws-sdk-s3'
# ログファイル生成〜出力
log_file_name = "#{Time.now.strftime('%Y%m%d_%H%M')}.log"
log_file = File.join(File.dirname(__FILE__), log_file_name)
logger = Logger.new(log_file)
logger.debug('hello world!!')
bucket = 'yaga-sample-bucket'.freeze
region = 'ap-northeast-1'.freeze
access_key = ENV.fetch('AWS_ACCESS_KEY') # *1
secret_key = ENV.fetch('AWS_SECRET_KEY') # *1
date_dir = 'sample/' + Time.now.strftime('%Y%m%d') + '/'
client = Aws::S3::Client.new(
region: region,
access_key_id: access_key,
secret_access_key: secret_key
)
client.put_object(
acl: "public-read",
bucket: bucket,
key: date_dir + log_file_name,
body: File.open(log_file, :encoding => "UTF-8"),
content_type: "application/force-download",
)
# ログファイル削除
File.delete(log_file)
2-4. 実行
$ ruby upload_s3.rb
2-5. 確認
URLクリックすると、強制的にファイルをダウンロードされる
ダウンロードしたファイルに以下が記載されていることを確認
# Logfile created on 2020-03-02 20:45:26 +0900 by logger.rb/61378
D, [2020-03-02T20:45:26.847370 #15758] DEBUG -- : hello world!!
3. 参考
-
*1 ENV['']とENV.fetch()の違いについて