Я перехожу к новому 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 даже правильный?
Да. Это отлично работает. Спасибо – frostymarvelous
Я тоже делал ту же ошибку. Исправлена ошибка и для меня. Спасибо. @ Крис-Хокинс, пожалуйста, отметьте ответ в качестве действительного ответа, если он исправил проблему и для вас. Это поможет другим людям, которые достигают этой темы. –