폴더

이 페이지에서는 Cloud Storage의 폴더와 Cloud Storage 도구에서 어떻게 다른지 설명합니다.

개요

Cloud Storage는 단일 구조 네임스페이스로 작동합니다. 즉, 실제로 폴더가 Cloud Storage 내에 있지 않습니다. your-bucket 버킷에 folder1/file.txt라는 객체를 만들 때 객체 경로는 your-bucket/folder1/file.txt이지만, folder1이라는 폴더가 없습니다. 대신 folder1 문자열이 객체 이름의 일부입니다.

하지만 Cloud Console과 gsutil은 계층적 파일 트리의 일종을 제공합니다.

  • Cloud Console은 로컬 파일 브라우저와 유사하게 폴더를 시각적으로 표현합니다.

  • gsutil은 다양한 규칙을 사용하여 일반적인 명령줄 디렉터리 환경을 시뮬레이션합니다.

/storage/images/folders.svg

Cloud Console을 사용하여 빈 폴더를 만들면 Cloud Storage는 0바이트 객체를 자리표시자로 만듭니다. 예를 들어 my-bucket이라는 버킷에 folder라는 폴더를 만들면 gs://my-bucket/folder/라는 0바이트 객체가 생성됩니다. gsutil ls를 실행하면 이 객체를 찾을 수 있습니다.

도구

다음 탭을 클릭하여 각 도구가 폴더를 처리하는 방식을 확인합니다.

콘솔

Cloud Console에서 버킷에 빈 폴더를 만들거나 기존 폴더를 업로드할 수 있습니다.

기존 폴더를 업로드하면 폴더 이름이 폴더에 포함된 모든 객체의 경로에 포함됩니다. 모든 하위 폴더 및 하위 폴더에 포함된 객체도 업로드에 포함됩니다.

폴더를 만드는 방법은 다음과 같습니다.

  1. Google Cloud Console에서 Cloud Storage 브라우저 페이지로 이동합니다.

    브라우저로 이동

  2. 버킷으로 이동합니다.

  3. 폴더 만들기를 클릭하여 비어 있는 새 폴더를 만들거나 폴더 업로드를 클릭하여 기존 폴더를 업로드합니다.

gsutil

계층적 파일 트리를 갖춘 것 같은 효과를 내기 위해 gsutil은 다음 규칙을 적용하여 명령어의 대상 URL을 객체 이름으로 취급할지 또는 폴더로 취급할지 여부를 결정합니다.

  1. 대상 URL이 / 문자로 끝나면 gsutil은 대상 URL을 폴더로 처리합니다. 예를 들어 다음 명령어를 가정해 보겠습니다. 여기서 your-file은 파일 이름입니다.

    gsutil cp your-file gs://your-bucket/abc/

    결과적으로 gsutil은 gs://your-bucket/abc/your-file이라는 객체를 만듭니다.

  2. 소스 파일 여러 개를 대상 URL 한 개에 복사하면 gsutil은 대상 URL을 폴더로 처리합니다. 예를 들어 다음 명령어를 가정해 보겠습니다. 여기서 your-dirfile1file2와 같은 파일이 포함된 폴더입니다.

    gsutil cp -r your-dir gs://your-bucket/abc

    그 결과 gsutil은 gs://your-bucket/abc/your-dir/file1gs://your-bucket/abc/your-dir/file2 객체를 만듭니다.

  3. 위 규칙 중 어느 규칙도 적용되지 않으면 gsutil은 버킷의 객체를 검사하여 대상 URL이 객체 이름인지 폴더인지 확인합니다. 예를 들어 다음 명령어를 가정해 보겠습니다. 여기서 your-file은 파일 이름입니다.

    gsutil cp your-file gs://your-bucket/abc

    gsutil은 경로가 gs://your-bucket/abc/로 시작하는 버킷에 객체가 있는지 확인하기 위해 / 구분 기호와 프리픽스 abc를 사용하여 your-bucket에 대한 객체 나열 요청을 수행합니다. 이런 경우 gsutil은 gs://your-bucket/abc를 폴더 이름으로 취급하며 위의 명령어는 gs://your-bucket/abc/your-file 객체를 만듭니다. 그렇지 않으면 gsutil은 gs://your-bucket/abc 객체를 만듭니다.

