프로젝트 간 데이터 이동

이 페이지에서는 가져오기/내보내기 관리 기능을 사용하여 프로젝트 간에 Cloud Firestore 데이터를 옮기는 방법을 설명합니다. 이 방법은 개발 환경을 설정하거나 앱을 다른 프로젝트로 영구적으로 이전하는 과정에서 유용하게 활용할 수 있습니다. 이 페이지의 예는 소스 프로젝트에서 데이터를 내보낸 후 이 데이터를 대상 프로젝트로 가져오는 방법을 보여줍니다. 프로젝트 간에 데이터를 옮기려면 다음 단계를 따르세요.

  1. 소스 프로젝트의 데이터를 보관할 Cloud Storage 버킷을 만듭니다.
  2. 소스 프로젝트의 데이터를 버킷으로 내보냅니다.
  3. 대상 프로젝트에 버킷에서 읽을 수 있는 권한을 부여합니다.
  4. 버킷의 데이터를 대상 프로젝트로 가져옵니다.

시작하기 전에

내보내기 및 가져오기 관리 서비스를 사용하려면 먼저 다음 작업을 완료해야 합니다.

  1. 소스 프로젝트와 대상 프로젝트 모두에 결제를 사용 설정합니다. 결제가 사용 설정된 Google Cloud 프로젝트만 내보내기 및 가져오기 기능을 사용할 수 있습니다.
  2. 계정에 소스 프로젝트와 대상 프로젝트에 필요한 Cloud IAM 권한이 있는지 확인합니다. 두 프로젝트의 프로젝트 소유자인 계정에는 필요한 권한이 있습니다. 그렇지 않은 경우 다음 Cloud IAM 역할은 Cloud Firestore 내보내기 및 가져오기 작업에 필요한 권한을 부여합니다.

    Owner, Cloud Datastore Owner 또는 Cloud Datastore Import Export Admin

    프로젝트 소유자는 액세스 권한 부여 단계에 따라 이러한 역할 중 하나를 부여할 수 있습니다.

  3. 다음 방법 중 하나를 사용하여 gcloud 명령줄 도구를 설정하고 프로젝트에 연결합니다.

  4. 새 프로젝트에서 색인을 설정합니다. 소스 색인과 대상 프로젝트 간에 복합 색인이 일치해야 합니다. 각 문서를 여러 번 처리할 필요가 없도록 색인을 먼저 설정해야 합니다.

소스 프로젝트에서 데이터 내보내기

Cloud Firestore 내보내기 파일용 Cloud Storage 버킷을 만들고 내보내기 작업을 시작하여 데이터를 내보냅니다.

Cloud Storage 버킷 생성

Cloud Firestore 데이터베이스와 동일한 위치에 Cloud Storage 버킷을 만듭니다. 데이터베이스 위치를 보려면 프로젝트 위치 설정을 참조하세요. 내보내기 및 가져오기 작업에는 요청자 지불 버킷을 사용할 수 없습니다.

Cloud Storage 버킷이 소스 프로젝트에 없으면 소스 프로젝트의 기본 서비스 계정에 버킷에 대한 액세스 권한을 부여해야 합니다. 각 Google Cloud 프로젝트에는 이름이 PROJECT_ID@appspot.gserviceaccount.com인 자동으로 생성된 기본 서비스 계정이 있습니다. Cloud Firestore 내보내기 작업은 이 기본 서비스 계정을 사용하여 Cloud Storage 버킷 작업을 승인합니다. 기본 서비스 계정에 소스 버킷에 대한 액세스 권한을 부여하려면 Storage Admin 역할을 부여합니다.

Cloud Shell에 있는 gsutil 도구를 사용하여 이 역할을 부여할 수 있습니다.

Cloud Shell 시작

gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\
gs://[BUCKET_NAME]@

Google Cloud Console에서 이 역할을 부여할 수도 있습니다.

쓰기 작업 중지(선택사항)

