RubyでS3に画像アップロードする
最近久しぶりにRubyをガッツリ書いてます。AWS使ってみたいなと思ったので、手始めにS3使ってみることにしました。次はラムダ書こう。
1. AWSのアクセスキーを取得する
ユーザー名 > マイセキュリティ資格情報 > アクセスキー (アクセスキー ID とシークレットアクセスキー) > 新しいアクセスキーの作成
で作成できる。
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. 実行
main.rb
に以下のコードを記載する。bundle exec ruby main.rb
で実行する。- 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
メソッド定義一覧
- #upload_file(source, options = {}) | Class: Aws::S3::Object — AWS SDK for Ruby V3
- #objects(options = {}) | Class: Aws::S3::Bucket — AWS SDK for Ruby V3
- #presigned_url(http_method, params = {}) | Class: Aws::S3::Object — AWS SDK for Ruby V3
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でアクセスすると見えないが、 生成された署名付きのURLでアクセスすると、画像を取得できる。