AWS :: S3 :: Errors :: AccessDenied:尝试执行copy_to时拒绝访问

时间:2015-07-16 12:33:49

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

我编写了一个rake任务,它将一个copy_to从一个目录中的一个目录执行到同一个存储桶中的另一个目录。当我在本地测试它时工作正常,但是当我将它部署到环境时,它返回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')

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

发现此问题是因为在调用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)

答案 2 :(得分:0)

   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')