簡體   English   中英

存儲桶中的Ruby訪問文件夾的aws-sdk

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM