1. Ringkasan
Serangkaian codelab Serverless Migration Station (tutorial praktik mandiri) dan video terkait bertujuan untuk membantu developer serverless Google Cloud memodernisasi aplikasi mereka dengan memandu mereka melalui satu atau beberapa migrasi, terutama beralih dari layanan lama. Dengan melakukannya, aplikasi Anda akan lebih portabel dan Anda akan memiliki lebih banyak opsi dan fleksibilitas, sehingga Anda dapat berintegrasi dengan dan mengakses berbagai produk Cloud serta mengupgrade ke rilis bahasa yang lebih baru dengan lebih mudah. Meskipun awalnya berfokus pada pengguna Cloud paling awal, terutama developer App Engine (lingkungan standar), seri ini cukup luas untuk mencakup platform serverless lainnya seperti Cloud Functions dan Cloud Run, atau di tempat lain jika berlaku.
Codelab ini mengajarkan cara menggunakan tugas push App Engine Task Queue di aplikasi contoh dari codelab Modul 1. Postingan blog dan video Modul 7 melengkapi tutorial ini, dengan memberikan ringkasan singkat tentang konten dalam tutorial ini.
Dalam modul ini, kita akan menambahkan penggunaan tugas push, lalu memigrasikan penggunaan tersebut ke Cloud Tasks di Modul 8 dan kemudian ke Python 3 dan Cloud Datastore di Modul 9. Pengguna yang menggunakan Task Queues untuk tugas pull akan bermigrasi ke Cloud Pub/Sub dan harus melihat Modul 18-19.
Anda akan mempelajari cara
- Menggunakan App Engine Task Queue API/layanan paket
- Menambahkan penggunaan tugas push ke aplikasi NDB App Engine Flask Python 2 dasar
Yang Anda butuhkan
- Project Google Cloud dengan akun penagihan GCP yang aktif
- Keterampilan Python dasar
- Pengetahuan perintah Linux umum yang berfungsi
- Pengetahuan dasar tentang mengembangkan dan men-deploy aplikasi App Engine
- Aplikasi App Engine Modul 1 yang berfungsi (selesaikan codelab-nya [direkomendasikan] atau salin aplikasi dari repo)
Survei
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman dengan Python?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?
2. Latar belakang
App Engine Task Queue mendukung tugas push dan pull. Untuk meningkatkan portabilitas aplikasi, tim Google Cloud merekomendasikan migrasi dari layanan paket lama seperti Task Queue ke layanan mandiri Cloud atau layanan setara pihak ketiga lainnya.
- Pengguna Task Queue push task harus bermigrasi ke Cloud Tasks.
- Pengguna tugas Task Queue pull harus bermigrasi ke Cloud Pub/Sub.
Migrasi tugas pull dibahas dalam Modul Migrasi 18-19, sedangkan Modul 7-9 berfokus pada migrasi tugas push. Untuk bermigrasi dari tugas push App Engine Task Queue, tambahkan penggunaannya ke aplikasi Flask dan App Engine NDB yang ada yang dihasilkan dari codelab Modul 1. Di aplikasi tersebut, tayangan halaman baru mencatat Kunjungan baru dan menampilkan kunjungan terbaru kepada pengguna. Karena kunjungan lama tidak pernah ditampilkan lagi dan menghabiskan ruang di Datastore, kita akan membuat tugas push untuk menghapus kunjungan terlama secara otomatis. Di Modul 8, kita akan memigrasikan aplikasi tersebut dari Task Queue ke Cloud Tasks.
Tutorial ini mencakup langkah-langkah berikut:
- Penyiapan/Prakerja
- Update konfigurasi
- Mengubah kode aplikasi
3. Penyiapan/Prakerja
Bagian ini menjelaskan cara:
- Menyiapkan project Cloud
- Dapatkan aplikasi contoh dasar pengukuran
- Deploy (ulang) dan validasi aplikasi dasar pengukuran
Langkah-langkah ini memastikan Anda memulai dengan kode yang berfungsi.
1. Siapkan project
Jika Anda sudah menyelesaikan codelab Modul 1, sebaiknya gunakan kembali project (dan kode) yang sama. Atau, Anda dapat membuat project baru atau menggunakan kembali project lain yang sudah ada. Pastikan project memiliki akun penagihan yang aktif dan App Engine diaktifkan.
2. Dapatkan aplikasi contoh dasar pengukuran
Salah satu prasyarat untuk codelab ini adalah memiliki aplikasi App Engine Modul 1 yang berfungsi: selesaikan codelab Modul 1 (direkomendasikan) atau salin aplikasi Modul 1 dari repo. Baik Anda menggunakan kode Anda atau kode kami, kode Modul 1 adalah tempat kita akan "MEMULAI". Codelab ini akan memandu Anda melalui setiap langkah, yang diakhiri dengan kode yang menyerupai kode di folder repo Modul 7 "FINISH".
- START: Folder Modul 1 (Python 2)
- FINISH: Folder Modul 7 (Python 2)
- Seluruh repo (untuk melakukan clone atau mendownload file ZIP)
Terlepas dari aplikasi Modul 1 yang Anda gunakan, folder akan terlihat seperti di bawah, mungkin dengan folder lib juga:
$ ls README.md main.py templates app.yaml requirements.txt
3. Deploy (ulang) aplikasi dasar pengukuran
Lakukan langkah-langkah berikut untuk (men)deploy ulang aplikasi Modul 1:
- Hapus folder
libjika ada dan jalankan:pip install -t lib -r requirements.txtuntuk mengisi ulanglib. Anda mungkin perlu menggunakan perintahpip2jika Anda telah menginstal Python 2 dan 3. - Pastikan Anda telah menginstal dan menginisialisasi alat command line
gcloudserta meninjau penggunaannya. - Tetapkan project Cloud Anda dengan
gcloud config set projectPROJECT_IDjika Anda tidak ingin memasukkanPROJECT_IDdengan setiap perintahgcloudyang dikeluarkan. - Men-deploy aplikasi contoh dengan
gcloud app deploy - Pastikan aplikasi Modul 1 berjalan seperti yang diharapkan tanpa masalah menampilkan kunjungan terbaru (diilustrasikan di bawah)

4. Update konfigurasi
Tidak ada perubahan yang diperlukan pada file konfigurasi App Engine standar (app.yaml, requirements.txt, appengine_config.py).
5. Mengubah file aplikasi
File aplikasi utama adalah main.py, dan semua update di bagian ini berkaitan dengan file tersebut. Ada juga update kecil pada template web, templates/index.html. Berikut adalah perubahan yang harus diterapkan di bagian ini:
- Memperbarui impor
- Menambahkan tugas push
- Menambahkan handler tugas
- Memperbarui template web
1. Memperbarui impor
Impor google.appengine.api.taskqueue akan menghadirkan fungsi Task Queue. Beberapa paket library standar Python juga diperlukan:
- Karena kita menambahkan tugas untuk menghapus kunjungan terlama, aplikasi harus menangani stempel waktu, yang berarti penggunaan
timedandatetime. - Untuk mencatat informasi berguna terkait eksekusi tugas, kita memerlukan
logging.
Setelah menambahkan semua impor ini, berikut tampilan kode Anda sebelum dan sesudah perubahan ini:
SEBELUM:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
SETELAH:
from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
2. Menambahkan tugas push (mengumpulkan data untuk tugas, mengantrekan tugas baru)
Dokumentasi push queue menyatakan: "Untuk memproses tugas, Anda harus menambahkannya ke push queue. App Engine menyediakan push queue default, bernama default, yang dikonfigurasi dan siap digunakan dengan setelan default. Jika mau, Anda cukup menambahkan semua tugas ke antrean default, tanpa harus membuat dan mengonfigurasi antrean lainnya." Codelab ini menggunakan antrean default agar lebih ringkas. Untuk mempelajari lebih lanjut cara menentukan push queue Anda sendiri, dengan karakteristik yang sama atau berbeda, lihat dokumentasi Membuat Push Queue.
Tujuan utama codelab ini adalah menambahkan tugas (ke antrean push default) yang bertugas menghapus kunjungan lama dari Datastore yang tidak lagi ditampilkan. Aplikasi dasar mencatat setiap kunjungan (permintaan GET ke /) dengan membuat entity Visit baru, lalu mengambil dan menampilkan kunjungan terbaru. Tidak ada kunjungan terlama yang akan ditampilkan atau digunakan lagi, sehingga tugas push menghapus semua kunjungan yang lebih lama dari kunjungan terlama yang ditampilkan. Untuk melakukannya, perilaku aplikasi perlu sedikit diubah:
- Saat membuat kueri kunjungan terbaru, alih-alih menampilkan kunjungan tersebut secara langsung, ubah aplikasi untuk menyimpan stempel waktu
Visitterakhir, yang ditampilkan paling lama—semua kunjungan yang lebih lama dari ini dapat dihapus dengan aman. - Buat tugas push dengan stempel waktu ini sebagai payload-nya dan arahkan ke pengendali tugas, yang dapat diakses melalui
POSTHTTP ke/trim. Secara khusus, gunakan utilitas Python standar untuk mengonversi stempel waktu Datastore dan mengirimkannya (sebagai float) ke tugas, tetapi juga mencatatnya (sebagai string) dan menampilkan string tersebut sebagai nilai sentinel untuk ditampilkan kepada pengguna.
Semua ini terjadi di fetch_visits(), dan inilah tampilannya sebelum dan setelah melakukan pembaruan ini:
SEBELUM:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
SETELAH:
def fetch_visits(limit):
'get most recent visits and add task to delete older visits'
data = Visit.query().order(-Visit.timestamp).fetch(limit)
oldest = time.mktime(data[-1].timestamp.timetuple())
oldest_str = time.ctime(oldest)
logging.info('Delete entities older than %s' % oldest_str)
taskqueue.add(url='/trim', params={'oldest': oldest})
return (v.to_dict() for v in data), oldest_str
3. Tambahkan pengendali tugas (kode yang dipanggil saat tugas berjalan)
Meskipun penghapusan kunjungan lama dapat dilakukan dengan mudah di fetch_visits(), perlu diketahui bahwa fungsi ini tidak banyak berkaitan dengan pengguna akhir. Fungsi ini adalah fungsi tambahan dan kandidat yang baik untuk diproses secara asinkron di luar permintaan aplikasi standar. Pengguna akhir akan mendapatkan manfaat dari kueri yang lebih cepat karena akan ada lebih sedikit informasi di Datastore. Buat fungsi baru trim(), yang dipanggil melalui permintaan Task Queue POST ke /trim, yang melakukan hal berikut:
- Mengekstrak payload stempel waktu "kunjungan terlama"
- Mengeluarkan kueri Datastore untuk menemukan semua entity yang lebih lama dari stempel waktu tersebut.
- Memilih kueri "khusus kunci" yang lebih cepat karena tidak memerlukan data pengguna sebenarnya.
- Mencatat jumlah entity yang akan dihapus (termasuk nol).
- Panggilan
ndb.delete_multi()untuk menghapus entity (dilewati jika tidak ada). - Menampilkan string kosong (bersama dengan kode kembali HTTP 200 implisit).
Anda dapat melihat semuanya di trim() di bawah. Tambahkan ke main.py tepat setelah fetch_visits():
@app.route('/trim', methods=['POST'])
def trim():
'(push) task queue handler to delete oldest visits'
oldest = request.form.get('oldest', type=float)
keys = Visit.query(
Visit.timestamp < datetime.fromtimestamp(oldest)
).fetch(keys_only=True)
nkeys = len(keys)
if nkeys:
logging.info('Deleting %d entities: %s' % (
nkeys, ', '.join(str(k.id()) for k in keys)))
ndb.delete_multi(keys)
else:
logging.info('No entities older than: %s' % time.ctime(oldest))
return '' # need to return SOME string w/200
4. Memperbarui template web
Perbarui template web, templates/index.html, dengan kondisi Jinja2 ini untuk menampilkan stempel waktu terlama jika variabel tersebut ada:
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
Tambahkan cuplikan ini setelah daftar kunjungan yang ditampilkan, tetapi sebelum menutup body agar template Anda terlihat seperti ini:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
</body>
</html>
6. Ringkasan/Pembersihan
Bagian ini mengakhiri codelab ini dengan men-deploy aplikasi, memverifikasi bahwa aplikasi berfungsi seperti yang diinginkan dan dalam output yang ditampilkan. Setelah validasi aplikasi, lakukan pembersihan dan pertimbangkan langkah selanjutnya.
Men-deploy dan memverifikasi aplikasi
Deploy aplikasi dengan gcloud app deploy. Outputnya harus sama dengan aplikasi Modul 1, kecuali baris baru di bagian bawah yang menampilkan kunjungan mana yang akan dihapus:

