Boto 클라이언트 라이브러리 플러그인

이 가이드에서는 XML API를 사용하여 기본적인 Cloud Storage 작업을 수행하는 간단한 Python 프로그램을 작성하는 방법을 보여줍니다. 이 문서를 제대로 활용하려면 Console 빠른 시작에 설명된 Python 및 Cloud Storage 개념과 작업에 익숙해야 합니다.

Cloud Storage 클라이언트 라이브러리를 대신 사용해야 하나요?

대개 Cloud Storage 버킷 및 객체 작업을 하려면 Python용 Google Cloud 클라이언트 라이브러리를 사용해야 합니다. Cloud Storage 클라이언트 라이브러리는 더 높은 유연성을 제공하며 Cloud Storage 가이드의 코드 샘플은 Cloud Storage 클라이언트 라이브러리를 사용합니다. 특히 XML API 및 boto 라이브러리를 통해 Cloud Storage와 상호작용하려는 경우 이 가이드를 사용하세요.

환경 설정

이 가이드를 시작하기 전에 다음을 수행해야 합니다.

  1. 컴퓨터에 gsutil의 독립 실행형 버전을 설치합니다.

  2. boto 라이브러리와 gcs-oauth2-boto-plugin을 설치합니다.

    boto는 Cloud Storage의 인터페이스로 사용되는 오픈소스 Python 라이브러리입니다. gcs-oauth2-boto-plugin은 boto auth plugin 프레임워크의 인증 플러그인로서, Cloud Storage와 함께 사용할 수 있는 OAuth 2.0 사용자 인증 정보를 제공합니다.

    boto 라이브러리와 oauth2 플러그인을 사용하기 위한 설정은 사용 중인 시스템에 따라 다릅니다. 아래의 설정 예시를 지침으로 사용하세요. 다음 명령어는 pip를 설치한 다음 pip를 사용하여 다른 패키지를 설치합니다. 마지막 3개 명령어는 설치 확인을 위해 두 모듈의 가져오기 테스트를 보여줍니다.

    Debian 및 Ubuntu

    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install gcc python-dev python-setuptools libffi-dev libssl-dev
    sudo pip install virtualenv
    virtualenv venv
    source ./venv/bin/activate
    (venv)pip install gcs-oauth2-boto-plugin
    (venv)python
    >>>import boto
    >>>import gcs_oauth2_boto_plugin

    CentOS, RHEL, Fedora

    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    sudo yum install gcc openssl-devel python-devel python-setuptools libffi-devel
    sudo pip install virtualenv
    virtualenv venv
    source ./venv/bin/activate
    (venv)pip install gcs-oauth2-boto-plugin
    (venv)python
    >>>import boto
    >>>import gcs_oauth2_boto_plugin
  3. OAuth2.0을 사용하도록 boto 구성 파일을 설정합니다.

    서비스 계정 또는 사용자 계정 사용자 인증 정보를 사용하도록 boto 구성 파일을 구성할 수 있습니다. 서비스 계정 사용자 인증 정보는 서비스 또는 애플리케이션을 대신하여 인증할 때 기본적으로 사용되는 사용자 인증 정보 유형입니다. 사용자 계정 사용자 인증 정보는 특정 사용자(예: 사람)를 대신하여 요청을 인증할 때 기본적으로 사용되는 사용자 인증 정보 유형입니다. 이 두 사용자 인증 정보 유형에 대한 자세한 내용은 지원되는 사용자 인증 정보 유형을 참조하세요.

    서비스 계정

    서비스 계정 인증 정보를 사용하는 방법은 다음과 같습니다.

    1. 기존 서비스 계정을 사용하거나 새 계정을 만들고 연결된 비공개 키를 다운로드합니다. 기본적으로 키를 .json 파일로 다운로드하는 것이 좋지만 .p12 형식도 사용할 수 있습니다.

    2. .boto 파일을 서비스 계정으로 구성합니다. gsutil로 이 작업을 수행할 수 있습니다.

      gsutil config -e

      이 명령어를 서비스 계정 이메일 주소 및 서비스 계정 비공개 키(.json 또는 .p12)의 위치를 묻는 메시지가 표시됩니다. gsutil 명령어를 실행하는 컴퓨터에 비공개 키가 있어야 합니다.

    사용자 계정

    사용자 계정 인증 정보를 사용하는 방법은 다음과 같습니다.

    1. 아직 .boto 파일이 없으면 하나 만듭니다. gsutil로 이 작업을 수행할 수 있습니다.

      gsutil config
    2. 애플리케이션의 기존 클라이언트 ID를 사용하거나 새로 만듭니다.

    3. .boto 파일을 수정합니다. [OAuth2] 섹션에서 client_idclient_secret 값을 앞에서 만든 값으로 지정합니다.

    4. gsutil config 명령어를 다시 실행하여 입력한 클라이언트 ID와 클라이언트 보안 비밀번호를 기반으로 새로고침 토큰을 생성합니다.

      .boto를 백업 할 수 없다는 오류 메시지가 나타나면 백업 구성 파일 .boto.bak를 삭제하거나 이름을 바꿉니다.

    5. 새로고침 토큰 대체 로직을 구성합니다.

      gcs-oauth2-boto-plugin에는 애플리케이션 사용자 인증 정보 사용 시 인증 토큰을 생성하기 위한 대체 로직이 필요합니다. 서비스 계정을 사용할 때는 대체 로직이 필요하지 않습니다.

      대체를 사용 설정하기 위한 다음과 같은 옵션이 있습니다.

      • .boto구성 파일에서 client_idclient_secret을 설정합니다. 권장 옵션이지만 새 .boto 구성 파일과 함께 gsutil을 사용하려는 경우 필수입니다.

      • OAUTH2_CLIENT_IDOAUTH2_CLIENT_SECRET 환경 변수를 설정합니다.

      • 아래 예시와 같이 SetFallbackClientIdAndSecret 함수를 사용합니다.

