【问题标题】:AWS SDK v2 AllAccessDisabled error for S3 file copyS3 文件复制的 AWS SDK v2 AllAccessDisabled 错误
【发布时间】:2015-04-23 17:21:21
【问题描述】:

我正在切换到我编写的 Rails 应用程序中的新 aws-sdk,但我终生无法在 v2 sdk 中找到相应的工作方法。我也遇到了无法解决的访问被拒绝问题。

我使用 v1 sdk 的方式是用户使用“uploads”命名空间键直接上传到 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::Errors::AllAccessDisabled: 对此对象的所有访问都已被禁用

我已尝试更改处理安全凭据的方式。我没有使用裸访问密钥/秘密密钥对,而是在 IAM 中创建了一个用户,附加了一项授予他们对 S3 的完全访问权限的策略,并尝试使用这些凭据,但无济于事。

我做错了什么?但是,如果有人熟悉新的 sdk,我的 copy_object 方法是否正确?

【问题讨论】:

    标签: ruby-on-rails amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

    错误是由您传递给#copy_object:copy_source 值引起的。该值必须是源存储桶和源键,用斜杠 (/) 分隔:

    "#{sourcebucket}/#{sourcekey}"
    

    您的 old_key 值包含正斜杠。 Amazon S3 采用该键的第一个路径段并将其视为存储桶名称。因为您没有对该存储桶的权限,所以您会收到身份验证错误。您的凭据配置可能没问题。

    要纠正这个错误:

    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
    

    【讨论】:

    • 我也犯了同样的错误。也为我修复了错误。谢谢你。 @Chris-Hawkins,如果它也为您解决了问题,请将答案标记为有效答案。它将帮助其他访问此线程的人。
    • 这是使用 Carrierwave 时克隆对象的绝佳解决方案。谢谢!
    猜你喜欢
    • 2022-01-26
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多