gsutil의 규칙 기반 접근 방식은 폴더 존재를 표시하기 위해 0바이트 객체를 만드는 여러 도구의 작동 방식과 다릅니다. gsutil은 0바이트 객체 이름의 끝에 _$folder$을 추가하는 규칙과 같이 이러한 도구에서 사용되는 여러 규칙을 이해하지만 UNIX 명령어와 일관된 이름 지정 동작을 구현할 때 이러한 마커 객체를 필요로 하지 않습니다.

재시도 및 이름 지정

gsutil을 통해 자동 재시도를 사용 설정하면 첫 번째 시도에서 파일의 하위 집합만 복사하고 이후 시도에서 이미 존재하는 대상 폴더에 대한 문제와 객체의 이름이 잘못 지정되는 문제가 발생할 수 있습니다.

예를 들어 your-dir/ 아래에 dir1dir2와 같은 하위 폴더가 있고 두 하위 폴더에 abc 파일이 포함되어 있다고 가정해 보겠습니다.

gsutil cp -r ./your-dir gs://your-bucket/new

아직 gs://your-bucket/new가 없으면 gsutil은 첫 번째 성공적인 시도에서 다음 객체를 만듭니다.

gs://your-bucket/new/dir1/abc
gs://your-bucket/new/dir2/abc

다음 성공적인 시도에서 gsutil은 다음 객체를 만듭니다.

gs://your-bucket/new/your-dir/dir1/abc
gs://your-bucket/new/your-dir/dir2/abc

모든 시도에서 gsutil이 일관되게 작동하도록 하려면 다음을 시도해 보세요.

  1. 대상 URL 끝에 슬래시를 추가하여 gsutil에서 항상 폴더로 처리하도록 합니다.

  2. gsutil rsync을 사용합니다. rsync는 Unix cp 정의 폴더 이름 지정 규칙을 사용하지 않으므로 대상 하위 폴더 존재 여부에 관계없이 일관되게 작동합니다.

  3. gsutil rsync가 작동하지 않으면 자리표시자 객체를 만들어 대상이 폴더인지 확인합니다. 예를 들면 다음과 같습니다.

    gsutil cp some-file gs://your-bucket/new/placeholder

    자리표시자 객체가 있을 때 위의 gsutil cp -r 명령어를 실행하면 gs://your-bucket/new가 하나의 폴더로 취급됩니다. gs://your-bucket/new 아래에 객체가 최소 한 개 이상 있으면 자리표시자 객체를 삭제하고 업로드를 계속할 수 있습니다.

이름 구성 방법에 대한 자세한 내용은 gsutil help cp를 참조하세요.

기타 참고사항

  • gsutil을 사용하여 0바이트 객체를 만들어 빈 폴더를 모방할 수 없습니다

  • 스크립트를 사용하여 하위 경로를 결합하여 파일 경로를 만드는 경우 /는 객체 이름에 발생하는 문자이므로 gsutil은 gs://my-bucket/folder/gs://my-bucket//folder에 있는 다른 객체로 해석합니다.

가격 책정 고려사항

gsutil 이름 지정 방식의 단점은 클라우드에 대한 재귀적 복사와 같은 cp 또는 mv 명령어를 수행하기 전에 객체를 추가로 나열해야 한다는 것입니다. 하지만 이러한 나열은 구분 기호와 프리픽스 매개변수를 사용하여 결과 데이터를 제한하므로 상대적으로 비용이 많이 들지 않습니다. 또한 gsutil은 cp 또는 mv 명령어당 객체 나열 요청을 한 번만 수행하므로 전송된 모든 객체의 비용을 절약할 수 있습니다.

REST API

JSON API

폴더는 JSON API에 없지만 prefixdelimiter 쿼리 매개변수를 사용하여 나열하는 객체를 좁힐 수 있습니다.

예를 들어 프리픽스 folder/subfolder/가 있는 my-bucket 버킷의 모든 객체를 나열하려면 다음 URL을 사용하여 객체 나열 요청을 보냅니다.

"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"

XML API

폴더는 XML API에 없지만 prefixdelimiter 쿼리 매개변수를 사용하여 나열하는 객체를 좁힐 수 있습니다.

예를 들어 프리픽스 folder/subfolder/가 있는 my-bucket 버킷의 모든 객체를 나열하려면 다음 URL을 사용하여 객체 나열 요청을 보냅니다.

"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"