Cloud Storage 작업

Python 소스 파일 설정하기

이 가이드를 시작하려면 원하는 텍스트 편집기를 사용하여 새 Python 파일을 만듭니다. 그리고 다음 지시문, 가져오기 문, 구성, 상수 할당을 추가합니다.

이 코드에서는 새로고침 토큰을 생성하기 위한 대체 로직으로 SetFallbackClientIdAndSecret 함수를 사용합니다. 대체 로직을 지정하는 다른 방법은 환경 설정을 참조하세요. 서비스 계정을 사용하여 인증하는 경우 대체 로직을 포함할 필요가 없습니다.

#!/usr/bin/python

import boto
import gcs_oauth2_boto_plugin
import os
import shutil
import StringIO
import tempfile
import time

# URI scheme for Cloud Storage.
GOOGLE_STORAGE = 'gs'
# URI scheme for accessing local files.
LOCAL_FILE = 'file'

# Fallback logic. In https://console.cloud.google.com/
# under Credentials, create a new client ID for an installed application.
# Required only if you have not configured client ID/secret in
# the .boto file or as environment variables.
CLIENT_ID = 'your client id'
CLIENT_SECRET = 'your client secret'
gcs_oauth2_boto_plugin.SetFallbackClientIdAndSecret(CLIENT_ID, CLIENT_SECRET)

버킷 만들기

다음 코드는 2개의 버킷을 만듭니다. 버킷 이름은 전역적으로 고유해야 하기 때문에(이름 지정 가이드라인 참조) 이를 위해 타임스탬프가 각 버킷 이름에 추가됩니다.

버킷 이름이 이미 사용 중인 경우 고유한 버킷 이름을 생성하도록 코드를 수정해야 합니다.

now = time.time()
CATS_BUCKET = 'cats-%d' % now
DOGS_BUCKET = 'dogs-%d' % now

