Di chuyển dữ liệu giữa các dự án

Trang này mô tả cách sử dụng các tính năng nhập và xuất được quản lý để di chuyển dữ liệu Cloud Firestore từ dự án này sang dự án khác. Điều này có thể hữu ích khi thiết lập môi trường phát triển hoặc trong quá trình di chuyển vĩnh viễn một ứng dụng sang một dự án khác. Ví dụ trên trang này minh hoạ cách xuất dữ liệu từ dự án nguồn, sau đó nhập dữ liệu đó vào dự án đích. Việc di chuyển dữ liệu giữa các dự án bao gồm các bước sau:

  1. Tạo một bộ chứa Cloud Storage để lưu trữ dữ liệu từ dự án nguồn.
  2. Xuất dữ liệu từ dự án nguồn của bạn sang bộ chứa.
  3. Cấp cho dự án đích quyền đọc từ bộ chứa.
  4. Nhập dữ liệu từ bộ chứa vào dự án đích.

Trước khi bắt đầu

Để có thể sử dụng dịch vụ xuất và nhập được quản lý, bạn phải hoàn tất các nhiệm vụ sau:

  1. Bật tính năng thanh toán cho cả dự án nguồn và dự án đích. Chỉ những dự án Google Cloud đã bật tính năng thanh toán mới có thể sử dụng chức năng xuất và nhập.
  2. Đảm bảo tài khoản của bạn có các quyền cần thiết đối với IAM trên Google Cloud trong dự án nguồn và dự án đích. Nếu bạn là chủ sở hữu dự án của cả hai dự án, thì tài khoản của bạn sẽ có các quyền cần thiết. Nếu không, các vai trò Cloud IAM sau đây sẽ cấp các quyền cần thiết cho các thao tác xuất và nhập Cloud Firestore:

    Owner, Cloud Datastore Owner hoặc Cloud Datastore Import Export Admin

    Chủ sở hữu dự án có thể cấp một trong các vai trò này bằng cách làm theo các bước trong phần Cấp quyền truy cập.

  3. Thiết lập công cụ dòng lệnh gcloud và kết nối với dự án của bạn bằng một trong những cách sau:

  4. Thiết lập chỉ mục trong dự án mới. Các chỉ mục tổng hợp phải khớp giữa dự án nguồn và dự án đích. Trước tiên, bạn nên thiết lập chỉ mục để tránh phải xử lý nhiều lần mỗi tài liệu.

Xuất dữ liệu từ dự án nguồn

Xuất dữ liệu bằng cách tạo một bộ chứa Cloud Storage cho các tệp xuất Cloud Firestore và bắt đầu một thao tác xuất.

Tạo bộ chứa Cloud Storage

Tạo một bộ chứa Cloud Storage ở cùng vị trí với cơ sở dữ liệu Cloud Firestore. Để xem vị trí cơ sở dữ liệu, hãy xem chế độ cài đặt vị trí dự án. Bạn không thể sử dụng bộ chứa Người yêu cầu thanh toán cho các thao tác xuất và nhập.

Nếu bộ chứa Cloud Storage không có trong dự án nguồn, bạn phải cấp cho tài khoản dịch vụ mặc định của dự án nguồn quyền truy cập vào bộ chứa đó. Mỗi dự án Google Cloud đều có một tài khoản dịch vụ mặc định được tạo tự động có tên là PROJECT_ID@appspot.gserviceaccount.com. Các thao tác xuất Cloud Firestore sử dụng tài khoản dịch vụ mặc định này để uỷ quyền cho các thao tác với bộ chứa Cloud Storage. Để cấp cho tài khoản dịch vụ mặc định quyền truy cập vào bộ chứa nguồn, hãy cấp cho tài khoản đó vai trò Storage Admin.

Bạn có thể cấp vai trò này bằng công cụ gsutil có trong Cloud Shell:

Bắt đầu Cloud Shell

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

Bạn cũng có thể cấp vai trò này trong bảng điều khiển Google Cloud.

Tắt các thao tác ghi (không bắt buộc)

Nếu ứng dụng của bạn tiếp tục ghi vào cơ sở dữ liệu trong khi bạn thực hiện thao tác xuất, thì có thể bạn sẽ không ghi lại được tất cả các thao tác ghi đó trong tệp xuất. Để xuất dữ liệu từ một trạng thái nhất quán, hãy tắt tính năng ghi vào cơ sở dữ liệu bằng cách cập nhật các quy tắc bảo mật và tạm dừng mọi hoạt động của SDK dành cho quản trị viên.

  1. Cập nhật quy tắc bảo mật

    Trong thẻ Cloud Firestore Quy tắc của bảng điều khiển, hãy cập nhật các quy tắc bảo mật của dự án nguồn để từ chối tất cả các hoạt động ghi. Ví dụ:

      // 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. Dừng ghi từ SDK dành cho quản trị viên

    Các quy tắc bảo mật không ngăn chặn hoạt động ghi từ các môi trường máy chủ đặc quyền được tạo bằng SDK quản trị Firebase hoặc Thư viện ứng dụng máy chủ Google Cloud. Hãy nhớ tạm dừng các thao tác ghi từ máy chủ quản trị bằng cách tắt hoặc cập nhật máy chủ.

Bắt đầu thao tác xuất

Sử dụng lệnh gcloud firestore export để xuất dữ liệu từ dự án nguồn. Bạn có thể xuất tất cả dữ liệu hoặc chỉ một số bộ sưu tập cụ thể. Thay thế [SOURCE_BUCKET] bằng tên của bộ chứa Cloud Storage:

Xuất tất cả dữ liệu
gcloud firestore export gs://[SOURCE_BUCKET] --async
Xuất các bộ sưu tập cụ thể
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

Hãy ghi lại outputURIPrefix của thao tác xuất vì bạn sẽ sử dụng thao tác này sau. Theo mặc định, Cloud Firestore sẽ thêm một tiền tố vào các tệp xuất dựa trên dấu thời gian:

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

Khi thao tác xuất chạy, bạn có thể sử dụng lệnh firestore operations list để xem tiến trình của thao tác:

gcloud firestore operations list

Nhập dữ liệu vào dự án đích

Tiếp theo, hãy cấp cho dự án đích quyền truy cập vào các tệp dữ liệu Cloud Firestore và bắt đầu thao tác nhập.

Cấp cho dự án đích quyền truy cập vào các tệp dữ liệu của bạn

Trước khi có thể bắt đầu thao tác nhập, bạn phải đảm bảo dự án đích có thể truy cập vào các tệp dữ liệu Cloud Firestore.

Di chuyển tệp dữ liệu sang một bộ chứa cục bộ

Nếu vị trí bộ chứa nguồn khác với vị trí Cloud Firestore của dự án đích, bạn phải di chuyển các tệp dữ liệu sang một bộ chứa Cloud Storage ở cùng vị trí với dự án đích.

Di chuyển các tệp dữ liệu sang một bộ chứa Cloud Storage khác bằng cách làm theo các bước trong phần Di chuyển và đổi tên bộ chứa. Đối với tất cả các bước sau, hãy sử dụng bộ chứa mới này làm [SOURCE_BUCKET].

Cấp cho tài khoản dịch vụ của dự án quyền truy cập vào bộ chứa nguồn

Nếu bộ chứa nguồn không nằm trong dự án đích, thì bạn phải cấp quyền truy cập vào bộ chứa nguồn cho tài khoản dịch vụ mặc định của dự án đích. Tài khoản dịch vụ mặc định có tên là [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com. Để cấp cho tài khoản dịch vụ mặc định quyền truy cập vào bộ chứa nguồn, hãy cấp cho tài khoản đó các quyền thích hợp để truy cập vào bộ chứa.

Bạn có thể cấp các vai trò cần thiết bằng công cụ gsutil có trong Cloud Shell:

Bắt đầu Cloud Shell

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

Bạn cũng có thể cấp vai trò này trong bảng điều khiển Google Cloud.

Bắt đầu thao tác nhập

Trước khi bắt đầu thao tác nhập, hãy đảm bảo gcloud được định cấu hình cho đúng dự án:

gcloud config set project [DESTINATION_PROJECT_ID]

Sử dụng lệnh gcloud firestore import để nhập dữ liệu trong bộ chứa nguồn vào dự án đích:

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

Trong đó [EXPORT_PREFIX] khớp với tiền tố trong outputUriPrefix của thao tác xuất. Ví dụ:

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

Khi thao tác xuất chạy, bạn có thể sử dụng lệnh firestore operations list để xem tiến trình của thao tác:

gcloud firestore operations list