Amazon S3 Boto-フォルダーを作成する方法?


123

botoAmazon s3のライブラリを使用してバケットの下にフォルダーを作成するにはどうすればよいですか?

私はマニュアルに従って、権限、メタデータなどでキーを作成しましたが、botoのドキュメントのどこにも、バケットの下にフォルダーを作成する方法、またはバケット内のフォルダーの下にフォルダーを作成する方法が記載されていません。


アマゾンs3にはフォルダーの概念がないようです。回避するには、「folder / test.txt」のような名前のキーを作成することをお勧めします。firefoxs3プラグインを使用してフォルダーを作成し、botoにすべてのキーをリストすると、出力されます"<Key:vitoshares、everyone_ $ folder $>]"として作成したフォルダーです。このフォルダーに対してコンテンツを表示/追加/変更するにはどうすればよいですか?
vito huang

注:「フォルダー」を作成するためのAWS S3管理インターフェースオプションはS3FSと互換性がありません。つまり、インターフェースを使用して「フォルダー」を作成し、S3FSマウントポイントを介して上記のフォルダーのリストを取得します。
jldupont 2013

注2:S3FSを介して「フォルダー」を作成することは、AWS S3管理インターフェイスと互換性があります。
jldupont 2013

Botoでこれを行う方法の例については、以下の@JaHax回答を参照してください。かんたん!
e.thompsy 2015年

回答:


134

S3にはフォルダーやディレクトリの概念はありません。のようなファイル名を作成できます"abc/xys/uvw/123.jpg"。これは、多くのS3アクセスツールS3Foxがディレクトリ構造のように表示するものですが、実際にはバケット内の単一のファイルです。


1
答えてくれてありがとう、特定のフォルダの内容を確認したい場合は、他の多くの不要なファイルを走査する必要がありますか?
vito huang

7
フォルダの概念は非常に明確に定義されています。答えは正しくありません。以下のelranuの答えを参照してください。
Boppity Bop 2014

19
@BoppityBop:ありませんフォルダの概念S3が。S3にはフォルダーがありませんが、管理コンソールと多くのツールはキーをスラッシュで表しています。「フォルダーの操作」を 参照して、「コンソールはオブジェクトキー名を使用してフォルダーと階層を提示します
。AmazonS3

7
厳密にはフォルダーではないかもしれませんが、フォルダーのサポートは確かにあるようです。awsコンソールでバケットを確認するときに[フォルダを作成]をクリックするとフォルダが作成され、空にしてメタデータをプルすることができます。
phazei

4
S3は、巨大なカスタムDynamoDB Key-Valueストアです。一部のツール(AWSウェブコンソールを含む)は、ディレクトリツリーを模倣するいくつかの機能を提供しますが、アプリケーションがファイルシステムと同等であると想定している場合は、S3に対して作業するのではなく、S3に対して作業します。たとえば、ディレクトリのように見えるものの名​​前を変更するには、キースペースをスキャンして、問題の「ディレクトリ名」を含むすべてのキーを変更する必要があります。一方、キーと値のストアされ、「親ディレクトリ」を作成したり、ファイルシステムを模倣することが必要となる「空のフォルダを」、クリーニングのための必要はありません
スクーター-ダングル

51

バケットにabc / 123 /フォルダーを作成したいとします。これはBotoのケーキです

k = bucket.new_key('abc/123/')
k.set_contents_from_string('')

またはコンソールを使用する


7
これが正解です。それはボトで可能であり、これはあなたがそれを行う方法です。実際にnew_key()必要なのはこれだけです。関数に送信される文字列は、abc/123/またはabc/123/newfile.txtです。あなたが好むものは何でも。このようにして欲しいものを取得しようとした後、これをifステートメントでラップします。key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)基本的に、そこにない場合は作成します。
e.thompsy 2015年

1
最新のAPIでは、bucket.key( 'abc / 123 /')でも同じ結果が得られます。
light94

ディレクトリキーの指定は、マルチパートアップロードでの ファイルのアップロードにも使用できますmp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138

20

AWS SDK .Netは完全に機能します。フォルダー名の文字列の最後に「/」を追加するだけです。

var folderKey =  folderName + "/"; //end the folder name with "/"
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretKey);
var request = new PutObjectRequest();
request.WithBucketName(AWSBucket);
request.WithKey(folderKey);
request.WithContentBody(string.Empty);
S3Response response = client.PutObject(request);

次にAWSコンソールを更新すると、フォルダーが表示されます


