Menjadwalkan ekspor database Memorystore for Redis menggunakan Cloud Scheduler

Last reviewed 2023-03-18 UTC

Tutorial ini menunjukkan cara menggunakan Cloud Scheduler dan Cloud Functions untuk mengekspor database Memorystore for Redis ke Cloud Storage secara otomatis. Memiliki ekspor database di Cloud Storage memungkinkan Anda membuat rencana pemulihan dari bencana yang tangguh dan beragam. Misalnya, Anda dapat mengekspor ke region yang berbeda, dan mengimpor ke instance Memorystore for Redis lainnya.

Arsitektur

Tutorial ini mencakup komponen Google Cloud berikut:

Tugas Cloud Scheduler memposting pesan tentang topik Pub/Sub yang berisi informasi tentang ID instance Memorystore, project ID, region tempatnya, dan lokasi Cloud Storage untuk menyimpan pencadangan. Peristiwa ini memicu Cloud Function yang mendapatkan payload ini dan memulai ekspor database pada Memorystore for Redis melalui API-nya. Database menghasilkan ekspor dan menyimpannya ke Cloud Storage. Diagram berikut menunjukkan alur kerja ini.

Alur kerja dari Cloud Scheduler ke Pub/Sub, yang memicu Cloud Function yang memulai ekspor.

Tujuan

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

  4. Enable the Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build APIs.

    Enable the APIs

Sepanjang tutorial ini, Anda menjalankan semua perintah dari Cloud Shell.

Menyiapkan lingkungan Anda

Untuk memulai, pertama-tama Anda konfigurasi lingkungan Anda dan selanjutnya buat peran khusus yang memiliki izin yang diperlukan untuk tutorial ini.

  1. Di Cloud Shell, konfigurasi variabel lingkungan berikut:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="mem-exporter"
    export BUCKET_NAME=${USER}-mem-$(date +%s)
    export MEM_INSTANCE="${DEMO}-instance"
    export FUNCTION_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export MEM_EXPORT_ROLE="memExporter"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-central1"
    
  2. Buat dua peran khusus yang hanya memiliki izin yang diperlukan untuk tutorial ini:

    gcloud iam roles create ${STORAGE_ROLE} --project=${PROJECT_ID} \
        --title="Simple Storage Role" \
        --description="Grant permissions to view and create objects in Cloud Storage" \
        --permissions="storage.objects.create,storage.buckets.get"
    
    gcloud iam roles create ${MEM_EXPORT_ROLE} --project=${PROJECT_ID} \
        --title="Memorystore Exporter Role" \
        --description="Grant permissions to export data from a Memorystore instance to a Cloud Storage bucket" \
        --permissions="redis.instances.export"
    

    Peran ini mengurangi cakupan akses Cloud Functions dan akun layanan Memorystore, dengan mengikuti prinsip hak istimewa terendah.

Buat bucket Cloud Storage dan instance Memorystore

Di bagian ini, pertama-tama Anda membuat bucket Cloud Storage dan instance Memorystore for Redis. Kemudian Anda mengisi Memorystore dengan sampel data.

Membuat bucket Cloud Storage

Anda dapat menggunakan alat command line gsutil untuk membuat bucket Cloud Storage.

  • Buat bucket Cloud Storage tempat Anda ingin menyimpan ekspor data:

    gsutil mb -l ${REGION} gs://${BUCKET_NAME}
    

Buat instance Memorystore dan beri izin ke akun layanannya

Selanjutnya, Anda membuat instance Memorystore dan memberi akun layanannya izin untuk mengekspor data ke Cloud Storage.

  1. Buat instance Memorystore for Redis 4:

    gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
    

    Operasi ini membutuhkan waktu beberapa menit hingga selesai.

  2. Verifikasi bahwa instance Memorystore adalah READY:

    gcloud redis instances list --region=${REGION}
    

    Outputnya terlihat mirip dengan yang berikut ini:

    INSTANCE_NAME   VERSION    REGION       TIER   SIZE_GB  HOST          PORT  NETWORK  RESERVED_IP      STATUS  CREATE_TIME
    redis-instance  REDIS_4_0  us-central1  BASIC  1        10.61.20.131  6379  default  10.61.20.128/29  READY   2020-04-23T18:38:54
    
  3. Beri akun layanan Memorystore Anda izin untuk mengekspor data ke Cloud Storage dengan peran Simple Storage khusus yang Anda buat sebelumnya:

    export MEM_SA=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} \
        --project ${PROJECT_ID} \
        --format "value(persistenceIamIdentity)")
    
    gsutil iam ch ${MEM_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Buat tugas ekspor data terjadwal

Di bagian ini, Anda akan membuat akun layanan khusus dan mengikatnya ke peran Redis khusus yang Anda buat. Kemudian Anda membuat topik Pub/Sub yang digunakan untuk memicu eksekusi Cloud Function. Anda juga akan membuat tugas Cloud Scheduler untuk menjalankan fungsi ekspor data secara berkala.

Buat akun layanan untuk Cloud Function

Langkah pertama adalah membuat akun layanan dan mengikatnya ke peran.

  1. Buat akun layanan IAM untuk Cloud Function yang akan digunakan dan simpan ke variabel:

    gcloud iam service-accounts create ${FUNCTION_NAME} \
        --display-name="Service Account for GCF and Memorystore"
    
    export GCF_SA=$(gcloud iam service-accounts list --filter="${FUNCTION_NAME}" --format="value(email)")
    
  2. Beri akun layanan akses ke peran Memorystore Exporter khusus agar akun layanan dapat meminta ekspor Memorystore:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_SA}" \
        --role="projects/${PROJECT_ID}/roles/${MEM_EXPORT_ROLE}"
    
  3. Beri akun layanan akses ke peran Simple Storage khusus

    gsutil iam ch \
        serviceAccount:${GCF_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} \
        gs://${BUCKET_NAME}
    