# Your project ID can be found at https://console.cloud.google.com/
# If there is no domain for your project, then project_id = 'YOUR_PROJECT'
project_id = 'YOUR_DOMAIN:YOUR_PROJECT'

for name in (CATS_BUCKET, DOGS_BUCKET):
  # Instantiate a BucketStorageUri object.
  uri = boto.storage_uri(name, GOOGLE_STORAGE)
  # Try to create the bucket.
  try:
    # If the default project is defined,
    # you do not need the headers.
    # Just call: uri.create_bucket()
    header_values = {"x-goog-project-id": project_id}
    uri.create_bucket(headers=header_values)

    print 'Successfully created bucket "%s"' % name
  except boto.exception.StorageCreateError, e:
    print 'Failed to create bucket:', e

버킷 나열

모든 버킷의 목록을 검색하려면 storage_uri()를 호출하여 BucketStorageUri 객체를 인스턴스화합니다. 이때 빈 문자열을 URI로 지정합니다. 그런 다음 get_all_buckets() 인스턴스 메서드를 호출합니다.

uri = boto.storage_uri('', GOOGLE_STORAGE)
# If the default project is defined, call get_all_buckets() without arguments.
for bucket in uri.get_all_buckets(headers=header_values):
  print bucket.name

객체 업로드하기

객체를 업로드하려면 로컬 파일을 가리키는 파일 객체(읽기용으로 열림)와 Cloud Storage의 대상 객체를 가리키는 스토리지 URI 객체를 만듭니다. 파일 핸들을 인수로 지정하여 set_contents_from_file() 인스턴스 메서드를 호출합니다.

# Make some temporary files.
temp_dir = tempfile.mkdtemp(prefix='googlestorage')
tempfiles = {
    'labrador.txt': 'Who wants to play fetch? Me!',
    'collie.txt': 'Timmy fell down the well!'}
for filename, contents in tempfiles.iteritems():
  with open(os.path.join(temp_dir, filename), 'w') as fh:
    fh.write(contents)

# Upload these files to DOGS_BUCKET.
for filename in tempfiles:
  with open(os.path.join(temp_dir, filename), 'r') as localfile:

    dst_uri = boto.storage_uri(
        DOGS_BUCKET + '/' + filename, GOOGLE_STORAGE)
    # The key-related functions are a consequence of boto's
    # interoperability with Amazon S3 (which employs the
    # concept of a key mapping to localfile).
    dst_uri.new_key().set_contents_from_file(localfile)
  print 'Successfully created "%s/%s"' % (
      dst_uri.bucket_name, dst_uri.object_name)

shutil.rmtree(temp_dir)  # Don't forget to clean up!

객체 나열

버킷의 모든 객체를 나열하려면 storage_uri()를 호출하고 버킷의 URI와 Cloud Storage URI 스키마를 인수로 지정합니다. 그런 다음 get_bucket() 인스턴스 메서드를 사용하여 객체 목록을 검색합니다.

uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
  print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
  print '  "%s"' % obj.get_contents_as_string()

객체 다운로드 및 복사하기

다음 코드는 DOGS_BUCKET에서 객체를 읽고 홈 디렉터리와 CATS_BUCKET에 복사합니다. 또한 boto 라이브러리로 같은 인터페이스를 사용하여 로컬 파일과 Cloud Storage 객체에 작업하는 방법을 보여줍니다.

dest_dir = os.getenv('HOME')
for filename in ('collie.txt', 'labrador.txt'):
  src_uri = boto.storage_uri(
      DOGS_BUCKET + '/' + filename, GOOGLE_STORAGE)

  # Create a file-like object for holding the object contents.
  object_contents = StringIO.StringIO()

  # The unintuitively-named get_file() doesn't return the object
  # contents; instead, it actually writes the contents to
  # object_contents.
  src_uri.get_key().get_file(object_contents)

  local_dst_uri = boto.storage_uri(
      os.path.join(dest_dir, filename), LOCAL_FILE)

  bucket_dst_uri = boto.storage_uri(
      CATS_BUCKET + '/' + filename, GOOGLE_STORAGE)

  for dst_uri in (local_dst_uri, bucket_dst_uri):
    object_contents.seek(0)
    dst_uri.new_key().set_contents_from_file(object_contents)

  object_contents.close()