AWS :: S3 ruby​​ライブラリでこれを試してみました。空白のファイル名を含むファイルを含む「フォルダ」を作成します。そのため、実際には機能しません。モハマドアスガリの解決策はうまくいきますが!
ニコ

@Nicoですが、コードのコメントにあるように、ファイル名を「/」で終了しましたか?
elranu

はい、スラッシュを追加しました。AWS :: S3 :: S3Object.store( 'test /'、 ''、 'my_bucket')を実行しました
Nico

空の文字列と最後にスラッシュを使用して「putObject」を発行するとうまくいきました。私はtpyo / amazon-s3-php-classライブラリでPHPを使用しています。
MikeMurko 2013年

2
@BoppityBopはい、フォルダの作成ボタンがありますが、おそらくそれだけで何らかの空のファイルも作成されます
jamylak

15

これを使って:

import boto3
s3 = boto3.client('s3')
bucket_name = "YOUR-BUCKET-NAME"
directory_name = "DIRECTORY/THAT/YOU/WANT/TO/CREATE" #it's name of your folders
s3.put_object(Bucket=bucket_name, Key=(directory_name+'/'))

助けてくれてありがとう、エラーが発生しました。.botocore.exceptions.NoCredentialsError:資格情報が
見つかり

1
何らかの方法でaws資格情報を指定する必要があります。このアウトをチェックしてください: boto3.readthedocs.io/en/latest/guide/...
ディーパックGM

ありがとう!これは私にとって非常にうまくいきました:)
igorkf

7

フォルダ名に「_ $ folder $」を追加して、putを呼び出します。

    String extension = "_$folder$";
    s3.putObject("MyBucket", "MyFolder"+ extension, new ByteArrayInputStream(new byte[0]), null);

参照してください:http : //www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/


このフォルダー作成方法は機能しなくなりました。@TomNgの提案する方法を試してください
radalin

4

フォルダを作成するのは本当に簡単です。実際には、キーを作成するだけです。

以下のコードを見ると、名前にutc_timeを使用してフォルダを作成していたことがわかります。

以下ようにキーを「/」で終了することを忘れないでください。これはキーであることを示します。

Key = 'folder1 /' + utc_time + '/'

client = boto3.client('s3')
utc_timestamp = time.time()


def lambda_handler(event, context):

    UTC_FORMAT = '%Y%m%d'
    utc_time = datetime.datetime.utcfromtimestamp(utc_timestamp)
    utc_time = utc_time.strftime(UTC_FORMAT)
    print 'start to create folder for => ' + utc_time

    putResponse = client.put_object(Bucket='mybucketName',
                                    Key='folder1/' + utc_time + '/')

    print putResponse

4

2019年の更新。パスbucket_name / folder1 / folder2のフォルダーを作成する場合は、次のコードを使用できます。

from boto3 import client, resource

class S3Helper:

  def __init__(self):
      self.client = client("s3")
      self.s3 = resource('s3')

  def create_folder(self, path):
      path_arr = path.rstrip("/").split("/")
      if len(path_arr) == 1:
          return self.client.create_bucket(Bucket=path_arr[0])
      parent = path_arr[0]
      bucket = self.s3.Bucket(parent)
      status = bucket.put_object(Key="/".join(path_arr[1:]) + "/")
      return status

s3 = S3Helper()
s3.create_folder("bucket_name/folder1/folder2)

1

ただし、folder_nameに「/」を追加することでフォルダーを作成できます。内部では、S3は通常のNFSとは異なり、フラットな構造を維持します。

var params = {
            バケット:bucketName、
            キー:folderName + "/"
        };
s3.putObject(params、function(err、data){});

1

上記の多くの方法を試して/、キー名の最後にスラッシュを追加すると、ディレクトリを作成できませんでした:

client.put_object(Bucket="foo-bucket", Key="test-folder/")

あなたは提供する必要がありBody、ディレクトリを作成するためにパラメータを:

client.put_object(Bucket='foo-bucket',Body='', Key='test-folder/')

出典:boto3号のryantuck


0

S3にはフォルダー構造はありませんが、キーと呼ばれるものがあります。

作成でき/2013/11/xyz.xls、コンソールにフォルダとして表示されます。しかし、S3のストレージ部分は、それをファイル名として受け取ります。

取得する場合でも、ListObjectsメソッドとPrefixパラメータを使用して、特定のフォルダ(またはキー)内のファイルを表示できることがわかります。


0

どうやら、S3でフォルダーを作成できるようになりました。いつかはわかりませんが、「標準」ゾーンにバケットがあり、[アクション]ドロップダウンから[フォルダーの作成]を選択できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.