Dokumen ini mengasumsikan bahwa Anda sudah memahami hal-hal berikut:
- Runtime Python Cloud Functions
- Runtime Node.js 8 Cloud Functions
- Kebijakan pemberitahuan di Monitoring
- API
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.
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.
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.
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.
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
- 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.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Enable the Compute Engine, Cloud Functions, and Cloud Storage APIs.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Enable the Compute Engine, Cloud Functions, and Cloud Storage APIs.
-
Di konsol Google Cloud, 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.
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.
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/
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)
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
Di Cloud Shell, ubah
unused-ip
ke direktori :cd $WORKDIR/unused-ip
Ekspor nama alamat IP sebagai variabel:
export USED_IP=used-ip-address export UNUSED_IP=unused-ip-address
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 region
us-central1
, tetapi Anda dapat memilih region yang berbeda dan merujuknya secara konsisten di seluruh dokumen ini.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
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
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
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
Di Cloud Shell, deploy Cloud Function:
gcloud functions deploy unused_ip_function --trigger-http --runtime=nodejs8
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
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
Uji tugas dengan memicunya secara manual:
gcloud scheduler jobs run unused-ip-job
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
Di Cloud Shell, ubah ke direktori
unattached-pd
:cd $WORKDIR/unattached-pd
Mengekspor nama disk sebagai variabel lingkungan:
export ORPHANED_DISK=orphaned-disk export UNUSED_DISK=unused-disk
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
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
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
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.
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.
- Disk tidak memiliki
Melepaskan persistent disk terlantar dari VM:
gcloud compute instances detach-disk disk-instance \ --device-name=$ORPHANED_DISK \ --zone=us-central1-a
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.
- Tidak ada
Memeriksa kode Cloud Function
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.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.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 danlastDetachTimestamp
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
Di Cloud Shell, deploy Cloud Function:
gcloud functions deploy delete_unattached_pds \ --trigger-http --runtime=python37
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
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
Uji tugas:
gcloud scheduler jobs run unattached-pd-job
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
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
Di Cloud Shell, ubah ke direktori
migrate-storage
:cd $WORKDIR/migrate-storage
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
Buat bucket menjadi publik.
gsutil acl ch -u allUsers:R gs://${PROJECT_ID}-serving-bucket
Mengupload file teks ke bucket
gsutil cp $WORKDIR/migrate-storage/testfile.txt \ gs://${PROJECT_ID}-serving-bucket
Buat file menjadi publik:
gsutil acl ch -u allUsers:R gs://${PROJECT_ID}-serving-bucket/testfile.txt
Pastikan Anda dapat mengakses file:
curl http://storage.googleapis.com/${PROJECT_ID}-serving-bucket/testfile.txt
Outputnya adalah sebagai berikut:
this is a test
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.
Di konsol Google Cloud, buka Dasbor Monitoring
Klik New Workspace, lalu klik Add.
Tunggu hingga konfigurasi awal selesai.
Membuat Dasbor Cloud Monitoring.
Dalam Monitoring, buka Dasbor, lalu klik Buat Dasbor.
Klik Tambahkan Diagram.
Di kolom Nama, masukkan
Bucket Access
Untuk menemukan metrik konten yang diminta untuk bucket Cloud Storage, di kolom Find resource and metric,masukkan
request
, lalu pilih metrik Jumlah permintaan untuk resourcegcs_bucket
.Untuk mengelompokkan metrik berdasarkan nama bucket, di menu drop-down Kelompokkan Menurut, klik
bucket_name
.Untuk memfilter berdasarkan nama, di kolom Filter, masukkan ReadObject, lalu klik Terapkan.
Klik Simpan.
Di kolom nama, masukkan
Bucket Usage
.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.
Di Cloud Shell, kirim permintaan ke objek dalam bucket penayangan:
ab -n 10000 \ http://storage.googleapis.com/$PROJECT_ID-serving-bucket/testfile.txt
Di konsol Google Cloud, buka dasbor Monitoring
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
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.
Men-deploy Cloud Function:
gcloud functions deploy migrate_storage --trigger-http --runtime=python37
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
Tetapkan nama bucket yang tidak ada aktivitas:
export IDLE_BUCKET_NAME=$PROJECT_ID-idle-bucket
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.
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
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Langkah selanjutnya
- Tonton video mengenai pengelolaan biaya.
- Kunjungi halaman beranda Pengelolaan Biaya.
- Tinjau dokumentasi Penagihan Cloud.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.