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