내보내기 작업을 수행하는 동안 앱에서 데이터베이스에 계속 쓰는 경우 내보내기 파일에 모든 쓰기를 캡처하지 못할 수 있습니다. 일관된 상태에서 데이터를 내보내려면 보안 규칙을 업데이트하고 Admin SDK 작업을 중단하여 데이터베이스 쓰기를 중지하세요.

  1. 보안 규칙 업데이트

    Console의 Cloud Firestore 규칙에서 소스 프로젝트 보안 규칙을 업데이트하여 모든 쓰기를 거부합니다. 예를 들면 다음과 같습니다.

      // Deny write access to all users under any conditions
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow write: if false;
          }
          // Reads do not affect export operations
          // Add your read rules here
        }
      }
    
  2. Admin SDK에서 쓰기 중단

    보안 규칙은 Firebase Admin SDK 또는 Google Cloud 서버 클라이언트 라이브러리를 사용하여 생성된 관리자 권한 서버 환경에서 요청하는 쓰기를 중지하지 않습니다. 서버를 종료하거나 업데이트하여 관리 서버에서 들어오는 쓰기 작업을 중단하세요.

내보내기 작업 시작

gcloud firestore export 명령어를 사용하여 소스 프로젝트에서 데이터를 내보냅니다. 모든 데이터 또는 특정 컬렉션만 지정하여 내보낼 수 있습니다. [SOURCE_BUCKET]을 Cloud Storage 버킷 이름으로 바꿉니다.

모든 데이터 내보내기
gcloud firestore export gs://[SOURCE_BUCKET] --async
특정 컬렉션 내보내기
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

이후에 사용할 수 있도록 내보내기 작업의 outputURIPrefix를 기록해 둡니다. Cloud Firestore는 기본적으로 타임스탬프를 기준으로 내보내기 파일에 프리픽스를 추가합니다.

outputUriPrefix: gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418

내보내기 작업이 실행되면 firestore operations list 명령어를 사용하여 작업 진행 상황을 확인할 수 있습니다.

gcloud firestore operations list

대상 프로젝트로 데이터 가져오기

다음 단계로 대상 프로젝트에 Cloud Firestore 데이터 파일에 대한 액세스 권한을 부여하고 가져오기 작업을 시작합니다.

대상 프로젝트에 데이터 파일에 대한 액세스 권한 부여

가져오기 작업을 시작하려면 대상 프로젝트에서 Cloud Firestore 데이터 파일에 액세스할 수 있어야 합니다.

로컬 버킷으로 데이터 파일 이동

소스 버킷 위치가 대상 프로젝트의 Cloud Firestore 위치와 다르면 데이터 파일을 대상 프로젝트와 동일한 위치에 있는 Cloud Storage 버킷으로 옮겨야 합니다.

버킷 이동 및 이름 바꾸기의 단계에 따라 데이터 파일을 다른 Cloud Storage 버킷으로 옮깁니다. 다음 모든 단계에서는 이 새 버킷을 [SOURCE_BUCKET]으로 사용합니다.

프로젝트 서비스 계정에 소스 버킷에 대한 액세스 권한 부여

소스 버킷이 대상 프로젝트에 없으면 대상 프로젝트의 기본 서비스 계정에 소스 버킷에 대한 액세스 권한을 부여해야 합니다. 기본 서비스 계정의 이름은 [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com입니다. 기본 서비스 계정이 소스 버킷에 액세스할 수 있도록 버킷에 적절한 액세스 권한을 부여합니다.

Cloud Shell에 있는 gsutil 도구를 사용하여 필요한 역할을 부여할 수 있습니다.

Cloud Shell 시작

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \
gs://[SOURCE_BUCKET]

Google Cloud Console에서 이 역할을 부여할 수도 있습니다.

가져오기 작업 시작

가져오기 작업을 시작하기 전에 gcloud가 올바른 프로젝트에 구성되어 있는지 확인합니다.

gcloud config set project [DESTINATION_PROJECT_ID]

gcloud firestore import 명령어를 사용하여 소스 버킷의 데이터를 대상 프로젝트로 가져옵니다.

gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX] --async

여기서 [EXPORT_PREFIX]는 내보내기 작업의 프리픽스인 outputUriPrefix와 일치합니다. 예를 들면 다음과 같습니다.

gcloud firestore import gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418 --async

내보내기 작업이 실행되면 firestore operations list 명령어를 사용하여 작업 진행 상황을 확인할 수 있습니다.

gcloud firestore operations list