Menjadwalkan pencadangan


Tutorial ini menunjukkan cara menjadwalkan pencadangan untuk instance Filestore menggunakan fungsi Cloud Scheduler dan Cloud Run.

Tujuan

  • Buat akun layanan klien untuk Cloud Scheduler yang memiliki kredensial yang diperlukan untuk memanggil fungsi Cloud Run.
  • Buat akun layanan klien untuk fungsi Cloud Run yang memiliki kredensial untuk memanggil endpoint Filestore.
  • Buat fungsi Cloud Run yang membuat cadangan instance Filestore.
  • Buat fungsi Cloud Run yang menghapus cadangan instance Filestore.
  • Buat tugas Cloud Scheduler yang menjalankan salah satu fungsi secara berkala.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  7. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  13. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  14. Jika tidak memiliki instance Filestore di project, Anda harus membuatnya terlebih dahulu.
  15. Buat akun layanan klien untuk fungsi Cloud Scheduler dan Cloud Run

    1. Jika Anda belum melakukannya, dari Google Cloud konsol, klik Activate Cloud Shell.

    2. Buat akun layanan klien yang dijalankan Cloud Scheduler untuk memanggil fungsi Cloud Run. Untuk contoh ini, gunakan perintah iam service-accounts create untuk memberi nama akun schedulerunner dan menetapkan nama tampilan ke "Service Account for FS Backups-Scheduler":

      gcloud iam service-accounts create schedulerunner \
          --display-name="Service Account for FS Backups-Scheduler"
      
    3. Buat akun layanan klien yang dijalankan fungsi Cloud Run untuk memanggil endpoint Filestore. Untuk contoh ini, kita akan memberi nama akun backupagent dan menetapkan nama tampilan ke "Service Account for FS Backups-GCF":

      gcloud iam service-accounts create backupagent \
          --display-name="Service Account for FS Backups-GCF"
      

      Anda dapat memeriksa apakah akun layanan dibuat dengan menjalankan perintah iam service-accounts list:

      gcloud iam service-accounts list
      

      Perintah ini akan menampilkan sesuatu seperti ini:

      NAME                                         EMAIL                                                   DISABLED
      Service Account for FS Backups-GCF           backupagent@$PROJECT_ID.iam.gserviceaccount.com         False
      Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.iam.gserviceaccount.com      False
      

    Menyiapkan variabel lingkungan

    Siapkan variabel lingkungan berikut di lingkungan lokal Anda:

    • Google Cloud project ID dan project:

      export PROJECT_ID=`gcloud config get-value core/project`
      export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format="value(projectNumber)"`
      
    • Agen layanan Cloud Scheduler dan akun layanan klien untuk fungsi Cloud Scheduler dan Cloud Run:

      export SCHEDULER_SA=service-$PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
      export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.iam.gserviceaccount.com
      export GCF_CLIENT_SA=backupagent@$PROJECT_ID.iam.gserviceaccount.com
      
    • Instance Filestore Anda:

      export SOURCE_INSTANCE_LOCATION=fs-location
      export SOURCE_INSTANCE_NAME=instance-id
      export SHARE_NAME=file-share-name
      

      Ganti kode berikut:

      • fs-location dengan zona atau region tempat instance Filestore sumber berada.
      • instance-id dengan ID instance Filestore sumber.
      • file-share-name dengan nama yang Anda tentukan untuk berbagi file NFS yang ditampilkan dari instance.
    • Siapkan variabel lingkungan untuk cadangan Filestore Anda:

      export BACKUP_REGION=backup-region
      

      Ganti backup-region dengan region tempat Anda ingin menyimpan cadangan.

    Membuat fungsi yang membuat cadangan

    1. Di Google Cloud konsol, buka halaman fungsi Cloud Run.

      Buka halaman fungsi Cloud Run

    2. Klik Write a function dan konfigurasi fungsi sebagai berikut:

      • Konfigurasi:
      • Pemicu:
        • Pemicu tidak perlu disetel untuk contoh ini.
      • Autentikasi: Pilih Require authentication.
      • Ingress: Pilih All.
      • Container(s), Volumes, Networking, Security
        • Buka tab Keamanan, lalu pilih Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) dari menu.
    3. Klik Buat dan lanjutkan konfigurasi sebagai berikut:

      • Titik entri fungsi: Masukkan create_backup.
      • Tambahkan dependensi berikut ke file requirements.txt Anda:

        functions-framework==3.*
        google-auth==2.29.0
        requests==2.31.0
        

        Bergantung pada kasus penggunaan, Anda mungkin perlu menentukan dependensi lain bersama dengan nomor versinya yang sesuai. Untuk mengetahui informasi selengkapnya, lihat Paket yang sudah diinstal.

      • Salin contoh kode Python berikut ke dalam file main.py menggunakan editor inline:

        Membuat cadangan

        Contoh kode ini membuat cadangan bernama mybackup- yang ditambahkan dengan waktu pembuatan.

        PROJECT_ID = 'project-id'
        SOURCE_INSTANCE_LOCATION = 'fs-location'
        SOURCE_INSTANCE_NAME = 'instance-id'
        SOURCE_FILE_SHARE_NAME = 'file-share-name'
        BACKUP_REGION = 'backup-region'
        
        import functions_framework
        import google.auth
        import google.auth.transport.requests
        from google.auth.transport.requests import AuthorizedSession
        import time
        import requests
        import json
        
        credentials, project = google.auth.default()
        request = google.auth.transport.requests.Request()
        credentials.refresh(request)
        authed_session = AuthorizedSession(credentials)
        
        def get_backup_id():
            return "mybackup-" + time.strftime("%Y%m%d-%H%M%S")
        
        @functions_framework.http
        def create_backup(request):
            trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?backupId={}".format(PROJECT_ID, BACKUP_REGION, get_backup_id())
            headers = {
              'Content-Type': 'application/json'
            }
            post_data = {
              "description": "my new backup",
              "source_instance": "projects/{}/locations/{}/instances/{}".format(PROJECT_ID, SOURCE_INSTANCE_LOCATION, SOURCE_INSTANCE_NAME),
              "source_file_share": "{}".format(SOURCE_FILE_SHARE_NAME)
            }
            print("Making a request to " + trigger_run_url)
            r = authed_session.post(url=trigger_run_url, headers=headers, data=json.dumps(post_data))
            data = r.json()
            print(data)
            if r.status_code == requests.codes.ok:
              print(str(r.status_code) + ": The backup is uploading in the background.")
            else:
              raise RuntimeError(data['error'])
            return "Backup creation has begun!"
        

        Ganti kode berikut:

        • project-id dengan Google Cloud project ID instance Filestore sumber.
        • fs-location dengan zona atau region instance Filestore sumber.
        • instance-id dengan nama instance Filestore sumber.
        • file-share-name dengan nama berbagi file.
        • backup-region dengan region untuk menyimpan cadangan.
        1. Klik Uji.

          Sesi tab baru akan terbuka di Cloud Shell. Di dalamnya, pesan berikut akan ditampilkan jika berhasil:

          Backup creation has begun!
          
        2. Klik Save and redeploy dan tunggu hingga deployment selesai.

        3. Beralih kembali ke tab Cloud Shell sebelumnya.

        Menghapus cadangan

        Contoh kode ini menghapus cadangan yang lebih lama dari periode yang telah ditentukan sebelumnya.

        Anda hanya dapat menghapus satu cadangan per instance sumber dalam satu waktu. Untuk mengetahui informasi selengkapnya, lihat Pencadangan.

        Konfigurasi fungsi ini dengan cara yang sama seperti fungsi yang Anda gunakan untuk membuat cadangan, menggunakan perubahan berikut:

        • Nama fungsi: deletefsbackup.
        • Entry point: delete_backup.
        PROJECT_ID = 'project-id'
        BACKUP_REGION = 'region'
        BACKUP_RETENTION_TIME_HRS = hours
        
        import functions_framework
        import google.auth
        import google.auth.transport.requests
        from google.auth.transport.requests import AuthorizedSession
        import time
        import requests
        import json
        
        credentials, project = google.auth.default()
        request = google.auth.transport.requests.Request()
        credentials.refresh(request)
        authed_session = AuthorizedSession(credentials)
        
        retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
        
        @functions_framework.http
        def delete_backup(request):
            now = time.time()
            backup_list = []
            trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups".format(PROJECT_ID, BACKUP_REGION)
            r = authed_session.get(trigger_run_url)
            data = r.json()
            if not data:
                print("No backups to delete.")
                return "No backups to delete."
            else:
                backup_list.extend(data['backups'])
                while "nextPageToken" in data.keys():
                    nextPageToken = data['nextPageToken']
                    trigger_run_url_next = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                    r = authed_session.get(trigger_run_url_next)
                    data = r.json()
                    backup_list.extend(data['backups'])
            for i in backup_list:
                backup_time = i['createTime']
                backup_time = backup_time[:-4]
                backup_time = float(time.mktime(time.strptime(backup_time, "%Y-%m-%dT%H:%M:%S.%f")))
                i['backup_timestamp'] = backup_time
            sorted_backup_list = sorted(backup_list, key=lambda d: d['backup_timestamp'])
            oldest_backup = sorted_backup_list[0]
            if now - oldest_backup['backup_timestamp'] > retention_seconds:
                print(oldest_backup['name'] + " is older than the indicated retention time.")
                r = authed_session.delete("https://file.googleapis.com/v1/{}".format(oldest_backup['name']))
                data = r.json()
                print(data)
                if r.status_code == requests.codes.ok:
                    print(str(r.status_code) + ": Deleting " + oldest_backup['name'] + " in the background.")
                else:
                    raise RuntimeError(data['error'])
                return "Backup deletion has begun!"
            return "All backups are within the indicated retention period."
        

        Ganti kode berikut:

        • project-id dengan ID project Google Cloud cadangan.
        • region dengan region tempat cadangan berada. Pencadangan, tugas scheduler, dan fungsi harus berada di lokasi yang sama.
        • hours dengan jumlah jam untuk menyimpan cadangan. Misalnya, jika Anda ingin menyimpan cadangan selama 10 hari, masukkan 240.

    Menetapkan peran IAM ke akun layanan klien

    1. Tambahkan agen layanan Cloud Scheduler ke kebijakan IAM akun layanan klien Cloud Scheduler dengan peran roles/cloudscheduler.serviceAgent. Hal ini memungkinkan agen layanan meniru identitas akun layanan klien untuk memanggil fungsi yang membuat cadangan. Jalankan perintah iam service-accounts add-iam-policy-binding:

      gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
          --member=serviceAccount:$SCHEDULER_SA \
          --role=roles/cloudscheduler.serviceAgent
      
    2. Beri akun layanan klien fungsi Cloud Run peran roles/file.editor agar dapat melakukan panggilan ke endpoint Filestore. Jalankan perintah projects add-iam-policy-binding:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member=serviceAccount:$GCF_CLIENT_SA \
          --role=roles/file.editor
      
    3. Berikan peran roles/run.invoker ke akun layanan klien Cloud Scheduler untuk fungsi yang ingin Anda gunakan. Jalankan perintah run services add-iam-policy-binding berikut:

      Membuat cadangan

      gcloud run services add-iam-policy-binding fsbackup \
          --member serviceAccount:$SCHEDULER_CLIENT_SA \
          --role roles/run.invoker \
          --region=us-central1
      

      Sekarang, hanya akun layanan klien Cloud Scheduler yang dapat memanggil fsbackup.

      Menghapus cadangan

      gcloud run services add-iam-policy-binding deletefsbackup \
          --member serviceAccount:$SCHEDULER_CLIENT_SA \
          --role roles/run.invoker
      

      Sekarang, hanya akun layanan klien Cloud Scheduler yang dapat memanggil deletefsbackup.

    Buat tugas Cloud Scheduler yang memicu fungsi sesuai jadwal yang ditentukan

    Membuat cadangan

    1. Dalam contoh untuk tutorial ini, jika Anda ingin menjadwalkan pencadangan setiap hari kerja pada pukul 22.00, Anda akan menggunakan perintah scheduler jobs create http berikut:

      gcloud scheduler jobs create http fsbackupschedule \
          --schedule "0 22 * * 1-5" \
          --http-method=GET \
          --uri=https://fsbackup-$PROJECT_NUMBER.us-central1.run.app \
          --oidc-service-account-email=$SCHEDULER_CLIENT_SA \
          --location=us-central1
      

      Flag --schedule adalah tempat Anda menentukan frekuensi tugas dijalankan menggunakan format unix-cron. Untuk mengetahui detailnya, lihat Mengonfigurasi jadwal cron job.

      Anda dapat membuat maksimal enam cadangan per instance per jam.

    2. Mulai tugas Cloud Scheduler yang dibuat pada langkah sebelumnya. Dalam contoh kita, gunakan perintah scheduler jobs runs untuk menjalankannya segera:

      gcloud scheduler jobs run fsbackupschedule
      

      Tugas fsbackupschedule memanggil fungsi fsbackup segera setelah Anda menjalankan perintah, lalu memanggilnya lagi setiap hari kerja pukul 22.00 hingga tugas dijeda.

    3. Periksa log untuk fungsi fsbackup guna melihat apakah fungsi tersebut dieksekusi dengan benar dan menampilkan status 200.

      Untuk melihat log Anda di konsol Google Cloud , gunakan Logs Explorer:

      1. Di konsol Google Cloud , buka halaman Logs Explorer:

        Buka Logs Explorer

        Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

        Log terbaru Anda ditampilkan di panel Query results.

    4. Periksa status cadangan yang ada menggunakan perintah backups list:

      gcloud filestore backups list
      

      Perintah ini menampilkan sesuatu yang mirip dengan:

      NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
      mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
      

    Menghapus cadangan

    1. Dalam contoh untuk tutorial ini, jika Anda ingin menjadwalkan operasi untuk menghapus cadangan setiap hari kerja pukul 22.00, Anda akan menggunakan perintah scheduler jobs create http:

      gcloud scheduler jobs create http deletefsbackupschedule \
          --schedule "0 22 * * 1-5" \
          --http-method=GET \
          --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup \
          --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
          --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup
      

      Flag --schedule adalah tempat Anda menentukan frekuensi tugas dijalankan menggunakan format unix-cron. Untuk mengetahui detailnya, lihat Mengonfigurasi jadwal cron job.

      Operasi delete pencadangan yang terkait dengan instance sumber yang sama harus terjadi satu per satu. Untuk mengetahui informasi selengkapnya, lihat Cadangan.

    2. Mulai tugas Cloud Scheduler yang dibuat pada langkah sebelumnya. Dalam contoh ini, kita menggunakan perintah scheduler jobs runs untuk menjalankannya dengan segera:

      gcloud scheduler jobs run deletefsbackupschedule
      

      Tugas deletefsbackupschedule memanggil fungsi deletefsbackup segera setelah Anda menjalankan perintah, lalu memanggilnya lagi setiap hari kerja pukul 22.00 hingga tugas dijeda.

    3. Periksa log untuk fungsi deletefsbackup guna melihat apakah fungsi tersebut dieksekusi dengan benar dan menampilkan status 200.

      Untuk melihat log Anda di konsol Google Cloud , gunakan Logs Explorer:

      1. Di konsol Google Cloud , buka halaman Logs Explorer:

        Buka Logs Explorer

        Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

        Log terbaru Anda ditampilkan di panel Query results.

    4. Periksa status cadangan yang ada menggunakan perintah backups list:

      gcloud filestore backups list
      

      Perintah ini menampilkan sesuatu yang mirip dengan:

      NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
      mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
      

    Pemberitahuan kuota rendah untuk pencadangan

    Jika penerapan pencadangan terjadwal membuat Anda berisiko kehabisan kuota pencadangan, sebaiknya siapkan pemberitahuan kuota pencadangan rendah. Dengan cara ini, Anda akan diberi tahu saat kuota pencadangan hampir habis.

    Pembersihan

    Setelah menyelesaikan tutorial, Anda dapat membersihkan resource yang dibuat agar resource tersebut berhenti menggunakan kuota dan dikenai biaya. Bagian berikut menjelaskan cara menghapus atau menonaktifkan resource ini.

    Menghapus project

    Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

    Untuk menghapus project:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Langkah berikutnya