Skip to main content

Access files on AWS S3 bucket using aws-sdk-s3 with Rails 6

This is a quick post to share few easy methods to access files on AWS S3.

The below custom utility methods uses aws-sdk-s3

Firstly lets define a constant to access files on S3 - 

##to manage S3 Resources
S3 = Aws::S3::Resource.new(
region: "YOUR-REGION",
access_key_id: "YOUR-AWS-KEY",
secret_access_key: "YOUR-AWS-SECRET")

##to query S3
S3_client = Aws::S3::Client.new(
access_key_id: configatron.aws.s3.credentials.access_key_id,
secret_access_key: configatron.aws.s3.credentials.secret_access_key,
region: configatron.aws.s3.region
)

Now, lets use the S3 OBJECT to access files in different ways - 


1. Get all files in a S3 FOLDER

    ##this gives a array of file paths present in the folder specified by prefix attribute    
    s3objects = S3.bucket("my-output-bucket").objects({prefix: "/inputs/any-random-user-folder"}).collect(&:key)
##you can also delete the file if found
##eg: s3objects.batch_delete!


2. Check if file is present/check file content_lenght


          ##using head_object to just fetch required minimal details 
    s3object = S3_client.head_object(bucket: "MY-OUTPUT-BUCKET", key: "my-file-path")
    ##return boolean, if present else false
    !!s3object.content_length

3. Download file from S3

     
data = open(any_valid_s3_url)
send_data data.read, filename: "test-download", stream: false, type: 'any-valid-content-type', disposition: 'attachment'



The above methods are live and tested on production data on RAILS 6 application.
These methods are very simple yet configurable in the way you want by
adding more dynamicity, if needed as per the use case.
We had many use cases regarding -

  • Check if uploaded large file present on S3, after upload.
  • If file is uploaded, especially a video file, check if there are any thumbnails present.
  • If thumbnails present, show the last one else show default image
  • Download a file stored on S3.
There are more efficient ways to do it by setting up IAM roles/ACL attributes
per S3 objects, but that's beyound the scope of this post.













Comments

Popular posts from this blog

So easy to install ruby on rails on ubuntu 12.04/centos 6 and start development

Its easy to start development on ubuntu/centos using vmware and start development.i will start the code on certain assumptions : you know ruby on rails you are aware of how to make use of google(in case u are stuck and want to explore more without spoon feeding) LAST BUT NOT LEAST---you love coding short preview of sequence you need to follow:  START -> get vmware -> get ubuntu/centos -> get rvm -> get ruby -> get rails----END--THAT'S IT Lets start and finish this quickly using below mentioned steps: install vmware player if you are using windows/mcintosh from https://my.vmware.com/web/vmware/downloads  NOW.vmware player need image file of the operating system you want,so hit the url and get centos at http://vault.centos.org/6.2/isos/ OR ubuntu at http://www.ubuntu.com/download/desktop ONCE both vmware player and ubuntu/centos are downloaded,follow the steps to first install vmware(very simple) and mounting ubu...

Loading Associations of associations using joins instead of includes

Imagine a Rails scenario where,User model has many associations.So it make look like:- Use includes for lazy loading of all associations Use joins to load all associations that exists For example:-                  A user has many orders.                  Order has many images,videos,comments,testimonials,feedbacks,address,contact_details and annoucements. So,to access a user having a request,with all orders having all associations,we will use the usual includes  like :- User.includes( { orders: [ { :address,:contact_details,:comments,annoucements,feedbacks: [:videos, :images] }] }) will load all users . But,to get all users having all associations present,we can use Joins  like: User.joins( { orders: [ { :address,:contact_details,:comments,annoucements,feedbacks: [:videos, :images] }] }) will load all users with associations present. Hope it he...