스트리밍 전송

스트리밍 업로드를 수행하려면 다음 코드를 사용합니다.

dst_uri = boto.storage_uri(<bucket> + '/' + <object>, 'gs')
dst_uri.new_key().set_contents_from_stream(<stream object>)

예를 들어 다음 코드는 data_file이라는 파일을 동일한 이름의 객체로 스트리밍 업로드를 수행합니다.

filename = 'data_file'
MY_BUCKET = 'my_app_bucket'
my_stream = open(filename, 'rb')
dst_uri = boto.storage_uri(MY_BUCKET + '/' + filename, 'gs')
dst_uri.new_key().set_contents_from_stream(my_stream)

스트리밍 다운로드를 수행하려면 다음 코드를 사용합니다.

import sys

src_uri = boto.storage_uri(<bucket> + '/' + <object>, 'gs')
src_uri.get_key().get_file(sys.stdout)

예를 들어 다음 코드는 data_file이라는 객체의 스트리밍 다운로드를 수행합니다.

downloaded_file = 'saved_data_file'
MY_BUCKET = 'my_app_bucket'
object_name = 'data_file'
src_uri = boto.storage_uri(MY_BUCKET + '/' + object_name, 'gs')
src_uri.get_key().get_file(sys.stdout)

객체 ACL 변경

다음 코드는 지정된 Google 계정에 labrador.txt의 FULL_CONTROL 권한을 부여합니다. valid-email-address를 유효한 Google 계정 이메일 주소로 바꾸세요.

uri = boto.storage_uri(DOGS_BUCKET + '/labrador.txt', GOOGLE_STORAGE)
print str(uri.get_acl())
uri.add_email_grant('FULL_CONTROL', 'valid-email-address')
print str(uri.get_acl())

버킷 및 객체 메타데이터 읽기

이 코드는 버킷 및 객체와 연결된 메타데이터를 검색하고 인쇄합니다.

# Print ACL entries for DOGS_BUCKET.
bucket_uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for entry in bucket_uri.get_bucket().get_acl().entries.entry_list:
  entry_id = entry.scope.id
  if not entry_id:
    entry_id = entry.scope.email_address
  print 'SCOPE: %s' % entry_id
  print 'PERMISSION: %s\n' % entry.permission

# Print object metadata and ACL entries.
object_uri = boto.storage_uri(DOGS_BUCKET + '/labrador.txt', GOOGLE_STORAGE)
key = object_uri.get_key()
print ' Object size:\t%s' % key.size
print ' Last mod:\t%s' % key.last_modified
print ' MIME type:\t%s' % key.content_type
print ' MD5:\t%s' % key.etag.strip('"\'') # Remove surrounding quotes
for entry in key.get_acl().entries.entry_list:
  entry_id = entry.scope.id
  if not entry_id:
    entry_id = entry.scope.email_address
  print 'SCOPE: %s' % entry_id
  print 'PERMISSION: %s\n' % entry.permission

객체 및 버킷 삭제하기

이 가이드를 끝내기 위해 이 코드는 앞에서 만든 객체와 버킷을 삭제합니다. 버킷이 비어 있어야 버킷을 삭제할 수 있으므로 먼저 버킷의 객체가 삭제됩니다.

for bucket in (CATS_BUCKET, DOGS_BUCKET):
  uri = boto.storage_uri(bucket, GOOGLE_STORAGE)
  for obj in uri.get_bucket():
    print 'Deleting object: %s...' % obj.name
    obj.delete()
  print 'Deleting bucket: %s...' % uri.bucket_name
  uri.delete_bucket()
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.