Selamat, Anda telah menyelesaikan codelab. Kode Anda sekarang seharusnya cocok dengan yang ada di folder repo Modul 7. Sekarang siap untuk bermigrasi ke Cloud Tasks di Modul 8.
Pembersihan
Umum
Jika Anda sudah selesai untuk saat ini, sebaiknya nonaktifkan aplikasi App Engine untuk menghindari penagihan. Namun, jika Anda ingin menguji atau bereksperimen lebih lanjut, platform App Engine memiliki kuota gratis, sehingga selama Anda tidak melebihi tingkat penggunaan tersebut, Anda tidak akan dikenai biaya. Biaya tersebut adalah untuk komputasi, tetapi mungkin juga ada biaya untuk layanan App Engine yang relevan, jadi periksa halaman harganya untuk mengetahui informasi selengkapnya. Jika migrasi ini melibatkan layanan Cloud lainnya, layanan tersebut akan ditagih secara terpisah. Dalam kedua kasus tersebut, jika berlaku, lihat bagian "Khusus untuk codelab ini" di bawah.
Untuk pengungkapan penuh, men-deploy ke platform komputasi serverless Google Cloud seperti App Engine akan menimbulkan biaya build dan penyimpanan kecil. Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Penyimpanan gambar tersebut menggunakan sebagian kuota tersebut. Namun, Anda mungkin tinggal di wilayah yang tidak memiliki paket gratis tersebut, jadi perhatikan penggunaan penyimpanan Anda untuk meminimalkan potensi biaya. "Folder" Cloud Storage tertentu yang harus Anda tinjau meliputi:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Link penyimpanan di atas bergantung pada
PROJECT_IDdan *LOC*Anda, misalnya, "us" jika aplikasi Anda dihosting di Amerika Serikat.
Di sisi lain, jika Anda tidak akan melanjutkan aplikasi ini atau codelab migrasi terkait lainnya dan ingin menghapus semuanya, hentikan project Anda.
Khusus untuk codelab ini
Layanan yang tercantum di bawah ini unik untuk codelab ini. Lihat dokumentasi setiap produk untuk mengetahui informasi selengkapnya:
- Layanan App Engine Task Queue tidak menimbulkan penagihan tambahan per halaman harga untuk layanan paket lama seperti Task Queue.
- Layanan App Engine Datastore disediakan oleh Cloud Datastore (Cloud Firestore dalam mode Datastore) yang juga memiliki paket gratis; lihat halaman harganya untuk mengetahui informasi selengkapnya.
Langkah berikutnya
Dalam "migrasi" ini, Anda menambahkan penggunaan antrean push Task Queue ke aplikasi contoh Modul 1, menambahkan dukungan untuk melacak pengunjung, sehingga menghasilkan aplikasi contoh Modul 7. Migrasi berikutnya mengajarkan cara mengupgrade dari tugas push App Engine ke Cloud Tasks jika Anda memilih untuk melakukannya. Mulai Musim Gugur 2021, pengguna tidak perlu lagi bermigrasi ke Cloud Tasks saat mengupgrade ke Python 3. Baca lebih lanjut tentang hal ini di bagian berikutnya.
Jika Anda ingin beralih ke Cloud Tasks, codelab Modul 8 adalah langkah berikutnya. Selain itu, ada migrasi tambahan yang perlu dipertimbangkan, seperti Cloud Datastore, Cloud Memorystore, Cloud Storage, atau Cloud Pub/Sub (pull queue). Ada juga migrasi lintas produk ke Cloud Run dan Cloud Functions. Semua konten Serverless Migration Station (codelab, video, kode sumber [jika tersedia]) dapat diakses di repositori open source-nya.
7. Migrasi ke Python 3
Pada Musim Gugur 2021, tim App Engine memperluas dukungan banyak layanan paket ke runtime generasi ke-2 (awalnya hanya tersedia di runtime generasi ke-1), yang berarti Anda tidak perlu lagi bermigrasi dari layanan paket seperti App Engine Task Queue ke layanan Cloud mandiri atau layanan pihak ketiga yang setara seperti Cloud Tasks saat melakukan porting aplikasi ke Python 3. Dengan kata lain, Anda dapat terus menggunakan Task Queue di aplikasi App Engine Python 3 selama Anda menyesuaikan kode untuk mengakses layanan paket dari runtime generasi berikutnya.
Anda dapat mempelajari lebih lanjut cara memigrasikan penggunaan layanan paket ke Python 3 dalam codelab Modul 17 dan video terkait. Meskipun topik tersebut di luar cakupan Modul 7, di bawah ini adalah versi Python 3 dari aplikasi Modul 1 dan 7 yang di-porting ke Python 3 dan masih menggunakan App Engine NDB dan Task Queue.
8. Referensi lainnya
Di bawah ini tercantum resource tambahan bagi developer yang ingin mempelajari lebih lanjut Modul Migrasi ini atau yang terkait, serta produk terkait. Hal ini mencakup tempat untuk memberikan masukan tentang konten ini, link ke kode, dan berbagai bagian dokumentasi yang mungkin berguna bagi Anda.
Masalah/masukan codelab
Jika Anda menemukan masalah dengan codelab ini, telusuri masalah Anda terlebih dahulu sebelum mengajukan masalah. Link untuk menelusuri dan membuat masalah baru:
Referensi migrasi
Link ke folder repo untuk Modul 2 (START) dan Modul 7 (FINISH) dapat ditemukan pada tabel di bawah.
Codelab | Python 2 | Python 3 |
code (tidak ditampilkan dalam tutorial ini) | ||
Modul 7 (codelab ini) | code (tidak ditampilkan dalam tutorial ini) |
Referensi online
Berikut adalah referensi online yang mungkin relevan untuk tutorial ini:
Task Queue App Engine
- Ringkasan App Engine Task Queue
- Ringkasan antrean push Task Queue App Engine
- Membuat push queue Task Queue
queue.yamlreferensiqueue.yamlvs. Cloud Tasks- Panduan migrasi push queue ke Cloud Tasks
- Contoh dokumentasi migrasi push queue Task Queue App Engine ke Cloud Tasks
Platform App Engine
- Dokumentasi App Engine
- Runtime Python 2 App Engine (lingkungan standar)
- Menggunakan library bawaan App Engine di App Engine Python 2
- Runtime Python 3 App Engine (lingkungan standar)
- Perbedaan antara runtime Python 2 & 3 App Engine (lingkungan standar)
- Panduan migrasi aplikasi Python 2 ke 3 App Engine (lingkungan standar)
- Informasi harga dan kuota App Engine
- Peluncuran platform App Engine generasi kedua (2018)
- Membandingkan platform generasi pertama & kedua
- Dukungan jangka panjang untuk runtime lama
- Contoh migrasi dokumentasi
- Contoh migrasi hasil kontribusi komunitas
Informasi Cloud lainnya
- Python di Google Cloud Platform
- Library klien Python Google Cloud
- Paket "Selalu Gratis" Google Cloud
- Google Cloud SDK (alat command line
gcloud) - Semua dokumentasi Google Cloud
Video
- Serverless Migration Station
- Ekspedisi Tanpa Server
- Berlangganan Google Cloud Tech
- Subscribe ke Google Developers
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.