您好我正在使用下面的代码来获取存储桶的大小。搜索到了所有,但唯一的方法是循环遍历每个文件。虽然循环,一些桶似乎在不同的区域创建,我结束以上错误
AWS::S3::PermanentRedirect: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. from /home//.rvm/gems/ruby-1.9.2-p180/gems/aws-s3-0.6.2/lib/aws/s3/error.rb:38:in `raise'
终点是us-west-1, 需要帮助解决上述问题,如何动态切换到我的存储桶所属的区域。在失败的情况下还需要添加异常的建议以下是我的代码。 请随时发表评论。
def get_bucket
s3 = AWS::S3::Base.establish_connection!(:access_key_id => @config[:ACCESS_KEY_ID], :secret_access_key => @config[:SECRET_ACCESS_KEY])
if !s3.nil?
AWS::S3::Service.buckets.each do |bucket|
puts bucket.inspect
if !bucket.nil?
size = 0
# I'm harding coding below bucket names, for code not to fail
if ![
'cf-templates-m01ixtvp0jr0-us-west-1',
'cf-templates-m01ixtvp0jr0-us-west-2',
'elasticbeanstalk-us-west-1-767904627276',
'elasticbeanstalk-us-west-1-akiai7bucgnrthi66w6a',
'medidata-rave-cdn'
].include? bucket.name
bucket_size = AWS::S3::Bucket.find(bucket.name)
if !bucket_size.nil?
bucket_size.each do |obj|
if !obj.nil?
size += obj.size.to_i
end
end
end
end
load_bucket(bucket.name,bucket.creation_date,size,@config[:ACCOUNT_NAME])
end
end
end
end
答案 0 :(得分:1)
问题是存储桶可以存在于不同的区域,虽然您可以列出来自同一连接的所有存储桶(与锁定到它们所在位置的其他AWS实体不同),存储桶上的其他操作要求您记录进入特定的"端点"他们受约束的(地区)。
我的解决方案是检查存储桶的位置,然后重新登录该区域:
s3 = AWS::S3.new(@awscreds)
if s3.buckets[bucket].location_constraint != @awscreds[:region] then
# need to re-login, otherwise the S3 upload will fail
s3 = AWS::S3.new(@awscreds.merge(region: s3.buckets[bucket].location_constraint))
end
答案 1 :(得分:0)
我不明白你是如何构建访问你的存储桶的URL的。
如果是美国标准版,您可以说http://s3.amazonaws.com/BUCKETNAME/path/to/file。如果它在其他地方,则不起作用(非巧合的是,您仅限于允许使用域名的字符(仅限小写和数字),并使用http://BUCKETNAME.s3.amazonaws.com/path/to/file。
本文可能会有所帮助:http://docs.aws.amazon.com/general/latest/gr/rande.html