Mengotomatiskan pengoptimalan biaya dengan Cloud Functions, Cloud Scheduler, dan Cloud Monitoring


Dokumen ini menunjukkan cara menggunakan Cloud Functions untuk mengidentifikasi dan membersihkan resource cloud yang terbuang, menjadwalkan fungsi untuk dijalankan dengan Cloud Scheduler, dan gunakan Cloud Monitoring kebijakan pemberitahuan untuk menjalankan berdasarkan penggunaan yang diamati. Dokumen ini ditujukan bagi developer, SREs, cloud architects, dan admin infrastruktur cloud yang mencari pendekatan sistematis dan otomatis untuk mengidentifikasi serta mengurangi pengeluaran cloud yang boros.

Dokumen ini mengasumsikan bahwa Anda sudah memahami hal-hal berikut:

Tujuan

  • Hapus alamat IP yang tidak digunakan: Di Google Cloud, alamat IP statis adalah resource gratis yang ditambahkan ke instance load balancer atau virtual machine (VM). Jika alamat IP statis sudah dicadangkan, tetapi tidak digunakan, biaya per jam akan terakumulasi. Pada aplikasi yang sangat bergantung pada alamat IP statis dan penyediaan dinamis berskala besar, pemborosan ini dapat menjadi signifikan dari waktu ke waktu.
  • Hapus persistent disk terlantar atau tidak terpakai: Persistent disks tidak digunakan atau terlantar jika dibuat tanpa pernah dipasang ke VM, atau jika mesin memiliki beberapa disk dan satu atau beberapa disk terlepas.
  • Memigrasikan ke kelas penyimpanan yang lebih murah: Google Cloud menawarkan multiple classes of object storage. Gunakan kelas yang paling sesuai dengan kebutuhan Anda.

Arsitektur

Diagram berikut menjelaskan bagian pertama deployment, yaitu saat Anda menjadwalkan Cloud Function untuk mengidentifikasi dan membersihkan alamat IP yang tidak digunakan.

Arsitektur Cloud Function yang mengidentifikasi dan membersihkan alamat IP yang tidak digunakan.

Contoh pertama mencakup hal berikut:

  • Membuat VM Compute Engine dengan alamat IP eksternal statis dan alamat IP eksternal statis terpisah yang tidak digunakan.
  • Men-deploy Cloud Function untuk mengidentifikasi alamat yang tidak digunakan.
  • Membuat tugas Cloud Scheduler untuk menjadwalkan fungsi agar dijalankan menggunakan pemicu HTTP.

Pada diagram berikut, Anda menjadwalkan Cloud Function untuk mengidentifikasi dan membersihkan persistent disk yang tidak terpasang dan terlantar.

Arsitektur Cloud Function yang mengidentifikasi dan membersihkan persistent disk yang tidak digunakan.

Contoh kedua mencakup hal berikut:

  • Membuat VM Compute Engine dengan dua persistent disk dan persistent disk terpisah yang tidak terpasang. Salah satu disk terlantar dengan dilepas dari VM.
  • Men-deploy Cloud Function untuk mengidentifikasi persistent disk yang tidak terpasang dan terlantar.
  • Membuat tugas Cloud Scheduler untuk menjadwalkan eksekusi Cloud Function menggunakan pemicu HTTP.

Pada diagram berikut, Anda memicu Cloud Function untuk migrasikan bucket penyimpanan ke kelas penyimpanan yang lebih murah dari kebijakan pemberitahuan Monitoring.

Arsitektur Cloud Function yang memigrasikan bucket penyimpanan.

Contoh ketiga mencakup hal berikut:

  • Membuat dua bucket penyimpanan, menambahkan file ke bucket penayangan, dan dan menghasilkan traffic.
  • Membuat dasbor Monitoring untuk memvisualisasikan penggunaan bucket.
  • Men-deploy Cloud Function untuk memigrasikan bucket tanpa aktivitas ke kelas penyimpanan yang lebih murah.
  • Memicu fungsi menggunakan payload yang dimaksudkan untuk menyimulasikan notifikasi yang diterima dari kebijakan pemberitahuan Monitoring.

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. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

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

  4. Enable the Compute Engine, Cloud Functions, and Cloud Storage APIs.

    Enable the APIs

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

    Buka pemilih project

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

  7. Enable the Compute Engine, Cloud Functions, and Cloud Storage APIs.

    Enable the APIs

  8. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  9. Anda menjalankan semua perintah di dokumen ini dari Cloud Shell.

Menyiapkan lingkungan Anda

Pada bagian ini, Anda akan mengkonfigurasi infrastruktur dan identitas yang diperlukan untuk arsitektur ini.

  1. Di Cloud Shell, clone repositori dan ubah ke gcf-automated-resource-cleanup direktori:

    git clone https://github.com/GoogleCloudPlatform/gcf-automated-resource-cleanup.git && cd gcf-automated-resource-cleanup/
    
  2. Tetapkan variabel lingkungan dan jadikan folder repositori sebagai $WORKDIR tempat Anda menjalankan semua perintah:

    export PROJECT_ID=$(gcloud config list \
        --format 'value(core.project)' 2>/dev/null)
        WORKDIR=$(pwd)
    
  3. Instal Apache Bench, alat pemuatan open source:

    sudo apt-get install apache2-utils
    

Membersihkan alamat IP yang tidak digunakan

Pada bagian ini, Anda akan menyelesaikan langkah-langkah berikut:

  • Membuat dua alamat IP statis.
  • Membuat VM yang menggunakan alamat IP statis.
  • Periksa kode Cloud Functions.
  • Men-deploy Cloud Function.
  • Uji Cloud Function menggunakan tugas Cloud Scheduler.

Membuat alamat IP

  1. Di Cloud Shell, ubahunused-ipke direktori :

    cd $WORKDIR/unused-ip
    
  2. Ekspor nama alamat IP sebagai variabel:

    export USED_IP=used-ip-address
    export UNUSED_IP=unused-ip-address
    
  3. Buatlah dua alamat IP statis:

    gcloud compute addresses create $USED_IP \
        --project=$PROJECT_ID --region=us-central1
    gcloud compute addresses create $UNUSED_IP \
        --project=$PROJECT_ID --region=us-central1
    

    Ini contoh menggunakan regionus-central1, tetapi Anda dapat memilih region yang berbeda dan merujuknya secara konsisten di seluruh dokumen ini.

  4. Konfirmasi bahwa dua alamat telah dibuat:

    gcloud compute addresses list --filter="region:(us-central1)"
    

    Dalam output, status RESERVED berarti bahwa alamat IP tidak digunakan:

    NAME               ADDRESS/RANGE  TYPE      REGION       SUBNET  STATUS
    unused-ip-address  35.232.144.85  EXTERNAL  us-central1          RESERVED
    used-ip-address    104.197.56.87  EXTERNAL  us-central1          RESERVED
    
  5. Tetapkan alamat IP yang digunakan sebagai variabel lingkungan:

    export USED_IP_ADDRESS=$(gcloud compute addresses describe $USED_IP \
        --region=us-central1 --format=json | jq -r '.address')
    

Membuat VM

  1. Di Cloud Shell, buat instance:

    gcloud compute instances create static-ip-instance \
        --zone=us-central1-a \
        --machine-type=n1-standard-1 \
        --subnet=default \
        --address=$USED_IP_ADDRESS
    
  2. Pastikan salah satu alamat IP sedang digunakan:

    gcloud compute addresses list --filter="region:(us-central1)"
    

    Outputnya mirip dengan hal berikut ini:

    NAME               ADDRESS/RANGE  TYPE      REGION       SUBNET  STATUS
    unused-ip-address  35.232.144.85  EXTERNAL  us-central1          RESERVED
    used-ip-address    104.197.56.87  EXTERNAL  us-central1          IN_USE
    

