내보내기 예약

이 페이지에서는 애플리케이션에서 Google Cloud Datastore에 저장하는 항목의 자동 내보내기 일정을 예약하는 방법을 설명합니다.

이 페이지에 안내된 내용은 Google Cloud Platform 프로젝트가 이미 Cloud Datastore를 사용하도록 설정되었다고 가정합니다.

추천

Cloud Datastore 내보내기 일정 예약에 대해 권장되는 접근 방식은 App Engine을 사용하는 것입니다. 이를 위해서는 크론 작업의 요청을 처리하고 내보내기 요청을 실행하는 App Engine 서비스를 배포해야 합니다. 배포된 서비스는 App Engine 기본 서비스 계정 ID를 사용하여 실행됩니다.

시작하기 전에

  1. GCP 프로젝트의 결제 가능 계정을 사용하고 있는지 확인합니다. 청구 가능한 계정의 GCP 프로젝트만 내보내기 및 가져오기 기능을 사용할 수 있습니다. 청구에 대한 자세한 내용은 청구 및 결제 지원을 참조하세요.

  2. 프로젝트의 Cloud Storage 버킷 생성을 아직 하지 않았다면 생성합니다. 모든 내보내기와 가져오기는 Cloud Storage를 사용합니다.

  3. App Engine 기본 서비스 계정Cloud Datastore Import Export Admin 역할을 할당합니다. 이 계정은 YOUR_PROJECT_ID@appspot.gserviceaccount.com과 같은 형식입니다. 역할을 할당하려면 gcloud 명령줄 도구를 사용하면 됩니다.

    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
    --member serviceAccount:YOUR_PROJECT_ID@appspot.gserviceaccount.com \
    --role roles/datastore.importExportAdmin
    

    YOUR_PROJECT_ID를 GCP 프로젝트 ID로 바꾸세요.

    서비스 계정에 역할을 할당하기 위한 자세한 내용 및 기타 옵션을 알아보려면 특정 리소스를 위해 서비스 계정에 역할 부여하기를 참조하세요.

  4. Cloud Storage 버킷 쓰기 권한을 App Engine 기본 서비스 계정에 할당합니다. gsutil 명령줄 도구를 사용하여 권한을 할당할 수 있습니다.

    gsutil iam ch serviceAccount:YOUR_PROJECT_ID@appspot.gserviceaccount.com:objectCreator \
    gs://BUCKET_NAME
    

    YOUR_PROJECT_ID를 GCP 프로젝트 ID로 바꾸고 BUCKET_NAME을 Cloud Storage 버킷 이름으로 바꾸세요.

    Cloud Storage 버킷 권한 할당에 대한 자세한 내용 및 기타 옵션을 알아보려면 버킷으로 IAM 사용하기를 참조하세요.

애플리케이션 파일

개발 머신의 새로운 폴더에 크론 작업 코드를 제공하는 다음 파일을 생성합니다.

  • app.yaml
  • cloud_datastore_admin.py
  • cron.yaml

파일에 다음 코드를 사용합니다.

app.yaml

runtime: python27
api_version: 1
threadsafe: true
service: cloud-datastore-admin

libraries:
- name: webapp2
  version: "latest"

handlers:
- url: /cloud-datastore-export
  script: cloud_datastore_admin.app
  login: admin

cloud_datastore_admin.py

import datetime
import httplib
import json
import logging
import webapp2

from google.appengine.api import app_identity
from google.appengine.api import urlfetch

class Export(webapp2.RequestHandler):

  def get(self):
    access_token, _ = app_identity.get_access_token(
        'https://www.googleapis.com/auth/datastore')
    app_id = app_identity.get_application_id()
    timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')

    output_url_prefix = self.request.get('output_url_prefix')
    assert output_url_prefix and output_url_prefix.startswith('gs://')
    if '/' not in output_url_prefix[5:]:
      # Only a bucket name has been provided - no prefix or trailing slash
      output_url_prefix += '/' + timestamp
    else:
      output_url_prefix += timestamp

    entity_filter = {
        'kinds': self.request.get_all('kind'),
        'namespace_ids': self.request.get_all('namespace_id')
    }
    request = {
        'project_id': app_id,
        'output_url_prefix': output_url_prefix,
        'entity_filter': entity_filter
    }
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + access_token
    }
    url = 'https://datastore.googleapis.com/v1/projects/%s:export' % app_id
    try:
      result = urlfetch.fetch(
          url=url,
          payload=json.dumps(request),
          method=urlfetch.POST,
          deadline=60,
          headers=headers)
      if result.status_code == httplib.OK:
        logging.info(result.content)
      elif result.status_code >= 500:
        logging.error(result.content)
      else:
        logging.warning(result.content)
      self.response.status_int = result.status_code
    except urlfetch.Error:
      logging.exception('Failed to initiate export.')
      self.response.status_int = httplib.INTERNAL_SERVER_ERROR

app = webapp2.WSGIApplication(
    [
        ('/cloud-datastore-export', Export),
    ], debug=True)

cron.yaml

GCP 프로젝트에 기본 App Engine 서비스를 이미 배포한 경우 다음 파일을 사용할 수 있습니다.

cron:
- description: "Daily Cloud Datastore Export"
  url: /cloud-datastore-export?namespace_id=&output_url_prefix=gs://BUCKET_NAME[/NAMESPACE_PATH]
  target: cloud-datastore-admin
  schedule: every 24 hours

GCP 프로젝트에 기본 App Engine 서비스를 이미 배포하지 않은 경우 target: cloud-datastore-admin 줄을 제외하고 위 파일을 사용하세요. 그러면 크론 작업이 기본 App Engine 서비스가 됩니다.

cron.yaml에서 BUCKET_NAME을 Cloud Storage 버킷 이름으로 바꿉니다. Cloud Storage 네임스페이스 경로로 선택적인 NAMESPACE_PATH를 사용하는 경우 Cloud Storage 네임스페이스 경로(Cloud Datastore 네임스페이스가 아님)로 바꾸세요. Cloud Storage 네임스페이스 경로에 대한 자세한 내용은 객체 이름 고려 사항을 참조하세요.

예제 cron.yaml은 내보내기 발생 빈도를 매 24시간으로 설정합니다. 일정 옵션을 다르게 지정하려면 일정 형식을 참조하세요.

특정 종류의 항목만 내보내려면 cron.yaml의 url 값을 수정하여 kind 매개변수를 사용합니다. 마찬가지로 특정 네임스페이스의 항목만 내보내려면 cron.yaml의 url 값을 수정하여 namespace_id 매개변수를 사용하세요.

이 예제는 Song 종류의 항목을 내보냅니다.

url: /cloud-datastore-export?output_url_prefix=gs://BUCKET_NAME&kind=Song

이 예제는 Song 종류와 Album 종류의 항목을 내보냅니다.

url: /cloud-datastore-export?output_url_prefix=gs://BUCKET_NAME&kind=Song&kind=Album

이 예제는 Classical 네임스페이스 또는 Pop 네임스페이스 중 하나에 있는 경우 Song 종류와 Album 종류의 항목을 내보냅니다.

url: /cloud-datastore-export?output_url_prefix=gs://BUCKET_NAME&namespace_id=Classical&namespace_id=Pop&kind=Song&kind=Album

크론 앱 배포

파일을 생성한 동일한 디렉토리에서 다음 명령을 실행합니다.

gcloud app deploy app.yaml cron.yaml

(필요한 경우 --project 플래그를 사용하여 활성 GCP 프로젝트를 설정합니다.)

앱 배포에 대한 자세한 내용은 Python 앱 배포를 참조하세요.

크론 앱 테스트

Google Cloud Platform 콘솔의 크론 작업 페이지에서 배포된 크론 작업 테스트를 시작할 수 있습니다.

  1. GCP 콘솔에서 크론 작업 페이지를 엽니다.
    크론 작업 페이지 열기

  2. 매일 Cloud Datastore 내보내기 설명이 포함된 크론 작업의 경우 지금 실행을 클릭합니다.

  3. 작업이 완료되면 상태 아래에 상태 메시지가 표시됩니다. 보기를 클릭하여 작업 로그를 살펴보세요. 상태 메시지 및 작업 로그는 작업 성공 여부 또는 오류가 발생했는지 여부에 대한 정보를 제공합니다.

내보내기 보기

크론 작업이 성공적으로 완료된 후에는 Cloud Storage 버킷에서 내보내기를 볼 수 있습니다.

  1. GCP 콘솔에서 Cloud Storage 브라우저를 엽니다.
    Cloud Storage 브라우저 열기

  2. 버킷 목록에서 내보내기를 위해 생성한 버킷을 클릭합니다.

  3. 내보내기가 버킷에 나열되어 있는지 확인합니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

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

Cloud Datastore 문서