2012-10-16 8 views
11

Amazon S3にバケットがあり、そこにフォルダがあります。私はお返しに、次のエラーを取得していますaws-sdkバケット内のRubyアクセスフォルダ

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

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

アクセスしようとしているバケットを使用して対処しなければならない私は、AWS-SDK宝石を経由して、それを次のようにアクセスしようとしています指定されたエンドポイント将来のすべてのリクエストをこのエンドポイントに送信してください。

私が間違っていると思われるアイデアはありますか?

+0

可能な投稿http://stackoverflow.com/questions/6581502/problem-in-accessing-bucket-of-my-aws-s3-account – sgud

+0

@sgudあなたが提供したリンクはAWS-S3ですクラスの定数を置き換えます。 – Anatoly

+1

"my_folder"はオブジェクト名の一部です。バケット – Anatoly

答えて

22

はおそらくS3バケットを使用しようとしている米国-EAST(デフォルトの場所)の外側に配置され、これはあなたを助ける必要があります。

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

following listからあなた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はオブジェクトの一部である必要があります。

+2

:s3_hostpointの代わりにs3_host_nameが私のために働いています。 – laertiades

+0

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

+0

これは私のために働いた: 's3 = Aws :: S3 :: Client.new(エンドポイント: 'https:// ' –

6

バケット(作成されたバケット)の地域固有のエンドポイントを設定する必要があります。あなたは(また、バケット名にドットを避けるため)DNS comptibleバケット名を使用することにより、将来的にこれを避けることができ

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

または

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

:あなたがこれを行うことができます。バケット名が有効なサブドメインである場合は、リージョン固有のエンドポイントを設定せずにバケットを指定できます。次のことを考えてみましょう:

バケットは「バケット名」という名前とオブジェクトキーは「/ object.txtへのパス/」です
http:://bucket-name.s3.amazonaws.com/path/to/object.txt 

。このバケットはどの地域にも存在する可能性がありますが、「デフォルト」領域を使用してアクセスできます。バケット名は、DNSに対応していない場合は、URLは次のようになり、その後、上記の例では

​​

、バケットは、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 
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' 

私のために働いた:)

1

をGodsaurによって答えは基本的に正しいです。しかし、おそらくSDKバージョン1では古くなっているようです。

これは、バージョン2のために私のために働い:

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

docsを参照してください。

+0

これは私のために働いた乾杯! –

関連する問題