Dudo
Dudo

Reputation: 4169

Aws::S3 undefined method 'with_prefix' on a ::Resource

So, first, I'll give you an idea of what I'm trying to accomplish. I host a bunch of photos on S3. They're car photos, and organized by VIN. At creation, I don't always have the VIN, so I make a fake one. Later on, when updated with the correct VIN, I want to update the folder name on S3. Can't rename stuff in S3, so I have to copy with a new name, and delete the original. Phew! Now on to how I'm failing...

creds = ::Aws::Credentials.new(Settings.aws.access_key_id, Settings.aws.secret_access_key)
s3 = ::Aws::S3::Client.new(region: 'us-west-1', credentials: creds)
bucket = Settings.aws.bucket
s3.copy_object(bucket: bucket, copy_source: "#{bucket}/foo", key: 'bar')
s3.delete_object(bucket: bucket, key: "#{bucket}/foo")

This does not work... Aws::S3::Errors::NoSuchKey: The specified key does not exist. when calling copy_object. copy_source is a folder, so it doesn't work like a regular object, fine.

So, I looked around and found that I have to call:

s3 = ::Aws::S3::Resource.new(region: 'us-west-1', credentials: creds)
bucket = bucket = s3.bucket(Settings.aws.bucket)
bucket.objects.with_prefix('foo/').each do |object|
  object.copy_from(copy_source: "#{bucket}/foo")
end

This does not work... notice that I'm calling ::Resource now, as I don't know how to get a bucket from ::Client. With above, I get NoMethodError: undefined method 'with_prefix' for #<Aws::Resources::Collection:0x007fad587255a8> with baffles me, as everything I read seems to point to that solution.

I'm using v2 of the AWS SDK. Not sure if I'm looking at v1 solutions?

I have no idea how the copy_from works, honestly... what I really want is a copy_to which doesn't seem to be in the documentation.

aws-sdk-core-ruby github

aws sdk docs

Upvotes: 2

Views: 2484

Answers (2)

damaldonadoc
damaldonadoc

Reputation: 86

The 'objects' method of 'bucket' class in aws-sdk v2 returns a Collection of ObjectSummary (See: http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Bucket.html#objects-instance_method).

To query a list of objects with a prefix you should use:

bucket.objects({prefix: 'some_prefix'})

Upvotes: 5

PiYa
PiYa

Reputation: 21

I use

bucket.objects.find_all { |object| object.key.include?('foo/') }

for aws sdk v2

Upvotes: 0

Related Questions