2012-10-16 33 views
11

Tôi có một thùng trên S3 Amazon với thư mục trong đó. Tôi đang cố gắng để truy cập vào nó theo cách sau qua AWS-sdk đá quý:aws-sdk cho thư mục truy cập Ruby trong thùng

s3 = AWS::S3.new(
    :access_key_id => "KEY", 
    :secret_access_key => "SECRET" 
) 

bucket = s3.buckets["my_bucket/my_folder"] 
bucket.do_stuff.... 

Tôi nhận được lỗi sau đổi lại:

Các xô bạn đang cố gắng truy cập phải được giải quyết bằng điểm cuối đã chỉ định. Vui lòng gửi tất cả các yêu cầu trong tương lai đến điểm cuối này.

Bất kỳ ý tưởng nào tôi có thể làm sai?

+0

Có thể đăng lại http://stackoverflow.com/questions/6581502/problem-in-accessing-bucket-of-my-aws-s3-account – sgud

+0

@sgud không đúng, liên kết bạn cung cấp là về AWS-S3 đá quý có một cú pháp khác nhau - thay thế hằng số của một lớp – Anatoly

+1

"my_folder" là một phần của tên Object, không phải Bucket – Anatoly

Trả lời

22

lẽ xô S3 đang cố gắng sử dụng nằm bên ngoài nước Mỹ-EAST (vị trí mặc định), vì vậy đây sẽ giúp bạn:

s3 = AWS::S3.new(
    :access_key_id => "KEY", 
    :secret_access_key => "SECRET" 
    :s3_endpoint => 's3-eu-west-1.amazonaws.com' 
) 

Chọn enpdpoint S3 của bạn từ following list:

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 

Về mặt đối tượng truy cập, tên nhóm là my_bucket, nhưng my_folder phải là một phần của đối tượng.

+2

: s3_host_name thay vì: s3_endpoint đã làm việc cho tôi. – laertiades

+0

http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region –

+0

Điều này làm việc cho tôi: 's3 = Aws :: S3 :: Client.new (điểm cuối: 'https: // s3-ap-southeast-1.amazonaws.com ') ' –

6

Bạn cần phải định cấu hình điểm cuối cụ thể theo khu vực của mình cho nhóm (vị trí được tạo). Bạn có thể làm điều này với:

AWS.config(:s3_endpoint => '...') 
s3 = AWS::S3.new 

hoặc

s3 = AWS::S3.new(:s3_endpoint => '...') 

Bạn có thể tránh điều này trong tương lai bằng cách sử dụng DNS tên xô comptible (cũng tránh dấu chấm trong tên xô). Nếu tên nhóm là tên miền phụ hợp lệ, thì bạn có thể xử lý nhóm của mình mà không cần định cấu hình điểm cuối cụ thể theo vùng. Hãy xem xét những điều sau:

http:://bucket-name.s3.amazonaws.com/path/to/object.txt 

Trường hợp thùng được đặt tên "tên nhóm" và khóa đối tượng là "đường dẫn/đến/object.txt". Nhóm này có thể tồn tại ở bất kỳ vùng nào và bạn có thể truy cập vào nhóm này bằng vùng "mặc định". Khi tên nhóm không tương thích với dns, thì url trông giống như:

http://s3.amazon.com/bucket/name/path/to/object.txt 

Trong ví dụ ở trên, nhóm là "thùng/tên", không tương thích với dns. Nó trở thành một phần của đường dẫn, và bây giờ s3.amazon.com phải được thay thế bằng điểm cuối cụ thể vùng (nếu thùng không được tạo trong vùng cổ điển).

Là người khác được đề cập, đường dẫn phải là một phần của khóa đối tượng chứ không phải là tên nhóm. Điều này cho phép bạn nhóm các đối tượng bằng một tiền tố chung. '/' Được sử dụng như một thư mục ảo (theo quy ước).

# 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 
1
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' 

làm việc cho tôi :)

1

Câu trả lời bởi Godsaur là cơ bản đúng. Tuy nhiên, nó có vẻ đã lỗi thời, có lẽ cho SDK phiên bản 1?

này làm việc cho tôi cho phiên bản 2:

s3 = Aws::S3::Client.new(endpoint:'https://s3-ap-southeast-1.amazonaws.com') 

Xem docs.

+0

điều này làm việc cho tôi chúc mừng! –

Các vấn đề liên quan