Membuat topik Pub/Sub

Langkah selanjutnya adalah membuat topik Pub/Sub yang digunakan untuk memicu Cloud Function yang berinteraksi dengan database Memorystore.

  • Buat topik Pub/Sub:

    gcloud pubsub topics create ${PUBSUB_TOPIC}
    

Buat Cloud Function

Selanjutnya, Anda membuat Cloud Function.

  1. Buat folder untuk kode Cloud Function:

    mkdir scheduler_gcf_code && cd scheduler_gcf_code
    
  2. Buat file main.py dengan menempelkan perintah berikut ke Cloud Shell:

    cat <<EOF  > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('redis', 'v1beta1', http=credentials.authorize(Http()), cache_discovery=False)
    
        datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute
        instance_name=pubsub_message['name'].split("/")[-1]
        uri = f"{pubsub_message['gs']}/backup-{instance_name}-{datestamp}.rdb"
    
        request_body = {
            "outputConfig": {
                "gcsDestination" : {
                    "uri": uri
                }
            }
        }
    
        try:
            request = service.projects().locations().instances().export(
                name=pubsub_message['name'],
                body=request_body
            )
    
            response = request.execute()
        except HttpError as err:
            logging.error(f"Could NOT run backup. Reason: {err}")
        else:
            logging.info(f"Backup task status: {response}")
    EOF
    
  3. Buat file requirements.txt dengan menempelkan perintah berikut ke Cloud Shell:

    cat <<EOF > requirements.txt
    
    google-api-python-client
    Oauth2client
    EOF
    
  4. Deploy kode tersebut.

    gcloud functions deploy ${FUNCTION_NAME} \
        --trigger-topic=${PUBSUB_TOPIC} \
        --runtime=python37 \
        --entry-point=main \
        --service-account=${FUNCTION_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
        --ingress-settings=internal-and-gclb
    

Buat tugas Cloud Scheduler

Terakhir, Anda membuat tugas Cloud Scheduler untuk menjalankan fungsi ekspor data secara berkala.

  1. Simpan nama lengkap Memorystore ke dalam variabel:

    export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
    
  2. Buat tugas Cloud Scheduler untuk menjalankan fungsi ekspor data secara berkala:

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
        --schedule='0 23 * * *' --topic=${PUBSUB_TOPIC} \
        --message-body='{"name":'\"${MEM_NAME}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' \
        --time-zone='America/Los_Angeles' --location=${REGION}
    

    Tugas ini dijadwalkan untuk berjalan pada pukul 23.00 waktu Pasifik setiap hari.

    Isi pesan berisi nama instance Memorystore yang akan diekspor, dan bucket Cloud Storage tujuan.

Uji solusi Anda

Langkah terakhir adalah menguji solusi Anda. Anda mulai dengan menjalankan tugas Cloud Scheduler.

  1. Jalankan tugas Cloud Scheduler secara manual guna memicu ekspor Memorystore untuk database Anda.

    gcloud scheduler jobs run ${SCHEDULER_JOB} --location=${REGION}
    
  2. Cantumkan operasi yang dilakukan pada instance Memorystore, dan pastikan bahwa ada operasi berjenis EXPORT:

    gcloud redis operations list --region=${REGION} --filter="${MEM_INSTANCE}"
    

    Contoh output berikut menampilkan tugas ekspor dengan status DONE True untuk menunjukkan bahwa tugas tersebut telah selesai. Jika status DONE menampilkan False, ini menunjukkan bahwa tugas masih diproses; tunggu sebentar dan kemudian jalankan kembali perintah sebelumnya.

    OPERATION_NAME                                           REGION       TYPE    TARGET                 DONE  CREATE_TIME          DURATION
    operation-1592329364987-5a837122a600c-b22c2703-5077c6b7  us-central1  export  mem-exporter-instance  True  2020-06-16T17:42:45  16S
    
  3. Periksa bucket Cloud Storage untuk melihat apakah file ekspor sudah dibuat atau belum:

    gsutil ls -l gs://${BUCKET_NAME}/*.rdb
    

    Anda akan melihat file bernama backup-INSTANCE_NAME-TIMESTAMP.rdb.

Pembersihan

Anda dapat menghindari tagihan ke akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini dengan mengikuti langkah-langkah berikut. Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial tersebut.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya