我编写了一个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')
答案 0 :(得分:2)
AWS.config
的参数为access_key_id
和secret_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')