App Engine 및 Google Cloud Storage 샘플

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다. 리전 ID에 대해 자세히 알아보세요.

App Engine Python 앱에 대한 Cloud Storage 액세스를 사용 설정하고, Cloud Storage 버킷에서 파일을 생성, 쓰기, 나열하는 방법을 알아봅니다.

이 가이드에서는 개발자가 Python에 익숙하고 개발 환경을 설정했다고 가정합니다.

이 샘플이 실행되면 스크립트를 실행하고 브라우저에 출력을 씁니다. 이 스크립트는 Cloud Storage 클라이언트 라이브러리의 다음 기능을 보여줍니다.

  • 파일 만들기 및 파일을 버킷에 쓰기
  • 파일 읽기 및 해당 파일의 메타데이터 가져오기
  • 여러 파일을 만든 후 버킷에서 나열
  • 방금 버킷에 추가한 파일 나열
  • 같은 파일 집합 읽기
  • 파일 집합 삭제

목표

  • Python 프로젝트를 살펴보며 필수 레이아웃과 파일 확인
  • Cloud Storage 연결을 위한 코드 이해
  • 파일 만들기, 쓰기, 읽기, 나열, 삭제를 위한 코드 이해
  • 재시도를 위한 코드 이해
  • 로컬 개발 서버에서 앱 빌드 및 테스트
  • Google App Engine에서 앱을 프로덕션에 배포

비용

App Engine에는 무료로 제공되는 사용량이 있습니다. App Engine의 총 사용량이 App Engine 무료 할당량에 지정된 한도보다 낮을 경우 이 가이드를 완료하는 데 비용이 들지 않습니다.

시작하기 전에

이 샘플을 실행하려면 프로젝트 ID, gcloud 명령줄 도구, Cloud Storage 버킷이 필요합니다.

  1. 새 Google Cloud 콘솔 프로젝트를 만들거나 Google Cloud 콘솔에서 기존 프로젝트의 프로젝트 ID를 가져옵니다.

    프로젝트 페이지로 이동

  2. Google Cloud CLI를 설치하고 초기화합니다.

    SDK 다운로드

  3. 기본 Cloud Storage 버킷을 활성화합니다.

가이드 프로젝트 클론

프로젝트를 복제하려면 다음 단계를 따르세요.

  1. 클라이언트 라이브러리와 샘플(데모) 앱을 로컬 머신에 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    

    또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수도 있습니다.

  2. 복제 또는 다운로드한 프로젝트에서 해당 디렉토리로 이동합니다.

    cd python-docs-samples/appengine/standard/storage/appengine-client
    

종속 항목 설치

virtualenv 도구를 사용하면 시스템에 정상적인 Python 환경을 만들 수 있습니다. 이렇게 하면 App Engine 개발 시 코드를 테스트하는 로컬 환경과 코드를 배포할 대상 환경을 유사하게 만들 수 있습니다. 자세한 내용은 타사 라이브러리 사용을 참조하세요.

virtualenv와 샘플의 종속 항목을 설치하려면 다음 안내를 따르세요.

Mac OS/Linux

  1. virtualenv가 없으면 pip를 사용하여 시스템 전체에 설치합니다.
    sudo pip install virtualenv
  2. 격리된 Python 환경을 만듭니다.
    virtualenv env
    source env/bin/activate
  3. 현재 위치가 샘플 코드가 있는 디렉터리가 아니면 hello_world 샘플 코드가 포함된 디렉터리로 이동합니다. 그런 후 종속 항목을 설치합니다.
    cd YOUR_SAMPLE_CODE_DIR
    pip install -t lib -r requirements.txt

Windows

Google Cloud CLI를 설치한 경우 Python 2.7이 이미 설치되어 있어야 합니다. 64비트 시스템의 경우 일반적으로 C:\python27_x64\에 설치됩니다. PowerShell을 사용하여 Python 패키지를 실행합니다.

  1. PowerShell 설치 위치를 찾습니다.
  2. PowerShell 바로가기를 마우스 오른쪽 버튼으로 클릭하고 관리자 권한으로 시작합니다.
  3. python 명령어를 실행해 봅니다. Python을 찾지 못한 경우 환경의 PATH에 Python 폴더를 추가합니다.
    $env:Path += ";C:\python27_x64\"
  4. virtualenv가 없으면 pip를 사용하여 시스템 전체에 설치합니다.
    python -m pip install virtualenv
  5. 격리된 Python 환경을 만듭니다.
    python -m virtualenv env
    . env\Scripts\activate
  6. 프로젝트 디렉터리로 이동하여 종속 항목을 설치합니다. 현재 위치가 샘플 코드가 있는 디렉터리가 아니면 hello_world 샘플 코드가 포함된 디렉터리로 이동합니다. 그런 후 종속 항목을 설치합니다.
    cd YOUR_SAMPLE_CODE_DIR
    python -m pip install -t lib -r requirements.txt

클론 또는 다운로드한 샘플 코드에는 이미 appengine_config.py 파일이 포함되어 있습니다. 이 파일은 App Engine이 로컬에서 그리고 배포 시 종속 항목을 로드할 때 lib 폴더를 사용하도록 지시하는 데 필요합니다.

로컬에서 실행

샘플을 로컬에서 실행하려면 다음 안내를 따르세요.

  1. 프로젝트 하위 디렉터리 python-docs-samples/appengine/standard/storage/appengine-client에서 로컬 개발 서버의 앱을 실행합니다.

    python3 CLOUD_SDK_ROOT/bin/dev_appserver.py .
    
  2. 다음과 같은 성공 메시지를 기다립니다.

    INFO     2016-04-12 21:33:35,446 api_server.py:205] Starting API server at: http://localhost:36884
    INFO     2016-04-12 21:33:35,449 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-04-12 21:33:35,449 admin_server.py:116] Starting admin server at: http://localhost:8000
    
  3. 브라우저에서 다음 URL을 방문합니다.

    http://localhost:8080/

    페이지 로드 시 애플리케이션이 실행되고 브라우저에 실행 결과를 나타내는 출력이 표시됩니다. 출력 형식은 다음과 같습니다.

    Hello_Storage

  4. Control-C를 눌러 개발 서버를 중지합니다.

app.yaml 둘러보기

app.yaml 파일은 애플리케이션 구성 세부정보를 지정합니다.

runtime: python27
api_version: 1
threadsafe: yes

env_variables:

handlers:
- url: /blobstore.*
  script: blobstore.app

- url: /.*
  script: main.app

이 파일에서 사용 가능한 구성 옵션에 대한 자세한 내용은 app.yaml 참조 문서를 확인하세요.

가져오기 둘러보기

main.py 파일에는 클라이언트 라이브러리를 통해 Cloud Storage에 액세스하는 데 사용되는 일반적인 가져오기가 포함되어 있습니다.

import os

import cloudstorage
from google.appengine.api import app_identity

import webapp2

런타임에서 기본 버킷 이름을 가져오려면 os 모듈과 app_identity API가 필요합니다. 모든 Cloud Storage 액세스 작업에 이 버킷 이름이 필요합니다.

이 샘플은 webapp2 웹 프레임워크도 사용합니다.

Cloud Storage 버킷 지정

Cloud Storage에서 작업을 수행하기 전에 버킷 이름을 제공해야 합니다. 가장 간편한 방법은 프로젝트의 기본 버킷을 사용하는 것으로, 기본 버킷은 다음과 같은 방법으로 얻을 수 있습니다.

def get(self):
    bucket_name = os.environ.get(
        'BUCKET_NAME', app_identity.get_default_gcs_bucket_name())

    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write(
        'Demo GCS Application running from Version: {}\n'.format(
            os.environ['CURRENT_VERSION_ID']))
    self.response.write('Using bucket name: {}\n\n'.format(bucket_name))

Cloud Storage에 파일 쓰기

다음 샘플은 버킷에 쓰는 방법을 보여줍니다.

def create_file(self, filename):
    """Create a file."""

    self.response.write('Creating file {}\n'.format(filename))

    # The retry_params specified in the open call will override the default
    # retry params for this particular file handle.
    write_retry_params = cloudstorage.RetryParams(backoff_factor=1.1)
    with cloudstorage.open(
        filename, 'w', content_type='text/plain', options={
            'x-goog-meta-foo': 'foo', 'x-goog-meta-bar': 'bar'},
            retry_params=write_retry_params) as cloudstorage_file:
                cloudstorage_file.write('abcde\n')
                cloudstorage_file.write('f'*1024*4 + '\n')
    self.tmp_filenames_to_clean_up.append(filename)

쓰기 위해 파일을 open하는 호출에서 이 샘플은 파일의 커스텀 메타데이터를 쓰는 특정 Cloud Storage 헤더를 지정합니다. cloudstorage.stat을 사용하여 이 메타데이터를 검색할 수 있습니다. cloudstorage.open 참조 문서에서 지원되는 헤더 목록을 확인할 수 있습니다.

x-goog-acl 헤더가 설정되지 않았다는 것도 알 수 있습니다. 즉, 기본 Cloud Storage ACL의 공개 읽기는 버킷에 기록될 때 객체에 적용됩니다.

마지막으로 쓰기를 마친 후에 파일을 close하기 위한 호출을 확인합니다. 그렇지 않으면 파일이 Cloud Storage에 기록되지 않습니다. close를 호출한 후에는 파일에 아무 것도 추가할 수 없습니다. 파일을 수정해야 하는 경우 쓰기 모드에서 파일을 다시 열어야 하며, 이 경우 파일을 추가하지 않고 덮어씁니다.

Cloud Storage에서 파일 읽기

다음 샘플은 버킷에서 파일을 읽는 방법을 보여줍니다.

def read_file(self, filename):
    self.response.write(
        'Abbreviated file content (first line and last 1K):\n')

    with cloudstorage.open(filename) as cloudstorage_file:
        self.response.write(cloudstorage_file.readline())
        cloudstorage_file.seek(-1024, os.SEEK_END)
        self.response.write(cloudstorage_file.read())

이 샘플은 seek을 사용하여 읽는 파일에서 선택한 줄(이 경우 시작 줄과 마지막 1,000개의 줄)을 표시하는 방법을 보여줍니다.

파일을 읽기 위해 연 경우 위 코드에 지정된 모드가 없습니다. open의 기본값은 읽기 전용 모드입니다.

버킷 콘텐츠 나열

이 샘플 코드는 marker를 사용하여 다수의 파일이 있는 버킷을 통해 페이지를 지정하는 방법과 max_keys 매개변수를 사용하여 버킷의 콘텐츠 목록을 통해 페이지를 지정하는 방법을 보여줍니다.

def list_bucket(self, bucket):
    """Create several files and paginate through them."""

    self.response.write('Listbucket result:\n')

    # Production apps should set page_size to a practical value.
    page_size = 1
    stats = cloudstorage.listbucket(bucket + '/foo', max_keys=page_size)
    while True:
        count = 0
        for stat in stats:
            count += 1
            self.response.write(repr(stat))
            self.response.write('\n')

        if count != page_size or count == 0:
            break
        stats = cloudstorage.listbucket(
            bucket + '/foo', max_keys=page_size, marker=stat.filename)

전체 파일 이름은 디렉터리 구분 기호 없이 문자열 하나로 표시됩니다. 보기 쉽게 디렉터리 계층 구조로 파일을 표시하려면 사용할 디렉터리 구분 기호로 delimiter 매개변수를 설정합니다.

파일 삭제

이 코드 샘플은 파일 삭제를 보여줍니다. 이 경우에는 애플리케이션 실행 중에 추가된 모든 파일을 삭제합니다. 이 샘플의 정리 기능일 뿐이므로, 사용자 코드에서는 이를 수행하지 않습니다.

def delete_files(self):
    self.response.write('Deleting files...\n')
    for filename in self.tmp_filenames_to_clean_up:
        self.response.write('Deleting file {}\n'.format(filename))
        try:
            cloudstorage.delete(filename)
        except cloudstorage.NotFoundError:
            pass

샘플 배포

샘플을 App Engine에 배포하고 실행하려면 다음 안내를 따르세요.

  1. app.yaml 파일이 있는 python-docs-samples/appengine/standard/storage/appengine-client 디렉터리에서 다음 명령어를 실행하여 샘플 앱을 업로드합니다.

    gcloud app deploy
    

    선택적 플래그:

    • --project 플래그를 포함하여 gcloud CLI에서 기본값으로 초기화한 값으로 대체 Google Cloud 콘솔 프로젝트 ID를 지정합니다. 예: --project [YOUR_PROJECT_ID]
    • 버전 ID를 지정하려면 -v 플래그를 포함하세요. 그렇지 않으면 버전 ID가 자동으로 생성됩니다. 예를 들면 -v [YOUR_VERSION_ID]입니다.
  2. 배포 프로세스가 완료되면 다음 명령어를 실행하여 https://PROJECT_ID.REGION_ID.r.appspot.com에서 애플리케이션을 볼 수 있습니다.

    gcloud app browse
    

    demo 앱은 로컬에서 실행할 때와 마찬가지로 페이지 로드 시 실행됩니다. 하지만 이제는 앱이 실제로 Cloud Storage 버킷에서 읽고 씁니다.

명령줄에서 앱을 배포하는 방법에 대한 자세한 내용은 Python 2 앱 배포를 참조하세요.

다음 단계