【问题标题】:AWS::S3::Errors::AccessDenied: Access Denied when trying to do copy_toAWS::S3::Errors::AccessDenied:尝试执行 copy_to 时拒绝访问
【发布时间】:2015-07-16 12:33:49
【问题描述】:

我编写了一个 rake 任务,它从存储桶中的一个目录复制到同一存储桶中的另一个目录。当我在本地测试它时它工作正常,但是当我将它部署到环境时它返回 AWS::S3::Errors::AccessDenied: Access Denied。我认为这与我正在部署的环境中的 AWS 凭证有关,我也相信问题与 copy_to 有关,因为我从 rails 控制台访问存储桶并且没有问题

我的声明副本如下

   creds = YAML::load_file(Rails.root.join("config", "s3.yml"))

   AWS.config(aws_access_key_id: creds[:access_key_id],
               aws_secret_access_key: creds[:secret_access_key])

s3.buckets['test-bucket'].objects['path to file'].copy_to('new_path')

【问题讨论】:

  • 你能告诉我们初始化s3变量的代码吗?
  • 凭证只是从 YAML 文件中读取的。我检查了控制台,它们被正确返回了
  • 所以当你从控制台做同样的事情时一切都好吗?
  • 这个命令从服务器返回什么:s3.buckets['test-bucket'].objects['path to file'].key ?
  • 返回对象的路径

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


【解决方案1】:

AWS.config 的参数是access_key_idsecret_access_key,没有aws_ 前缀。

http://docs.aws.amazon.com/AWSRubySDK/latest/AWS.html#config-class_method

【讨论】:

    【解决方案2】:

    发现这个是因为我在调用 copy_to() 时也收到了拒绝访问。虽然较旧的 SDK 版本乐于接受纯密钥路径作为 copy_to 的参数,但较新的版本也要求您指定存储桶。

    就我而言

    s3_bucket.object(old_key).copy_to(new_key)
    

    在 v3 SDK 中不起作用并产生了一个相当无用的“拒绝访问”错误。相反,这是可行的:

    s3_bucket.object(old_key).copy_to( s3_bucket.object(new_key) )
    

    s3_bucket.object(old_key).copy_to(bucket_name+'/'+new_key)
    

    【讨论】:

      【解决方案3】:
         s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')
      

      使用 aws-sdk gem 的简化示例:

       AWS.config(:access_key_id => '...', :secret_access_key => '...')
       s3 = AWS::S3.new
       s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')
      

      【讨论】:

      • 嗨,阿尼尔,不幸的是,这没有帮助。我很确定这与安全设置有关
      • 在执行某些操作之前,您需要为存储桶设置访问策略。
      猜你喜欢
      • 2016-12-21
      • 1970-01-01
      • 2018-09-14
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2019-05-12
      • 2017-12-24
      相关资源
      最近更新 更多