2012-10-16 11 views
11

Mam wiadro na Amazon S3 z folderem w nim. Próbuję uzyskać do niego dostęp w następujący sposób poprzez AWS-SDK gem:aws-sdk dla Ruby dostęp do folderu w wiadrze

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

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

otrzymuję następujący błąd w zamian:

Wiadro próbujesz dostępu musi być adresowane za pomocą określony punkt końcowy. Prześlij wszystkie przyszłe żądania do tego punktu końcowego.

Jakieś pomysły, co mogę robić źle?

+0

Możliwa repost http://stackoverflow.com/questions/6581502/problem-in-podawanie-bucket-of-my-aws-s3-konto – sgud

+0

@sgud to nie w porządku, podany link dotyczy AWS-S3 gem, który ma inną składnię - zamień stałą klasy – Anatoly

+1

"mój_folder" jest częścią nazwy obiektu, a nie Bucket – Anatoly

Odpowiedz

22

chyba wiadro S3 próbują wykorzystać znajduje się poza USA-wschodni (domyślna lokalizacja), więc to powinno pomóc:

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

Wybierz S3 enpdpoint z 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 

Pod względem dostępu do obiektu nazwa zasobnika to my_bucket, ale my_folder powinien być częścią obiektu.

+2

: s3_host_name zamiast: s3_endpoint pracował dla mnie. – laertiades

+0

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

+0

To działało dla mnie: 's3 = Aws :: S3 :: Client.new (punkt końcowy: 'https: // s3-ap-southeast-1.amazonaws.com) '' –

6

Musisz skonfigurować regionalny punkt końcowy dla wiadra (gdzie został utworzony). Można to zrobić za pomocą:

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

lub

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

można tego uniknąć w przyszłości za pomocą nazwy comptible kubełkowe DNS (także uniknąć kropek w nazwach kubełkowych). Jeśli nazwa zasobnika jest prawidłową subdomeną, możesz adresować swoje wiadro bez konfigurowania punktu końcowego określonego w regionie. Rozważmy następujący:

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

Jeżeli wiadro jest nazwany „wiadro-name” i klucz obiekt jest „ścieżka/do/object.txt”. To wiadro może istnieć w dowolnym regionie, ale możesz uzyskać do niego dostęp za pomocą "domyślnego" regionu. Gdy nazwa wiadro nie jest dns-kompatybilne, wówczas url wygląda następująco:

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

W powyższym przykładzie, wiadro to „wiadro/name”, który nie jest kompatybilny dns. Staje się częścią ścieżki, a teraz s3.amazon.com musi zostać zastąpiony przez regionalny punkt końcowy (jeśli wiadro nie zostało utworzone w klasycznym regionie).

Jak już wspomniano, ścieżki powinny być częścią klucza obiektu, a nie nazwy segmentu. Pozwala to grupować obiekty według wspólnego przedrostka. "/" Jest używane jako folder wirtualny (tylko konwencja).

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

pracował dla mnie :)

1

Odpowiedź przez Godsaur jest zasadniczo poprawny. Wydaje się jednak być przestarzała, być może dla SDK w wersji 1?

ten pracował dla mnie w wersji 2:

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

Zobacz docs.

+0

to działało dla mnie Twoje zdrowie! –

Powiązane problemy