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...

Adding Emoji icons to Rails application

Its very easy to add emoji icons/images to your rails application. It seems complex but its all easy using javascript.The steps can be simplified as shown below:- add the javascript(download jemotion ) include it in your view file(where you want :) to be shown as this -----------------------> thats it....done first you need to add this wonderful js which works really great and nice from home page . We are interested in only the js and emotions folder(containing the smileys/GIF images). once you download just include it in your view file and copy/dump the emotions folder(containing images) to app/assets/images for RAILS 3+. as i did where i want the users to view their comments after they submit their comment. You also need to give a unique id to make  the js understand where it needs to convert your symbols to icons.see below code and hope you will understand how to use it. Keep in mind two thing:- dont forget t...