Amazon S3 Boto-폴더를 생성하는 방법은 무엇입니까?


123

botoAmazon s3 용 라이브러리를 사용하여 버킷 아래에 폴더를 생성하려면 어떻게 해야합니까?

설명서에 따라 권한, 메타 데이터 등을 사용하여 키를 만들었지 만 boto 문서에서 버킷 아래에 폴더를 만드는 방법이나 버킷의 폴더 아래에 폴더를 만드는 방법을 설명하는 곳은 없습니다.


amazon s3에는 폴더의 개념이없는 것 같습니다. 일부는 "folder / test.txt '와 같은 이름으로 키를 생성하는 것이 좋습니다. firefox s3 플러그인을 사용하여 폴더를 생성하고 boto의 모든 키를 나열 해 보았습니다. 방금 만든 폴더 "<Key : vitoshares, everyone_ $ folder $>].이 폴더에서 콘텐츠를 보거나 추가 / 수정하려면 어떻게해야합니까?
vito huang

참고 : "폴더"생성을위한 AWS S3 관리 인터페이스 옵션은 S3FS와 호환되지 않습니다. 즉, 인터페이스를 사용하여 "폴더"를 생성하고 S3FS 탑재 지점을 통해 해당 폴더 목록을 가져 오십시오.
jldupont 2013

참고 2 : S3FS를 통한 "폴더"생성은 AWS S3 관리 인터페이스와 호환됩니다.
jldupont 2013

Boto로 이것을 수행하는 방법에 대한 예는 아래 @JaHax 답변을 참조하십시오. 쉬운!
e.thompsy

답변:


134

S3에는 폴더 또는 디렉토리 개념이 없습니다. 같은 "abc/xys/uvw/123.jpg"많은 S3 액세스 도구 S3Fox가 디렉터리 구조 처럼 표시 되는 파일 이름을 만들 수 있지만 실제로는 버킷에있는 단일 파일입니다.


1
답변 주셔서 감사합니다. 특정 폴더의 내용을 보려면 다른 불필요한 파일을 많이 탐색해야할까요?
vito huang

7
폴더에 대한 매우 잘 정의 된 개념이 있습니다. 대답이 잘못되었습니다. 아래 elranu 대답을 참조하십시오.
Boppity Bop 2014

19
@BoppityBop : 없다 폴더의 개념S3가 . S3에는 폴더가 없지만 관리 콘솔 과 많은 도구가 슬래시가있는 키를 나타냅니다. 폴더 작업을 참조 하고 "따라서 콘솔은 객체 키 이름을 사용하여 폴더와 계층을 표시합니다 . Amazon S3에는 버킷과 객체 만 있습니다. "
Antti Haapala 2014-08-04

7
기술적으로 폴더가 아닐 수도 있지만 확실히 폴더 지원이있는 것 같습니다. aws 콘솔에서 버킷을 볼 때 "Create Folder (폴더 생성)"를 클릭하면 폴더가 생성되고 비어있을 수 있으며 여기에서 메타 데이터를 가져올 수 있습니다.
phazei

4
S3는 거대한 사용자 지정 DynamoDB 키-값 스토어입니다. 일부 도구 (AWS 웹 콘솔 포함)는 디렉터리 트리를 모방하는 일부 기능을 제공하지만 애플리케이션이 파일 시스템과 동일하다고 가정하는 경우 S3로 작업하는 대신 S3에 대해 작업하게됩니다. 예를 들어 디렉토리로 보이는 이름을 변경하려면 키 스페이스를 스캔하고 해당 '디렉토리 이름'이 포함 된 모든 키를 수정해야합니다. 반면에 키-값 저장소이기 때문에 파일 시스템을 모방하는 데 필요한 '부모 디렉토리'를 만들거나 '빈 폴더'를 정리할 필요가 없습니다.
scooter-dangle

51

버킷에 abc / 123 / 폴더를 만들고 싶다고 가정 해 보겠습니다. Boto와 함께라면 케이크 조각입니다.

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

또는 콘솔 사용


7
이것은 정답입니다. Boto로 가능하며 이것이 당신이하는 방법입니다. 실제로 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

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 ​​라이브러리로 이것을 시도했습니다. 파일 이름이 비어있는 파일이있는 "폴더"를 생성합니다. 따라서 실제로 작동하지 않습니다. Mohammad Asgari의 솔루션은 잘 작동합니다!
니코

@Nico하지만 코드 주석에서 말한 것처럼 파일 이름을 "/"로 끝냈습니까?
elranu 2012

예, 슬래시를 추가했습니다. 나는 AWS :: S3 :: S3Object.store ( '테스트 /', '을', 'my_bucket') 한
니코

끝에 빈 문자열과 슬래시를 사용하여 "putObject"를 발행했습니다. tpyo / amazon-s3-php-class 라이브러리와 함께 PHP를 사용하고 있습니다.
MikeMurko 2013-01-13

2
@BoppityBop 네, 폴더 생성 버튼이 있습니다.하지만 아마 빈 파일도 만들 수 있습니다
jamylak dec.

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 : 자격 증명을 찾을 수 없습니다
Anvesh

1
어떤 방식 으로든 aws 자격 증명을 지정해야합니다. 이 체크 아웃 boto3.readthedocs.io/en/latest/guide/...
디팍 GM

감사! 이것은 나를 위해 아주 잘 작동했습니다
:)

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을 이름으로 사용하여 폴더를 만들고 있던 아래 코드를 볼 수 있습니다.

아래처럼 '/'로 키를 끝내는 것을 기억하십시오. 이것은 키 임을 나타냅니다.

키 = '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,
            키 : 폴더 이름 + "/"
        };
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.