簡體   English   中英

適用於S3文件副本的AWS SDK v2 AllAccessDisabled錯誤

[英]AWS SDK v2 AllAccessDisabled error for S3 file copy

我正在切換到我編寫的rails應用程序中的新aws-sdk,並且在我的生活中找不到在v2 sdk中使用相應的方法。 我也遇到訪問被拒絕的問題,我無法解決。

我使用v1 sdk的方式是用戶使用“uploads”命名空間密鑰直接上傳到s3,在他們創建了他們正在處理的對象之后,回調將文件移動到longterm密鑰並刪除舊密鑰。 這是一個例子:

  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方法是否正確?

該錯誤是由您傳遞給#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM