내보내기 예약

이 페이지에서는 Datastore 모드의 Firestore 항목 자동 내보내기를 예약하는 방법을 설명합니다.

항목 내보내기를 예약하려면 Datastore 모드 관리형 내보내기 기능을 호출하는 App Engine 서비스를 배포하는 것이 좋습니다. 이 서비스가 배포되면 App Engine Cron Service를 사용하여 이 서비스를 일정에 따라 실행할 수 있습니다.

시작하기 전에

App Engine 및 관리형 내보내기 기능을 사용하여 데이터 내보내기를 예약하려면 먼저 다음 태스크를 완료해야 합니다.

  1. Google Cloud 프로젝트에 결제를 사용 설정합니다. 결제가 사용 설정된 Google Cloud 프로젝트만 내보내기 및 가져오기 기능을 사용할 수 있습니다.

  2. 프로젝트의 Cloud Storage 버킷을 만듭니다. 모든 관리형 내보내기 및 가져오기는 Cloud Storage를 사용합니다. Cloud Storage 버킷과 Datastore 모드 데이터베이스에 동일한 위치를 사용해야 합니다.

    Datastore 모드 데이터베이스 위치를 확인하려면 프로젝트 위치 보기를 참조하세요.

  3. Google Cloud SDK를 설치하여 애플리케이션을 배포합니다.

예약 내보내기 설정

위의 요구사항을 완료했으면 다음 절차를 완료하여 예약 내보내기를 설정합니다.

액세스 권한 구성

이 앱은 App Engine 기본 서비스 계정을 사용하여 내보내기 요청을 인증하고 승인합니다. 프로젝트를 만들 때 App Engine에서 다음 형식의 기본 서비스 계정이 자동으로 생성됩니다.

[PROJECT_ID]@appspot.gserviceaccount.com

서비스 계정에는 Datastore 모드 데이터베이스 내보내기 작업을 시작하고 Cloud Storage 버킷에 쓸 수 있는 권한이 필요합니다. 이러한 권한을 부여하려면 다음 IAM 역할을 기본 서비스 계정에 할당합니다.

  • Datastore Import Export Admin
  • Cloud Storage 버킷의 Storage Admin

Cloud SDK의 gcloudgsutil 명령줄 도구를 사용하여 이러한 역할을 할당할 수 있습니다.

  1. gcloud 명령줄 도구를 사용하여 Datastore 내보내기 관리자 역할을 할당합니다.

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

    또는 Cloud Console을 사용하여 이 역할을 할당할 수 있습니다.

  2. gsutil 명령줄 도구를 사용하여 버킷의 스토리지 관리자 역할을 할당합니다.

        gsutil iam ch serviceAccount:[PROJECT_ID]@appspot.gserviceaccount.com:admin \
            gs://[BUCKET_NAME]
        

    또는 Cloud Console을 사용하여 이 역할을 할당할 수 있습니다.

앱 배포

Python 또는 자바로 다음 샘플 앱을 배포합니다.

Python

앱 파일 만들기

개발 머신의 새 폴더에서 App Engine 앱의 코드를 제공하는 다음 파일을 만듭니다.

  • app.yaml
  • cloud_datastore_admin.py

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

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

    

service: cloud-datastore-admin 줄은 앱을 cloud-datastore-admin 서비스에 배포합니다. 서비스가 프로젝트에서 유일한 App Engine 서비스라면 대신 이 줄을 삭제하여 앱을 default 서비스에 배포합니다.

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)

    

앱 배포

  1. gcloud가 올바른 프로젝트에 설정되어 있는지 확인합니다.

    gcloud config set project [PROJECT_NAME]
        
  2. app.yaml 파일과 동일한 디렉터리에서 앱을 프로젝트에 배포합니다.

    gcloud app deploy
        

자바

다음 샘플 앱에서는 Maven과 App Engine 플러그인을 설정했다고 가정합니다.

앱 다운로드

java-docs-samples 저장소를 다운로드하고 datastore-schedule-export 앱 디렉터리로 이동합니다.

  1. 샘플 앱 저장소를 로컬 머신에 클론합니다.

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

    또는 zip 파일로 샘플을 다운로드하고 압축을 풉니다.

  2. 샘플 코드가 있는 디렉터리로 이동합니다.

    cd java-docs-samples/appengine-java8/datastore-schedule-export/
        

앱이 DatastoreExportServlet.java 파일에 서블릿을 설정합니다.

다른 서비스에 배포

앱을 있는 그대로 배포하면 default 서비스에 배포됩니다. 이미 default 서비스가 있으면 대신 다른 서비스에 배포해야 합니다.

<module>service_name</module>을 추가하여 src/main/webapp/WEB-INF/appengine-web.xml 파일을 수정합니다. 예를 들면 다음과 같습니다.

   <?xml version="1.0" encoding="utf-8"?>
       <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
          <runtime>java8</runtime>
          <!-- ... -->
          <module>cloud-datastore-admin</module>
          <!-- ... -->
       </appengine-web-app>
    

앱 구성 파일에 대한 자세한 내용은 appengine-web.xml reference 참조를 확인하세요.

앱 배포

  1. gcloud가 올바른 프로젝트에 설정되었는지 확인합니다.

    gcloud config set project [PROJECT_NAME]
        
  2. 프로젝트에 앱을 배포합니다.

    mvn appengine:deploy
        

서비스가 [SERVICE_URL]/cloud-datastore-export에서 내보내기 요청을 받고 인증된 요청을 Datastore Admin API로 보내 내보내기를 시작합니다.

서비스는 다음 URL 매개변수를 사용하여 내보내기 요청을 구성합니다.

  • output_url_prefix(필수): Datastore 모드 데이터베이스 내보내기를 저장할 위치를 지정합니다. URL이 /로 끝나면 있는 그대로 사용됩니다. 그렇지 않으면 앱에서 url에 타임스탬프를 추가합니다.
  • kind(선택사항, 여러 항목 가능): 내보내기를 지정된 종류로 제한합니다.
  • namespace_id(선택사항, 여러 항목 가능): 내보내기를 지정된 네임스페이스로 제한합니다.

크론 작업 배포

schedule-datastore-exports 앱을 호출하는 크론 작업을 설정하려면 cron.yaml 파일을 만들고 배포합니다.

  1. cron.yaml 파일을 만듭니다.

    Python

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

    앱을 cloud-datastore-admin 서비스 대신 default 서비스에 배포했으면 target: cloud-datastore-admin을 삭제합니다.

    자바

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

    앱을 default 서비스에 배포하지 않았으면 서비스 대상 줄을 추가합니다(예: target: cloud-datastore-admin).

    [BUCKET_NAME]을 Cloud Storage 버킷 이름으로 바꿉니다.

  2. 크론 작업을 구성합니다. 예시 cron.yaml은 24시간마다 한 번씩 모든 항목의 내보내기 요청을 시작합니다. 예약 옵션에 대한 자세한 내용은 일정 형식을 참조하세요.

    특정 종류의 항목만 내보내려면 kind 매개변수를 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
          
  3. 크론 작업을 배포합니다. cron.yaml 파일과 동일한 디렉터리에서 다음 명령어를 실행합니다.

      gcloud app deploy cron.yaml
        

크론 앱 테스트

Google Cloud Console의 크론 작업 페이지에서 크론 작업을 조기에 실행하여 배포된 크론 작업을 테스트할 수 있습니다.

  1. Cloud Console에서 크론 작업 페이지를 엽니다.
    크론 작업 페이지 열기

  2. 크론 작업의 지금 실행 버튼을 클릭합니다.

  3. 작업이 완료되면 상태에서 상태 메시지를 확인합니다. 크론 작업의 로그 파일을 보려면 로그 열에서 보기를 클릭합니다.

내보내기 보기

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

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

  2. 버킷 목록에서 내보내기용으로 만든 버킷을 클릭합니다.

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

다음 단계

  • Datastore 모드 데이터베이스 내보내기에서 데이터를 가져오는 방법은 항목 가져오기를 참조하세요.