Cloud Storage 읽기 및 쓰기

이 문서에서는 Cloud Storage 클라이언트 라이브러리를 사용하여 데이터를 저장 및 검색하는 방법을 설명합니다. 여기서는 Cloud Storage 설정에 설명된 작업을 완료하여 Cloud Storage 버킷을 활성화하고 클라이언트 라이브러리를 다운로드했다고 가정합니다. 또한 App Engine 애플리케이션을 빌드하는 방법을 알고 있다고 가정합니다.

추가 코드 샘플은 Cloud Storage 클라이언트 라이브러리를 참조하세요.

필수 가져오기

App Engine 및 Cloud Storage에 필요한 파일의 가져오기 항목은 다음과 같습니다.

  • google.golang.org/appengine,
  • google.golang.org/appengine/file
  • cloud.google.com/go/storage

위 항목의 예시는 다음 스니펫에 나와 있습니다.

import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"strings"

	"cloud.google.com/go/storage"
	"golang.org/x/net/context"
	"google.golang.org/api/iterator"
	"google.golang.org/appengine"
	"google.golang.org/appengine/file"
	"google.golang.org/appengine/log"
)

Cloud Storage 버킷 지정

Cloud Storage 작업을 실행하려면 먼저 버킷 이름을 제공해야 합니다. 가장 쉬운 방법은 프로젝트의 기본 버킷을 사용하는 것이며, 다음 스니펫에 표시된 대로 App Engine 컨텍스트에서 획득할 수 있습니다.

// Use `dev_appserver.py --default_gcs_bucket_name GCS_BUCKET_NAME`
// when running locally.
bucket, err := file.DefaultBucketName(ctx)
if err != nil {
	log.Errorf(ctx, "failed to get default GCS bucket name: %v", err)
}

Cloud Storage에 쓰기

Cloud Storage에 파일을 쓰려면 다음을 실행합니다.

// createFile creates a file in Google Cloud Storage.
func (d *demo) createFile(fileName string) {
	fmt.Fprintf(d.w, "Creating file /%v/%v\n", d.bucketName, fileName)

	wc := d.bucket.Object(fileName).NewWriter(d.ctx)
	wc.ContentType = "text/plain"
	wc.Metadata = map[string]string{
		"x-goog-meta-foo": "foo",
		"x-goog-meta-bar": "bar",
	}
	d.cleanUp = append(d.cleanUp, fileName)

	if _, err := wc.Write([]byte("abcde\n")); err != nil {
		d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
	if _, err := wc.Write([]byte(strings.Repeat("f", 1024*4) + "\n")); err != nil {
		d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
	if err := wc.Close(); err != nil {
		d.errorf("createFile: unable to close bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
}

파일이 생성되면 샘플은 Cloud Storage 헤더(x-goog-meta-foox-goog-meta-bar)를 지정합니다. 이 선택적 코드는 다음에 적용 가능한 Cloud Storage 헤더 사용에 대한 개념을 소개합니다.

  • 요청 동작에 영향을 줍니다.
  • 버킷에서 기본값과 다른 파일에 대한 액세스 권한을 지정합니다(x-goog-acl 참조).
  • 파일 메타데이터를 씁니다.

위의 x-goog-meta-* 헤더는 개발자가 설정할 수 있는 커스텀 파일 메타데이터이며 항상 파일과 함께 반환됩니다. 커스텀 헤더 및 이 헤더 데이터에 사용할 수 있는 공간은 몇 KB로 제한되므로 주의해서 사용해야 합니다.

코드 샘플에서는 x-goog-acl을 설정하지 않으므로 객체가 버킷에 기록될 때 기본 Cloud Storage ACL의 공개 읽기가 객체에 적용됩니다.

마지막으로 쓰기를 마친 후에 파일을 Close()하기 위한 호출을 확인합니다. 그렇지 않으면 파일이 Cloud Storage에 기록되지 않습니다. Close()를 호출한 후에는 파일에 아무 것도 추가할 수 없습니다.

Cloud Storage에서 읽기

Cloud Storage에서 파일을 읽으려면 다음을 실행합니다.

// readFile reads the named file in Google Cloud Storage.
func (d *demo) readFile(fileName string) {
	io.WriteString(d.w, "\nAbbreviated file content (first line and last 1K):\n")

	rc, err := d.bucket.Object(fileName).NewReader(d.ctx)
	if err != nil {
		d.errorf("readFile: unable to open file from bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
	defer rc.Close()
	slurp, err := ioutil.ReadAll(rc)
	if err != nil {
		d.errorf("readFile: unable to read data from bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}

	fmt.Fprintf(d.w, "%s\n", bytes.SplitN(slurp, []byte("\n"), 2)[0])
	if len(slurp) > 1024 {
		fmt.Fprintf(d.w, "...%s\n", slurp[len(slurp)-1024:])
	} else {
		fmt.Fprintf(d.w, "%s\n", slurp)
	}
}

버킷 콘텐츠 나열

이 샘플 코드는 버킷 콘텐츠를 나열하는 방법을 보여줍니다.

// listBucket lists the contents of a bucket in Google Cloud Storage.
func (d *demo) listBucket() {
	io.WriteString(d.w, "\nListbucket result:\n")

	query := &storage.Query{Prefix: "foo"}
	it := d.bucket.Objects(d.ctx, query)
	for {
		obj, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			d.errorf("listBucket: unable to list bucket %q: %v", d.bucketName, err)
			return
		}
		d.dumpStats(obj)
	}
}

Cloud Storage의 파일 삭제

아래 코드는 ObjectHandle.delete() 메서드를 사용하여 Cloud Storage에서 파일을 삭제하는 방법을 보여줍니다.


// deleteFiles deletes all the temporary files from a bucket created by this demo.
func (d *demo) deleteFiles() {
	io.WriteString(d.w, "\nDeleting files...\n")
	for _, v := range d.cleanUp {
		fmt.Fprintf(d.w, "Deleting file %v\n", v)
		if err := d.bucket.Object(v).Delete(d.ctx); err != nil {
			d.errorf("deleteFiles: unable to delete bucket %q, file %q: %v", d.bucketName, v, err)
			return
		}
	}
}

이 예는 Cloud Storage에 쓰기 섹션의 버킷에 기록된 파일을 정리합니다.

다음 단계