2015-02-22 3 views
7

Я перехожу к новому aws-sdk в приложении rails, который я написал, и не могу на всю жизнь найти подходящие методы в v2 sdk. Я также сталкиваюсь с проблемами доступа, которые я не могу решить.AWS SDK v2 Ошибка AllAccessDisabled для копии файла S3

Способ, которым я пользуюсь v1 sdk, заключается в том, что пользователи непосредственно загружают на s3 с помощью «загружаемого» ключа с именами, а после создания объекта, над которым они работают, обратный вызов перемещает файл в длинный ключ и удаляет старый. Вот пример этого:

def move_file 
    old_key = s3_key 
    new_key = "#{self.class.table_name}/#{id}/#{Digest::SHA1.hexdigest([Time.now, rand].join)}/#{filename}" 
    AWS.config(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], region: 'us-east-1') 
    s3 = AWS::S3.new 
    bucket_name = ENV['AWS_S3_BUCKET'] 
    bucket = s3.buckets[bucket_name] 
    object = bucket.objects[old_key] 

    begin 
     object.move_to new_key, :acl => :public_read 
     rescue AWS::S3::Errors::NoSuchKey 
      errors.add(:base, "Oops! Something went wrong uploading your file. Please try again, and if the problem persists, open a trouble ticket.") 
    end 

    if !bucket.objects[old_key].exists? && bucket.objects[new_key].exists? 
     update_column(:s3_key, new_key) 
    end 
    end 

Отлично работает, но теперь я пытаюсь обновиться до нового sdk. То, что я пытался это:

def move_file 
    old_key = file 
    new_key = "#{self.class.table_name}/#{id}/#{Digest::SHA1.hexdigest([Time.now, rand].join)}/#{filename}" 
    s3 = Aws::S3::Client.new 

    begin 
     s3.copy_object({copy_source:old_key, key:new_key, bucket: ENV['AWS_S3_BUCKET'], acl:'public-read'}) 
     s3.delete_object({bucket: ENV['AWS_S3_BUCKET'], key:old_key}) 
     update_column(:file, new_key) 
     rescue Aws::S3::Errors::ServiceError 
      errors.add(:base, "Oops! Something went wrong uploading your file. Please try again, and if the problem persists, open a trouble ticket.") 
    end 
    end 

Всякий раз, когда я пытаюсь переместить загруженный файл он бросает и ошибки - Aws :: S3 :: Ошибки :: AllAccessDisabled: Любой доступ к этому объекту был отключен

Я попытался изменить способ обработки учетных данных безопасности. Вместо открытого ключа ключа/секретного ключа я создал пользователя в IAM, приложил политику, которая предоставляет им полный доступ к S3 и пытается использовать эти учетные данные, но безрезультатно.

Что я делаю неправильно? Но также, если кто-то знаком с новым sdk, мой подход к copy_object даже правильный?

ответ

15

Ошибка обусловлена ​​значением :copy_source, которое вы передаете до #copy_object. Это значение должно быть источником ведро и источник ключ, разделенные косой чертой (/):

"#{sourcebucket}/#{sourcekey}" 

Ваше значение old_key содержит косую черту. Amazon S3 берет первый сегмент пути этого ключа и рассматривает его как имя ведра. Поскольку у вас нет разрешения на это ведро, вы получаете ошибку auth. Конфигурация учетных данных, вероятно, просто прекрасна.

Чтобы исправить эту ошибку:

def move_file 
    bucket = ENV["AWS_S3_BUCKET"] 
    old_key = file 
    new_key = "#{self.class.table_name}/#{id}/#{Digest::SHA1.hexdigest([Time.now, rand].join)}/#{filename}" 
    s3 = Aws::S3::Client.new 

    begin 
    s3.copy_object(bucket:bucket, key:new_key, copy_source:"#{bucket}/#{old_key}", acl:'public-read') 
    s3.delete_object(bucket:bucket, key:old_key) 
    update_column(:file, new_key) 
    rescue Aws::S3::Errors::ServiceError 
    errors.add(:base, "Oops! Something went wrong uploading your file. Please try again, and if the problem persists, open a trouble ticket.") 
    end 
end 
+0

Да. Это отлично работает. Спасибо – frostymarvelous

+0

Я тоже делал ту же ошибку. Исправлена ​​ошибка и для меня. Спасибо. @ Крис-Хокинс, пожалуйста, отметьте ответ в качестве действительного ответа, если он исправил проблему и для вас. Это поможет другим людям, которые достигают этой темы. –

Смежные вопросы