In certain cases we might need to change access level for content of specific folder in our S3 Bucket, and leave other folders as they are. It can be done with a few easy steps:
Step 1
Install AWS SDK for Rails:
gem 'aws-sdk-rails'Step 2
Set AWS SDK configurations based on our credentials:
Aws.config.update(
access_key_id: ENV['key'], # e.g. 'RKIZPLO74257RMAGOEIZ'
secret_access_key: ENV['secret'], # e.g. 'q/qrzg+kt1kRB'
region: ENV['region'] # e.g. 'ca-central-1'
)Step 3
Initialize variables for needed folder, bucket and desirable access level:
# Folder you want to change content permissions for
aws_folder = 'Uploads' # S3 Bucket name
aws_bucket = 'some-production-ca'# Access level, can be 'public-read', 'private', etc.
acl = 'public-read'
Step 4
Initialize new S3 Client and get the content of specified bucket:
# Init S3 Client
s3_client = Aws::S3::Client.new# Get contents of aws_bucket
bucket_contents = s3_client.list_objects(bucket: aws_bucket).contents
Get list of names of objects(files) that are located in specified bucket’s folder:
files = bucket_contents.map{ |f| "#{f.key}" if f.key.include?(aws_folder) }.compactStep 5 (final)
Now the part that actually changes access level. Lets loop through list of file names we’ve got and call put_object_acl method:
files.each do |obj_key|
s3_client.put_object_acl(
key: obj_key, # object(file) name
bucket: aws_bucket, # 'some-production-ca'
acl: acl # 'public-read'
)
endVoilà!
Happy to serve you, My Lord / My Lady…