学習記録

たまには誰かの役にたったらいいな

RubyでS3に画像アップロードする

最近久しぶりにRubyをガッツリ書いてます。AWS使ってみたいなと思ったので、手始めにS3使ってみることにしました。次はラムダ書こう。

1. AWSのアクセスキーを取得する

ユーザー名 > マイセキュリティ資格情報 > アクセスキー (アクセスキー ID とシークレットアクセスキー) > 新しいアクセスキーの作成 

で作成できる。

f:id:sikeda107:20200906160512p:plain

2. S3のバケットを作成する

images20200905 というバケットを作成しておく。

3. プロジェクトの作成

> mkdir aws-sdk-for-ruby
> cd aws-sdk-for-ruby
> gem install bundler
> bundle init 
> vim Gemfile # 後述
> bundle install
> echo 'puts "Hello World"' >> main.rb
> bundle exec ruby main.rb
Hello World
> echo 'ACCESS_KEY_ID="取得したアクセスキー"\nSECRET_ACCESS_KEY="取得したアクセスキー"' >>  .env
# 適当な画像をダウンロードして、フォルダにおく (wolf.jpg)
> ls
.env         Gemfile      Gemfile.lock         main.rb      wolf.jpg

Gemfileに以下を書く

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }

gem 'aws-sdk', '~> 3'
gem 'dotenv'

4. 実行

  1. main.rb に以下のコードを記載する。
  2. bundle exec ruby main.rb で実行する。
  3. S3を画面から確認する
require "aws-sdk"
require "dotenv"

# .envを読み込む
Dotenv.load

# AWSへの接続情報を定数として設定する
ACCESS_KEY_ID = ENV["ACCESS_KEY_ID"]
SECRET_ACCESS_KEY = ENV["SECRET_ACCESS_KEY"]
REGION = "ap-northeast-1"
BUCKET_NAME = "images20200905"

# S3に接続するためのリソースインターフェースを作成する
s3resoruce = Aws::S3::Resource.new(
  access_key_id: ACCESS_KEY_ID,
  secret_access_key: SECRET_ACCESS_KEY,
  region: REGION,
)

# ローカルのファイル名を設定する
local_file_name = "./wolf.jpg"
# S3におくときのディレクトリとファイル名(Key)を設定する
# ※今回はファイル名にランダムな数字を付与している
s3_key = "images/image#{rand(100).to_s}.jpg"

# upload_fileを使って、画像をアップロードする
puts "#{local_file_name} をS3の #{s3_key}へアップロードします..."
s3resoruce.bucket(BUCKET_NAME).object(s3_key).upload_file(local_file_name)

# S3の指定したバケットにあるファイルを50件取得する
puts "****  S3Resoruce でファイルの存在を確認します ****"
s3resoruce.bucket(BUCKET_NAME).objects.limit(50).each do |item|
  puts "Name:  #{item.key}"
  # 署名付きURLを生成する, このURLでアクセスすると画像がみえる
  puts "URL:   #{item.presigned_url(:get)}"
end

メソッド定義一覧

5. 実行確認

>bundle exec ruby main.rb
./wolf.jpg をS3の images/image32.jpgへアップロードします...
****  S3Resoruce でファイルの存在を確認します ****
Name:  images/image32.jpg
URL:   https://images20200905.s3.ap-northeast-1.amazonaws.com/images/image32.jpg?署名用のクエリパラメータ

署名なしのURLでアクセスすると見えないが、 f:id:sikeda107:20200906160832p:plain 生成された署名付きのURLでアクセスすると、画像を取得できる。 f:id:sikeda107:20200906160847p:plain

参考