Memeriksa kode Cloud Function

  • Di Cloud Shell, tampilkan output bagian utama kode:

    cat $WORKDIR/unused-ip/function.js | grep "const compute" -A 31
    

    Outputnya adalah sebagai berikut:

    const compute = new Compute();
    compute.getAddresses(function(err, addresses){ // gets all addresses across regions
         if(err){
             console.log("there was an error: " + err);
         }
         if (addresses == null) {
             console.log("no addresses found");
             return;
         }
         console.log("there are " + addresses.length + " addresses");
    
         // iterate through addresses
         for (let item of addresses){
    
              // get metadata for each address
              item.getMetadata(function(err, metadata, apiResponse) {
    
                  // if the address is not used AND if it's at least ageToDelete days old:
                  if ((metadata.status=='RESERVED') & (calculateAge(metadata.creationTimestamp) >= ageToDelete)){
                      // delete address
                      item.delete(function(err, operation, apiResponse2){
                          if (err) {
                              console.log("could not delete address: " + err);
                          }
                      })
                  }
              })
          }
           // return number of addresses evaluated
          res.send("there are " + addresses.length + " total addresses");
      });
    }
    

    Pada contoh kode sebelumnya, perhatikan hal-hal berikut:

    • compute.getAddresses(function(err, addresses){ // gets all addresses across regions
      

      Gunakan metode getAddresses untuk mengambil alamat IP di semua region dalam project.

    • // get metadata for each address
      item.getMetadata(function(err, metadata, apiResponse) {
         // if the address is not used:
             if (metadata.status=='RESERVED'){
      

      Dapatkan metadata untuk setiap alamat IP dan periksa kolom STATUS-nya.

    • if ((metadata.status=='RESERVED') &
      (calculateAge(metadata.creationTimestamp) >= ageToDelete)){
      

      Periksa apakah alamat IP sedang digunakan, hitunglah usianya menggunakan fungsi bantuan, dan membandingkan usianya dengan konstanta (ditetapkan ke 0 untuk tujuan contoh).

    • // delete address
      item.delete(function(err, operation, apiResponse2){
      

      Menghapus alamat IP.

Men-deploy Cloud Function

  1. Di Cloud Shell, deploy Cloud Function:

    gcloud functions deploy unused_ip_function --trigger-http --runtime=nodejs8
    
  2. Tetapkan URL pemicu sebagai variabel lingkungan:

    export FUNCTION_URL=$(gcloud functions describe unused_ip_function \
        --format=json | jq -r '.httpsTrigger.url')
    

Menjadwalkan dan menguji Cloud Function

  1. Di Cloud Shell, buatlah tugas Cloud Scheduler untuk menjalankan Cloud Function pada pukul 02.00 setiap hari:

    gcloud scheduler jobs create http unused-ip-job \
        --schedule="* 2 * * *" \
        --uri=$FUNCTION_URL
    
  2. Uji tugas dengan memicunya secara manual:

    gcloud scheduler jobs run unused-ip-job
    
  3. Konfirmasi bahwa alamat IP yang tidak digunakan telah dihapus:

    gcloud compute addresses list --filter="region:(us-central1)"
    

    Outputnya mirip dengan hal berikut ini:

    NAME             ADDRESS/RANGE  TYPE      REGION       SUBNET  STATUS
    used-ip-address  104.197.56.87  EXTERNAL  us-central1          IN_USE
    

Membersihkan persistent disk yang tidak terpakai dan terlantar

Pada bagian ini, Anda akan menyelesaikan langkah-langkah berikut:

  • Membuat dua persistent disk.
  • Membuat VM yang menggunakan salah satu disk.
  • Melepaskan disk dari VM.
  • Meninjau kode Cloud Function.
  • Men-deploy Cloud Function.
  • Uji Cloud Function menggunakan tugas Cloud Scheduler.

Membuat persistent disk

  1. Di Cloud Shell, ubah ke direktori unattached-pd:

    cd $WORKDIR/unattached-pd
    
  2. Mengekspor nama disk sebagai variabel lingkungan:

    export ORPHANED_DISK=orphaned-disk
    export UNUSED_DISK=unused-disk
    
  3. Buat kedua disk tersebut:

    gcloud beta compute disks create $ORPHANED_DISK \
       --project=$PROJECT_ID \
       --type=pd-standard \
       --size=500GB \
       --zone=us-central1-a
    gcloud beta compute disks create $UNUSED_DISK \
        --project=$PROJECT_ID \
        --type=pd-standard \
        --size=500GB \
        --zone=us-central1-a
    
  4. Pastikan kedua disk telah dibuat:

    gcloud compute disks list
    

    Outputnya adalah sebagai berikut:

    NAME                LOCATION       LOCATION_SCOPE SIZE_GB TYPE         STATUS
    orphaned-disk       us-central1-a  zone           500     pd-standard  READY
    static-ip-instance  us-central1-a  zone           10      pd-standard  READY
    unused-disk         us-central1-a  zone           500     pd-standard  READY
    

Membuat VM dan memeriksa disk

  1. Di Cloud Shell, buat instance:

    gcloud compute instances create disk-instance \
        --zone=us-central1-a \
        --machine-type=n1-standard-1 \
        --disk=name=$ORPHANED_DISK,device-name=$ORPHANED_DISK,mode=rw,boot=no
    
  2. Periksa disk yang terpasang ke VM:

    gcloud compute disks describe $ORPHANED_DISK \
        --zone=us-central1-a \
        --format=json | jq
    

    Outputnya mirip dengan hal berikut ini:

    {
      "creationTimestamp": "2019-06-12T12:21:25.546-07:00",
      "id": "7617542552306904666",
      "kind": "compute#disk",
      "labelFingerprint": "42WmSpB8rSM=",
      "lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00",
      "name": "orphaned-disk",
      "physicalBlockSizeBytes": "4096",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/disks/orphaned-disk",
      "sizeGb": "500",
      "status": "READY",
      "type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/diskTypes/pd-standard",
      "users": [
        "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/instances/disk-instance"
      ],
      "zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a"
    }
    

    Pada contoh kode sebelumnya, perhatikan hal-hal berikut:

    • users mengidentifikasi VM tempat disk dipasang.
    • lastAttachTimestamp mengidentifikasi waktu disk terakhir kali dipasang ke VM.
  3. Periksa disk yang belum dipasang ke VM:

    gcloud compute disks describe $UNUSED_DISK \
        --zone=us-central1-a \
        --format=json | jq
    

    Outputnya mirip dengan hal berikut ini:

    {
      "creationTimestamp": "2019-06-12T12:21:30.905-07:00",
      "id": "1313096191791918677",
      "kind": "compute#disk",
      "labelFingerprint": "42WmSpB8rSM=",
      "name": "unused-disk",
      "physicalBlockSizeBytes": "4096",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/disks/unused-disk",
      "sizeGb": "500",
      "status": "READY",
      "type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/diskTypes/pd-standard",
      "zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a"
    }
    

    Dalam contoh kode sebelumnya, berikut hal penting:

    • Disk tidak memiliki users yang tercantum karena saat ini tidak digunakan oleh VM.
    • Disk tidak memiliki lastAttachedTimestamp karena tidak pernah digunakan.
  4. Melepaskan persistent disk terlantar dari VM:

    gcloud compute instances detach-disk disk-instance \
        --device-name=$ORPHANED_DISK \
        --zone=us-central1-a
    
  5. Memeriksa disk terlantar:

    gcloud compute disks describe $ORPHANED_DISK \
        --zone=us-central1-a \
        --format=json | jq
    

    Outputnya mirip dengan hal berikut ini:

    {
      "creationTimestamp": "2019-06-12T12:21:25.546-07:00",
      "id": "7617542552306904666",
      "kind": "compute#disk",
      "labelFingerprint": "42WmSpB8rSM=",
      "lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00",
      "lastDetachTimestamp": "2019-06-12T12:34:56.040-07:00",
      "name": "orphaned-disk",
      "physicalBlockSizeBytes": "4096",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/disks/orphaned-disk",
      "sizeGb": "500",
      "status": "READY",
      "type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a/diskTypes/pd-standard",
      "zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/us-central1-a"
    }
    

    Dalam contoh kode sebelumnya, berikut hal penting:

    • Tidak ada users yang tercantum di disk, yang menunjukkan bahwa disk saat ini sedang tidak digunakan.
    • Kini ada entri lastDetachTimestamp, yang menunjukkan kapan disk terakhir kali dilepaskan dari VM, dan juga kapan disk terakhir digunakan.
    • Kolom lastAttachTimestamp masih ada.

Memeriksa kode Cloud Function

  1. Di Cloud Shell, tampilkan output di bagian kode yang mengambil semua persistent disk dalam project:

    cat $WORKDIR/unattached-pd/main.py | grep "(request)" -A 12
    

    Outputnya adalah sebagai berikut:

    def delete_unattached_pds(request):
        # get list of disks and iterate through it:
        disksRequest = compute.disks().aggregatedList(project=project)
        while disksRequest is not None:
            diskResponse = disksRequest.execute()
            for name, disks_scoped_list in diskResponse['items'].items():
                if disks_scoped_list.get('warning') is None:
                    # got disks
                    for disk in disks_scoped_list['disks']: # iterate through disks
                        diskName = disk['name']
                        diskZone = str((disk['zone'])).rsplit('/',1)[1]
                        print (diskName)
                        print (diskZone)
    

    Fungsi ini menggunakan metode aggregatedList untuk mendapatkan semua persistent disk di project Google Cloud tempatnya berjalan dan melakukan iterasi di setiap disk.

  2. Tampilkan bagian kode yang memeriksa kolom lastAttachTimestamp dan hapus disk jika tidak ada:

    cat $WORKDIR/unattached-pd/main.py | grep "handle never" -A 11
    

    Outputnya adalah sebagai berikut:

    # handle never attached disk - delete it
    # lastAttachedTimestamp is not present
    if disk.get("lastAttachTimestamp") is None:
           print ("disk " + diskName + " was never attached - deleting")
           deleteRequest = compute.disks().delete(project=project,
                  zone=diskZone,
                  disk=diskName)
           deleteResponse = deleteRequest.execute()
           waitForZoneOperation(deleteResponse, project, diskZone)
           print ("disk " + diskName + " was deleted")
           Continue
    

    Bagian ini menghapus disk jika lastAttachTimestamp tidak ada. Artinya disk ini tidak pernah digunakan.

  3. Tampilkan bagian kode yang menghitung usia disk jika disk itu terlantar, buat snapshot-nya, dan hapus:

    cat $WORKDIR/unattached-pd/main.py | grep "handle detached" -A 32
    

    Outputnya adalah sebagai berikut:

    # handle detached disk - snapshot and delete
    # lastAttachTimestamp is present AND users is not present AND it meets the age criterium
    if disk.get("users") is None \
        and disk.get("lastDetachTimestamp") is not None \
        and diskAge(disk['lastDetachTimestamp'])>=deleteAge:
    
        print ("disk " + diskName + " has no users and has been detached")
        print ("disk meets age criteria for deletion")
    
        # take a snapshot
        snapShotName = diskName + str(int(time.time()))
        print ("taking snapshot: " + snapShotName)
        snapshotBody = {
            "name": snapShotName
        }
        snapshotRequest = compute.disks().createSnapshot(project=project,
             zone=diskZone,
             disk=diskName,
             body=snapshotBody)
        snapshotResponse = snapshotRequest.execute()
        waitForZoneOperation(snapshotResponse, project, diskZone)
        print ("snapshot completed")
    
        # delete the disk
        print ("deleting disk " + diskName)
        deleteRequest = compute.disks().delete(project=project,
            zone=diskZone,
            disk=diskName)
        deleteResponse = deleteRequest.execute()
        waitForZoneOperation(deleteResponse, project, diskZone)
        print ("disk " + diskName + " was deleted")
        continue
    

    Bagian kode ini digunakan saat disk memiliki users yang tercantum dan lastDetachTimestamp ada, yang berarti disk saat ini tidaknot in digunakan, tetapi digunakan suatu waktu. Dalam hal ini, Cloud Function akan membuat snapshot disk untuk menyimpan data, lalu menghapus disk tersebut.

Men-deploy Cloud Function

  1. Di Cloud Shell, deploy Cloud Function:

    gcloud functions deploy delete_unattached_pds \
        --trigger-http --runtime=python37
    
  2. Tetapkan URL pemicu Cloud Function sebagai variabel lingkungan:

    export FUNCTION_URL=$(gcloud functions describe delete_unattached_pds \
        --format=json | jq -r '.httpsTrigger.url')
    

Menjadwalkan dan menguji Cloud Function

  1. Di Cloud Shell, buatlah tugas Cloud Scheduler untuk menjalankan Cloud Function pada pukul 02.00 setiap hari:

    gcloud scheduler jobs create http unattached-pd-job \
        --schedule="* 2 * * *" \
        --uri=$FUNCTION_URL
    
  2. Uji tugas:

    gcloud scheduler jobs run unattached-pd-job
    
  3. Pastikan bahwa snapshot disk terlantar telah dibuat:

    gcloud compute snapshots list
    

    Outputnya mirip dengan yang berikut ini:

    NAME                     DISK_SIZE_GB  SRC_DISK                           STATUS
    orphaned-disk1560455894  500           us-central1-a/disks/orphaned-disk  READY
    
  4. Pastikan disk yang tidak digunakan dan disk terlantar telah dihapus:

    gcloud compute disks list
    

    Outputnya adalah sebagai berikut:

    NAME                LOCATION       LOCATION_SCOPE SIZE_GB  TYPE         STATUS
    disk-instance       us-central1-a  zone           10       pd-standard  READY
    static-ip-instance  us-central1-a  zone           10       pd-standard  READY
    

Memigrasikan bucket penyimpanan ke kelas penyimpanan yang lebih murah

Google Cloud menyediakan aturan siklus proses objek penyimpanan yang dapat Anda gunakan untuk memindahkan objek secara otomatis ke berbagai kelas penyimpanan berdasarkan serangkaian atribut, seperti tanggal pembuatan atau status aktifnya singkat ini. Namun, aturan ini tidak tahu apakah objek telah diakses. Terkadang, Anda mungkin ingin memindahkan objek yang lebih baru ke Nearline Storage jika objek tersebut tidak diakses dalam jangka waktu tertentu.

Pada bagian ini, Anda akan menyelesaikan langkah-langkah berikut:

  • Membuat dua bucket Cloud Storage.
  • Menambahkan objek ke salah satu bucket.
  • Mengkonfigurasi Monitoring untuk mengamati akses objek bucket.
  • Meninjau kode Cloud Function yang memigrasi objek dari bucket Regional Storage ke bucket Nearline Storage.
  • Men-deploy Cloud Function.
  • Uji Cloud Function menggunakan pemberitahuan Monitoring.

Membuat bucket Cloud Storage dan tambahkan file

  1. Di Cloud Shell, ubah ke direktori migrate-storage:

    cd $WORKDIR/migrate-storage
    
  2. Buat bucket Cloud Storage serving-bucket yang nanti digunakan untuk mengubah kelas penyimpanan:

    export PROJECT_ID=$(gcloud config list \
        --format 'value(core.project)' 2>/dev/null)
    gsutil mb -c regional -l us-central1 gs://${PROJECT_ID}-serving-bucket
    
  3. Buat bucket menjadi publik.

    gsutil acl ch -u allUsers:R gs://${PROJECT_ID}-serving-bucket
    
  4. Mengupload file teks ke bucket

    gsutil cp $WORKDIR/migrate-storage/testfile.txt  \
        gs://${PROJECT_ID}-serving-bucket
    
  5. Buat file menjadi publik:

    gsutil acl ch -u allUsers:R gs://${PROJECT_ID}-serving-bucket/testfile.txt
    
  6. Pastikan Anda dapat mengakses file:

    curl http://storage.googleapis.com/${PROJECT_ID}-serving-bucket/testfile.txt
    

    Outputnya adalah sebagai berikut:

    this is a test
    
  7. Buat bucket kedua bernama idle-bucket yang tidak menampilkan data apa pun:

    gsutil mb -c regional -l us-central1 gs://${PROJECT_ID}-idle-bucket
    

Menyiapkan ruang kerja Cloud Monitoring

Pada bagian ini, Anda akan mengkonfigurasi Cloud Monitoring untuk mengamati penggunaan bucket guna memahami kapan objek bucket tidak digunakan. Jika bucket penyaluran tidak digunakan, Cloud Function akan memigrasikan bucket dari kelas Regional Storage ke kelas Nearline Storage.

  1. Di konsol Google Cloud, buka Dasbor Monitoring

    Buka Cloud Monitoring

  2. Klik New Workspace, lalu klik Add.

    Tunggu hingga konfigurasi awal selesai.

Membuat Dasbor Cloud Monitoring.

  1. Dalam Monitoring, buka Dasbor, lalu klik Buat Dasbor.

  2. Klik Tambahkan Diagram.

  3. Di kolom Nama, masukkan Bucket Access

  4. Untuk menemukan metrik konten yang diminta untuk bucket Cloud Storage, di kolom Find resource and metric,masukkan request, lalu pilih metrik Jumlah permintaan untuk resource gcs_bucket.

  5. Untuk mengelompokkan metrik berdasarkan nama bucket, di menu drop-down Kelompokkan Menurut, klik bucket_name.

  6. Untuk memfilter berdasarkan nama, di kolom Filter, masukkan ReadObject, lalu klik Terapkan.

  7. Klik Simpan.

  8. Di kolom nama, masukkan Bucket Usage.

  9. Untuk mengonfirmasi bahwa dasbor dapat diakses, tahan kursor ke Dasbor dan pastikan Bucket Usage muncul.

    Anda telah mengonfigurasi Monitoring untuk mengamati akses objek di bucket Anda. Diagram tidak menampilkan data apa pun karena tidak ada traffic ke bucket Cloud Storage.

Memuat beban pada bucket penayangan

Setelah pemantauan dikonfigurasi, gunakan Apache Bench untuk mengirim traffic ke bucket penayangan.

  1. Di Cloud Shell, kirim permintaan ke objek dalam bucket penayangan:

    ab -n 10000 \
        http://storage.googleapis.com/$PROJECT_ID-serving-bucket/testfile.txt
    
  2. Di konsol Google Cloud, buka dasbor Monitoring

    Buka Cloud Monitoring

  3. Untuk memilih dasbor Bucket Usage, arahkan kursor ke Dasbor, lalu pilih Bucket Usage. Pastikan hanya ada traffic ke bucket penayangan. Deret waktu request_count metric hanya ditampilkan untuk bucket penayangan, karena bucket tidak memiliki traffic ke dalamnya.

Meninjau dan men-deploy Cloud Function

  1. Di Cloud Shell, tampilkan kode yang menggunakan Cloud Function untuk memigrasikan bucket penyimpanan ke kelas Nearline Storage:

    cat $WORKDIR/migrate-storage/main.py | grep "migrate_storage(" -A 15
    

    Outputnya adalah sebagai berikut:

    def migrate_storage(request):
        # process incoming request to get the bucket to be migrated:
        request_json = request.get_json(force=True)
        # bucket names are globally unique
        bucket_name = request_json['incident']['resource_name']
    
        # create storage client
        storage_client = storage.Client()
    
        # get bucket
        bucket = storage_client.get_bucket(bucket_name)
    
        # update storage class
        bucket.storage_class = "NEARLINE"
        bucket.patch()
    

    Cloud Function menggunakan nama bucket yang diteruskan dalam permintaan untuk mengubah kelas penyimpanan ke Nearline Storage.

  2. Men-deploy Cloud Function:

    gcloud functions deploy migrate_storage --trigger-http --runtime=python37
    
  3. Tetapkan URL pemicu sebagai variabel lingkungan yang Anda gunakan di bagian berikutnya:

    export FUNCTION_URL=$(gcloud functions describe migrate_storage \
        --format=json | jq -r '.httpsTrigger.url')
    

Menguji dan memvalidasi pemberitahuan otomatis

  1. Tetapkan nama bucket yang tidak ada aktivitas:

    export IDLE_BUCKET_NAME=$PROJECT_ID-idle-bucket
    
  2. Kirim notifikasi pengujian ke Cloud Function yang Anda deploy menggunakan file incident.json:

    envsubst < $WORKDIR/migrate-storage/incident.json | curl -X POST \
        -H "Content-Type: application/json" $FUNCTION_URL -d @-
    

    Outputnya adalah sebagai berikut:

    OK
    

    Outputnya tidak dihentikan dengan baris baru, sehingga akan segera diikuti dengan command prompt.

  3. Pastikan bucket yang tidak ada aktivitas telah dimigrasikan ke Nearline Storage:

    gsutil defstorageclass get gs://$PROJECT_ID-idle-bucket
    

    Outputnya adalah sebagai berikut:

    gs://automating-cost-optimization-idle-bucket: NEARLINE
    

Mempertimbangkan untuk lingkungan produksi

Saat mengotomatiskan pengoptimalan biaya di lingkungan Google Cloud Anda, pertimbangkan hal-hal berikut:

  • Pertimbangan umum: Anda harus meningkatkan keamanan untuk Cloud Functions yang memiliki kemampuan untuk mengubah atau menghapus resource Google Cloud.
  • Mengidentifikasi pemborosan: Dokumen ini membahas beberapa contoh pengeluaran yang sia-sia. Ada banyak contoh lain yang umumnya termasuk dalam salah satu dari tiga kategori:
    • Resource yang disediakan berlebih: Resource yang disediakan berlebih daripada yang diperlukan untuk beban kerja tertentu, seperti VM dengan daya CPU lebih banyak dan memori yang lebih besar dari yang diperlukan.
    • Resource non-aktif: Resource yang tidak sepenuhnya digunakan.
    • Resource non-aktif paruh waktu: Resource yang hanya digunakan selama jam kerja.
  • Mengotomatiskan pembersihan: Di dokumen ini, diperlukan proses multi-langkah dengan beberapa operasi asinkron untuk mengambil snapshot dan menghapus disk. Resource Google Cloud lainnya seperti alamat IP yang tidak digunakan dapat menggunakan operasi sinkron.
  • Men-deploy dalam skala besar: Di dokumen ini, project ID Google Cloud ditentukan dalam kode Cloud Function. Untuk men-deploy solusi tersebut dalam skala besar, pertimbangkan untuk menggunakan Cloud Billing atau Cloud Resource Manager API untuk mendapatkan daftar project dengan akun penagihan atau organisasi. Kemudian, teruskan project ID Google Cloud tersebut ke sebuah fungsi. sebagai variabel. Dalam konfigurasi seperti itu, Anda perlu menambahkan akun layanan Cloud Function ke project akun layanan Cloud Function yang dapat membersihkan atau menghapus resource. Sebaiknya gunakan framework deployment otomatis, seperti Cloud Deployment Manager atau Terraform.
  • Pemberitahuan otomatis: Dokumen ini menunjukkan cara menggunakan payload tiruan dari pemberitahuan Monitoring untuk memicu migrasi kelas penyimpanan. Pemantauan kebijakan pemberitahuan dapat dievaluasi selama maksimum 23 jam 59 menit. Dalam lingkungan produksi, pembatasan ini mungkin tidak cukup lama untuk mempertimbangkan bucket tidak ada aktivitas sebelum memigrasikan kelas penyimpanannya. Pertimbangkan untuk mengaktifkan log audit akses data di bucket Cloud Storage dan membuat pipeline yang menggunakan log audit ini untuk mengevaluasi apakah sebuah bucket telah digunakan untuk melayani penayangan dalam 30 hari terakhir. Untuk mengetahui informasi lebih lanjut, pelajari memahami log audit dan sebaiknya buat sink gabungan untuk mengirim log ke Pub/Sub dan Dataflow untuk memproses mereka.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

  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