GCP Cloud Storage

Location type : Regional vs Multi-Region. 여러 개의 리전 지원 vs CDN 무엇이 좋은가? -> Regional 로 하면 됨. CDN 구성 필요. 

Classes : Standard 사용. Nearline, Coldline, Archive 는 향후 고려하면 될 듯. -> 기준 만들어야. 버켓. -> 문서 보관 정책 확인 한 후.

Cloud Storage 구성하기

https://cloud.google.com/storage/docs/quickstart-console?hl=ko

https://cloud.google.com/storage/docs/quickstart-gsutil?hl=ko

 

 

버킷 이름 지정 https://cloud.google.com/storage/docs/naming-buckets

버킷 이름은 단일 Cloud Storage 네임스페이스에 있습니다. 모든 버킷 이름은 고유해야 합니다. → 버킷 이름이 GCP에서는 고유한 이름이며 모두 달라야 함.

 

만약에 버킷에 커스텀 도메인을 지정하고 싶다면 아래 절차를 거쳐야함.

[HTTP]

  1. 도메인 소유권 확인

    1. https://cloud.google.com/storage/docs/domain-name-verification#verification

  2. 웹마스터 센터로 이동해 도메인 소유자 추가

    1. 인증된 도메인 이름으로 버킷을 만들기 위해서는 도메인 소유자가 되어야 함.

    2. 도메인 소유자는 서비스 계정도 가능

    3. 여러명 추가 가능

  3. 해당 도메인을 이름으로 해서 버킷 생성

  4. DNS에 CNAME 설정 (xxx.example.comc.storage.googleapis.com. )

만약에 CNAME을 설정하지 않으면

이런식으로 접근해야한다. (도메인 설정의 의미가 없어진다.)

위 내용들은 아래 문서 참고하면 됨.

 

[HTTPS]

  1. 버킷 생성 (도메인 이름으로 하지 않아도 됨.)

  2. 로드밸런서 연결

도메인은 로드밸런서로 연결하기 때문에 버킷은 자유롭게 만들어도 된다.

위 내용은 아래 문서를 참고하면 됨.

 

만약에 커스텀 도메인을 HTTP로만 사용한다고 하면 심플하게 [HTTP] 방법을 사용하면 되지만 HTTPS도 사용한다고 하면 로드밸런서로 http https를 전부 구성하면 되기 때문에 https 사용여부에 따라 구성을 다르게 하면 됨. 즉, https를 사용한다고 하면 [HTTP]방법은 사용할 필요가 없음.

 

gsutil 정보 https://cloud.google.com/storage/docs/gsutil

gsutil을 사용하여 작업 수행에 대한 가이드의 전체 목록은 Cloud Storage 안내 가이드를 참조

  • 버킷 생성 및 삭제

  • 객체 업로드, 다운로드, 삭제

  • 버킷 및 객체 나열

  • 객체 이동, 복사 및 이름 바꾸기

  • 객체 및 버킷 ACL 수정

bucket 만들기

https://cloud.google.com/storage/docs/creating-buckets#storage-create-bucket-gsutil

https://cloud.google.com/storage/docs/gsutil/commands/mb

버킷 생성을 더욱 세밀하게 제어하려면 다음 선택적 플래그를 설정합니다.

  • -p: 버킷을 연결할 프로젝트 ID 또는 프로젝트 번호를 지정합니다. my-project

  • -c: 버킷의 기본 스토리지 클래스를 지정합니다. 예를 들면 NEARLINE입니다. (기본은 Standard)

  • -l: 버킷의 위치를 지정합니다. 예를 들면 US-EAST1입니다. (default location US)

  • -b: 버킷에 균일한 버킷 수준 액세스를 사용 설정합니다. (on/off)

  • --pap : 공개 액세스 방지 적용. 기본값은 unspecified. 공개 엑세스 방지 적용을 한 상태에서 객체를 공개적으로 액세스 가능하도록 설정하려면 이 옵션을 바꾸어 주어야 함.

버킷 생성부터 삭제까지 예제

gcloud config set project sample-dev REGION="asia-northeast3" BUCKET_NAME="sample-gw-attachment-dev" # bucket 만들기 gsutil mb -b on -c standard -l $REGION --pap enforced gs://$BUCKET_NAME/ # 예제 파일 다운로드 curl https://cloud.google.com/storage/images/kitten.png -o kitten.png # 버킷에 객체 업로드 gsutil cp kitten.png gs://$BUCKET_NAME # 버킷에서 객체 다운로드 gsutil cp gs://$BUCKET_NAME/kitten.png /tmp/kitten2.png # 버킷의 폴더에 객체 복사 gsutil cp gs://$BUCKET_NAME/kitten.png gs://$BUCKET_NAME/just-a-folder/kitten3.png gsutil ls gs://$BUCKET_NAME gsutil ls -l gs://$BUCKET_NAME/kitten.png # 객체를 공개적으로 액세스 가능하도록 설정한 후 다시 액세스 권한 삭제 gsutil iam ch allUsers:objectViewer gs://$BUCKET_NAME curl https://storage.googleapis.com/$BUCKET_NAME/kitten.png -o /tmp/test.png rm -v /tmp/test.png #gsutil iam ch -d allUsers:objectViewer gs://$BUCKET_NAME # 특정 사용자에게 버킷 액세스 권한 부여 gsutil iam ch user:jane@gmail.com:objectCreator,objectViewer gs://$BUCKET_NAME # 객체 삭제 gsutil rm gs://$BUCKET_NAME/kitten.png # bucket 삭제 gsutil rm -r gs://$BUCKET_NAME

공개 액세스 방지 적용 옵션을 적용한 경우 객체를 공개적으로 액세스 가능하도록 설정 할 때 에러가 남. 이경우에는 해당 옵션을 unspecified 로 바꾸어 주면 됨. https://cloud.google.com/storage/docs/using-public-access-prevention#gcloud_2

$ gsutil pap get gs://$BUCKET_NAME gs://sample-gw-attachment-dev: enforced $ gsutil pap set unspecified gs://$BUCKET_NAME $ gsutil pap get gs://$BUCKET_NAME gs://sample-gw-attachment-dev: unspecified

액세스 제어

https://cloud.google.com/storage/docs/access-control

균일한 액세스 또는 세분화된 액세스 사용 권한 적용 여부를 결정해야 합니다.

균일한 액세스를 권장을 함. 세분화된 액세스 사용 권한을 쓰는 경우는 단일 버킷에 객체별로 설정을 다르게 하는 경우이며 관리가 더 힘들어짐. https://cloud.google.com/storage/docs/access-control#recommended_bucket_architecture 그림을 보면 쉽게 이해갈 수 있음.

  • 균일한 액세스 제어(권장)균일한 버킷 수준 액세스를 사용하면 ID 및 액세스 관리(IAM)만 사용하여 권한을 관리할 수 있습니다. IAM은 일반 이름 프리픽스가 있는 객체 그룹 또는 버킷에 포함된 모든 객체에 권한을 적용합니다. IAM은 IAM 조건 및 Cloud 감사 로그와 같이 ACL 작업 시 사용할 수 없는 기능을 사용할 수도 있습니다.

  • 세분화된 액세스 제어: 세분화된 옵션을 사용하면 IAM과 액세스 제어 목록(ACL)을 함께 사용하여 권한을 관리할 수 있습니다. ACL은 Amazon S3와의 상호 운용성을 위해 설계된 Cloud Storage의 기존 액세스 제어 시스템입니다. 버킷 수준과 개별 객체별로 액세스 권한을 지정하고 권한을 적용할 수 있습니다.

IAM 권한 사용 https://cloud.google.com/storage/docs/access-control/using-iam-permissions

역할

설명

권한

역할

설명

권한

roles/storage.objectCreator

  • 객체 생성 가능

  • 객체 보기, 삭제, 교체 권한은 없음

resourcemanager.projects.get
resourcemanager.projects.list
storage.objects.create
storage.multipartUploads.create
storage.multipartUploads.abort
storage.multipartUploads.listParts

roles/storage.objectViewer

  • 객체 메타데이터 보기 가능

  • 버킷 객체 나열 가능

resourcemanager.projects.get
resourcemanager.projects.list
storage.objects.get
storage.objects.list

roles/storage.objectAdmin

  • 객체 나열, 생성, 보기, 삭제 등 객체 전체에 대한 권한

  • 버킷 관리 권한은 없음

resourcemanager.projects.get
resourcemanager.projects.list
storage.objects.*
storage.multipartUploads.create
storage.multipartUploads.abort
storage.multipartUploads.listParts

roles/storage.hmacKeyAdmin

  • 프로젝트 HMAC 키 관리에 대한 전체권한 부여

  • 프로젝트에만 적용 가능한 권한

storage.hmacKeys.*

roles/storage.admin

  • 객체와 버킷에 대한 전체 권한

  • 개별 버킷에 적용하면 해당 버킷과 객체만 관리 가능

firebase.projects.get
resourcemanager.projects.get
resourcemanager.projects.list
storage.buckets.*
storage.objects.*
storage.multipartUploads.*

개별 버킷에만 부여 가능한 Legacy 역할도 존재함.

https://cloud.google.com/storage/docs/access-control/iam-roles#legacy-roles

WEB이나 App등에 정적 컨텐츠를 출력하고 싶은 경우 모든 사용자에 대한 공개 액세스를 허용해주어야 한다. WEB이나 App등에 표시되는 컨텐츠들은 서버에서 컨텐츠에 접근하는 것이 아니라 URL만 전달해주고 실제 접근은 사용자가 하게 된다.