![](/img/trans.png)
[英]aws-sdk for Ruby v2: check success status after I PUT object in S3 bucket
[英]aws-sdk for Ruby access folder within bucket
我在Amazon S3上有一個存儲桶,其中包含文件夾。 我試圖通過aws-sdk gem以下方式訪問它:
s3 = AWS::S3.new(
:access_key_id => "KEY",
:secret_access_key => "SECRET"
)
bucket = s3.buckets["my_bucket/my_folder"]
bucket.do_stuff....
我得到以下錯誤作為回報:
您嘗試訪問的存儲區必須使用指定的端點進行尋址。 請將以后的所有請求發送到此端點。
我有什么想法可能做錯了嗎?
可能S3存儲桶正在嘗試使用位於US-EAST(默認位置)之外,所以這應該可以幫助您:
s3 = AWS::S3.new(
:access_key_id => "KEY",
:secret_access_key => "SECRET"
:s3_endpoint => 's3-eu-west-1.amazonaws.com'
)
從以下列表中選擇您的S3 enpdpoint:
US Standard * s3.amazonaws.com(default)
US West (Oregon) Region s3-us-west-2.amazonaws.com
US West (Northern California) Region s3-us-west-1.amazonaws.com
EU (Ireland) Region s3-eu-west-1.amazonaws.com
Asia Pacific (Singapore) Region s3-ap-southeast-1.amazonaws.com
Asia Pacific (Tokyo) Region s3-ap-northeast-1.amazonaws.com
South America (Sao Paulo) Region s3-sa-east-1.amazonaws.com
在對象訪問方面,存儲桶名稱為my_bucket ,但my_folder應該是對象的一部分。
您需要為存儲桶(創建存儲區)配置特定於區域的端點。 你可以這樣做:
AWS.config(:s3_endpoint => '...')
s3 = AWS::S3.new
要么
s3 = AWS::S3.new(:s3_endpoint => '...')
您可以通過使用DNS可比較的存儲桶名稱來避免這種情況(也可以避免存儲桶名稱中的點)。 如果存儲桶名稱是有效的子域,則可以在不配置區域特定端點的情況下尋址存儲桶。 考慮以下:
http:://bucket-name.s3.amazonaws.com/path/to/object.txt
將存儲桶命名為“bucket-name”,對象鍵為“path / to / object.txt”。 此存儲桶可以存在於任何區域,但您可以使用“默認”區域訪問它。 當存儲桶名稱與dns不兼容時,則網址如下所示:
http://s3.amazon.com/bucket/name/path/to/object.txt
在上面的示例中,存儲桶是“存儲桶/名稱”,與dns不兼容。 它成為路徑的一部分,現在必須用區域特定端點替換s3.amazon.com(如果未在經典區域中創建存儲桶)。
正如其他人提到的,路徑應該是對象密鑰的一部分,而不是存儲桶名稱。 這允許您通過公共前綴對對象進行分組。 '/'用作虛擬文件夾(僅限慣例)。
# print the key of every object with the given prefix
s3.buckets['bucket-name'].objects.with_prefix('path/to/').each do |object|
puts object.key
end
has_attached_file :photo,
storage: :s3,
styles: { medium: "300x300>", thumb: "100x100>" },
s3_credentials: "#{Rails.root}/config/aws.yml",
bucket: "bucket-name",
s3_host_name: "s3-ap-southeast-1.amazonaws.com",
url: ":s3_domain_url",
path: 'books/:id/photo/:style_:basename.:extension'
為我工作:)
Godsaur的答案基本上是正確的。 但是,它似乎已經過時了,也許對於SDK版本1?
這適用於版本2:
s3 = Aws::S3::Client.new(endpoint:'https://s3-ap-southeast-1.amazonaws.com')
查看文檔 。
如果有人正在尋找這個,這是它應該如何工作根據https://github.com/aws/aws-sdk-ruby
creds = JSON.load(File.read('secrets.json'))
Aws.config[:credentials] = Aws::Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey'])
Aws.config[:region] = 'us-east-1'
client = Aws::S3::Client.new(
region: Aws.config[:region],
credentials: Aws.config[:credentials]
)
File.open('/local_directory/picture.jpg', 'rb') do |file|
client.put_object(bucket: 'bucket', key: 'folder_inside_bucket/picture.jpg', body: file)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.