Memigrasikan Python 2 App Engine Cloud NDB & Aplikasi Cloud Tasks ke Python 3 dan Cloud Datastore (Modul 9)

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.

Tujuan codelab ini adalah untuk mem-porting aplikasi contoh Modul 8 ke Python 3 serta mengalihkan akses Datastore (Cloud Firestore dalam mode Datastore) dari penggunaan Cloud NDB ke library klien Cloud Datastore native dan mengupgrade ke versi terbaru library klien Cloud Tasks.

Kita menambahkan penggunaan Task Queue untuk tugas push di Modul 7, lalu memigrasikan penggunaan tersebut ke Cloud Tasks di Modul 8. Di Modul 9 ini, kita akan melanjutkan ke Python 3 dan Cloud Datastore. Pengguna yang menggunakan Task Queues untuk tugas pull akan bermigrasi ke Cloud Pub/Sub dan harus melihat Modul 18-19.

Anda akan mempelajari cara

  • Melakukan porting aplikasi contoh Modul 8 ke Python 3
  • Mengalihkan akses Datastore dari library klien Cloud NDB ke Cloud Datastore
  • Upgrade ke versi library klien Cloud Tasks terbaru

Yang Anda butuhkan

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Latar belakang

Modul 7 menunjukkan cara menggunakan tugas push Task Queue App Engine di aplikasi Python 2 Flask App Engine. Di Modul 8, Anda akan memigrasikan aplikasi tersebut dari Task Queue ke Cloud Tasks. Di Modul 9 ini, Anda melanjutkan perjalanan tersebut dan mem-port aplikasi tersebut ke Python 3 serta mengalihkan akses Datastore dari menggunakan Cloud NDB ke library klien Cloud Datastore native.

Karena Cloud NDB berfungsi untuk Python 2 dan 3, Cloud NDB sudah cukup bagi pengguna App Engine yang memindahkan aplikasi mereka dari Python 2 ke 3. Migrasi tambahan library klien ke Cloud Datastore sepenuhnya bersifat opsional, dan hanya ada satu alasan untuk mempertimbangkannya: Anda memiliki aplikasi non-App Engine (dan/atau aplikasi App Engine Python 3) yang sudah menggunakan library klien Cloud Datastore dan ingin menggabungkan codebase untuk mengakses Datastore hanya dengan satu library klien. Cloud NDB dibuat khusus untuk developer App Engine Python 2 sebagai alat migrasi Python 3, jadi jika Anda belum memiliki kode yang menggunakan library klien Cloud Datastore, Anda tidak perlu mempertimbangkan migrasi ini.

Terakhir, pengembangan library klien Cloud Tasks hanya berlanjut di Python 3, jadi kita "bermigrasi" dari salah satu versi akhir Python 2 ke versi Python 3 yang setara. Untungnya, tidak ada perubahan yang merusak dari Python 2, yang berarti tidak ada hal lain yang perlu Anda lakukan di sini.

Tutorial ini mencakup langkah-langkah berikut:

  1. Penyiapan/Prakerja
  2. Update konfigurasi
  3. Mengubah kode aplikasi

3. Penyiapan/Prakerja

Bagian ini menjelaskan cara:

  1. Menyiapkan project Cloud
  2. Dapatkan aplikasi contoh dasar pengukuran
  3. Deploy (ulang) dan validasi aplikasi dasar pengukuran

Langkah-langkah ini memastikan Anda memulai dengan kode yang berfungsi dan siap untuk dimigrasikan ke layanan Cloud.

1. Siapkan project

Jika Anda sudah menyelesaikan codelab Modul 8, gunakan kembali project (dan kode) yang sama. Atau, buat project baru atau gunakan kembali project lain yang sudah ada. Pastikan project memiliki akun penagihan yang aktif dan aplikasi App Engine yang diaktifkan. Temukan ID project Anda karena Anda harus menyediakannya selama codelab ini, dengan menggunakannya setiap kali Anda menemukan variabel PROJECT_ID.

2. Dapatkan aplikasi contoh dasar pengukuran

Salah satu prasyaratnya adalah aplikasi App Engine Modul 8 yang berfungsi: selesaikan codelab Modul 8 (direkomendasikan) atau salin aplikasi Modul 8 dari repo. Baik Anda menggunakan kode Anda atau kode kami, kode Modul 8 adalah tempat kita akan memulai ("START"). Codelab ini akan memandu Anda melakukan migrasi, yang diakhiri dengan kode yang menyerupai kode di folder repo Modul 9 ("FINISH").

Terlepas dari aplikasi Modul 7 yang Anda gunakan, folder akan terlihat seperti di bawah, mungkin dengan folder lib juga:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3. Deploy (ulang) dan validasi aplikasi dasar pengukuran

Lakukan langkah-langkah berikut untuk men-deploy aplikasi Modul 8:

  1. Hapus folder lib jika ada dan jalankan pip install -t lib -r requirements.txt untuk mengisi kembali lib. Anda mungkin perlu menggunakan pip2 jika Anda telah menginstal Python 2 dan 3 di mesin pengembangan.
  2. Pastikan Anda telah menginstal dan menginisialisasi alat command line gcloud serta meninjau penggunaannya.
  3. (opsional) Tetapkan project Cloud Anda dengan gcloud config set project PROJECT_ID jika Anda tidak ingin memasukkan PROJECT_ID dengan setiap perintah gcloud yang Anda keluarkan.
  4. Men-deploy aplikasi contoh dengan gcloud app deploy
  5. Konfirmasi bahwa aplikasi berjalan seperti yang diharapkan tanpa masalah. Jika Anda telah menyelesaikan codelab Modul 8, aplikasi akan menampilkan pengunjung teratas beserta kunjungan terbaru (seperti yang diilustrasikan di bawah). Di bagian bawah terdapat indikasi tugas lama yang akan dihapus.

4aa8a2cb5f527079.png

4. Update konfigurasi

requirements.txt

requirements.txt baru hampir sama dengan requirements.txt untuk Modul 8, dengan hanya satu perubahan besar: ganti google-cloud-ndb dengan google-cloud-datastore. Lakukan perubahan ini sehingga file requirements.txt Anda terlihat seperti ini:

flask
google-cloud-datastore
google-cloud-tasks

File requirements.txt ini tidak memiliki nomor versi, yang berarti versi terbaru akan dipilih. Jika ada ketidakcocokan, penggunaan nomor versi untuk mengunci versi aplikasi yang berfungsi adalah praktik standar.

app.yaml

Runtime App Engine generasi kedua tidak mendukung library pihak ketiga bawaan seperti di 2.x, dan tidak mendukung penyalinan library non-bawaan. Satu-satunya persyaratan untuk paket pihak ketiga adalah mencantumkannya di requirements.txt. Akibatnya, seluruh bagian libraries dari app.yaml dapat dihapus.

Perubahan lainnya adalah runtime Python 3 memerlukan penggunaan framework web yang melakukan perutean sendiri. Akibatnya, semua pengendali skrip harus diubah menjadi auto. Namun, karena semua rute harus diubah menjadi auto, dan tidak ada file statis yang disajikan dari aplikasi contoh ini, tidak relevan untuk memiliki penangan apa pun, jadi hapus seluruh bagian handlers juga.

Satu-satunya hal yang diperlukan di app.yaml adalah menyetel runtime ke versi Python 3 yang didukung, misalnya 3.10. Lakukan perubahan ini sehingga app.yaml baru yang disingkat hanya berupa satu baris ini:

runtime: python310

Menghapus appengine_config.py dan lib

Runtime App Engine generasi berikutnya mengubah penggunaan paket pihak ketiga:

  • Library bawaan adalah library yang diperiksa oleh Google dan tersedia di server App Engine, kemungkinan karena berisi kode C/C++ yang tidak diizinkan untuk di-deploy ke cloud oleh developer. Library ini tidak lagi tersedia di runtime generasi ke-2.
  • Penyalinan library non-bawaan (terkadang disebut "vendoring" atau "self-bundling") tidak lagi diperlukan di runtime generasi ke-2. Sebagai gantinya, library tersebut harus dicantumkan di requirements.txt tempat sistem build menginstalnya secara otomatis untuk Anda pada waktu deployment.

Sebagai hasil dari perubahan pada pengelolaan paket pihak ketiga tersebut, file appengine_config.py maupun folder lib tidak diperlukan, jadi hapus keduanya. Di runtime generasi ke-2, App Engine otomatis menginstal paket pihak ketiga yang tercantum di requirements.txt. Merangkum:

  1. Tidak ada library pihak ketiga yang di-bundle sendiri atau disalin; cantumkan di requirements.txt
  2. Tidak ada pip install dalam folder lib, artinya tidak ada periode folder lib
  3. Tidak ada pencantuman library pihak ketiga bawaan (sehingga tidak ada bagian libraries) di app.yaml; cantumkan di requirements.txt
  4. Tidak ada library pihak ketiga yang dirujuk dari aplikasi Anda berarti tidak ada file appengine_config.py

Mencantumkan semua library pihak ketiga yang diinginkan di requirements.txt adalah satu-satunya persyaratan developer.

5. Memperbarui file aplikasi

Hanya ada satu file aplikasi, main.py, sehingga semua perubahan di bagian ini hanya memengaruhi file tersebut. Di bawah ini adalah ilustrasi "perbedaan" pada keseluruhan perubahan yang perlu dilakukan untuk memfaktorkan ulang kode yang ada ke dalam aplikasi baru. Pembaca tidak diharapkan untuk membaca kode baris demi baris, karena tujuannya hanyalah untuk mendapatkan ringkasan bergambar tentang apa yang diperlukan dalam refaktor ini (tetapi jangan ragu untuk membukanya di tab baru atau mendownload dan memperbesar jika diinginkan).

5d043768ba7be742.png

Memperbarui impor dan inisialisasi

Bagian impor di main.py untuk Modul 8 menggunakan Cloud NDB dan Cloud Tasks; tampilannya akan seperti berikut:

SEBELUM:

from datetime import datetime
import json
import logging
import time
from flask import Flask, render_template, request
import google.auth
from google.cloud import ndb, tasks

app = Flask(__name__)
ds_client = ndb.Client()
ts_client = tasks.CloudTasksClient()

Logging disederhanakan dan ditingkatkan di runtime generasi kedua seperti Python 3:

  • Untuk pengalaman logging yang komprehensif, gunakan Cloud Logging
  • Untuk logging sederhana, cukup kirim ke stdout (atau stderr) melalui print()
  • Tidak perlu menggunakan modul logging Python (jadi hapus)

Oleh karena itu, hapus impor logging dan tukar google.cloud.ndb dengan google.cloud.datastore. Demikian pula, ubah ds_client agar mengarah ke klien Datastore, bukan klien NDB. Setelah perubahan ini dilakukan, bagian atas aplikasi baru Anda akan terlihat seperti ini:

SETELAH:

from datetime import datetime
import json
import time
from flask import Flask, render_template, request
import google.auth
from google.cloud import datastore, tasks

app = Flask(__name__)
ds_client = datastore.Client()
ts_client = tasks.CloudTasksClient()

Bermigrasi ke Cloud Datastore

Sekarang saatnya mengganti penggunaan library klien NDB dengan Datastore. App Engine NDB dan Cloud NDB memerlukan model data (class); untuk aplikasi ini, model datanya adalah Visit. Fungsi store_visit() berfungsi sama di semua modul migrasi lainnya: fungsi ini mendaftarkan kunjungan dengan membuat rekaman Visit baru, menyimpan alamat IP dan agen pengguna (jenis browser) klien yang berkunjung.

SEBELUM:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

Namun, Cloud Datastore tidak menggunakan class model data, jadi hapus class tersebut. Selain itu, Cloud Datastore tidak otomatis membuat stempel waktu saat data dibuat, sehingga Anda harus melakukannya secara manual—hal ini dilakukan dengan panggilan datetime.now().

Tanpa class data, store_visit() yang diubah akan terlihat seperti ini:

SETELAH:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    entity = datastore.Entity(key=ds_client.key('Visit'))
    entity.update({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })
    ds_client.put(entity)

Fungsi utamanya adalah fetch_visits(). Selain menjalankan kueri asli untuk Visit terbaru, kueri ini juga mengambil stempel waktu Visit terakhir yang ditampilkan dan membuat tugas push yang memanggil /trim (sehingga trim()) untuk menghapus Visit lama secara massal. Berikut cara menggunakannya dengan Cloud NDB:

SEBELUM:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    with ds_client.context():
        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)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return (v.to_dict() for v in data), oldest_str

Perubahan utama:

  1. Ganti kueri Cloud NDB dengan kueri Cloud Datastore yang setara; gaya kuerinya sedikit berbeda.
  2. Datastore tidak memerlukan penggunaan pengelola konteks atau membuat Anda mengekstrak datanya (dengan to_dict()) seperti yang dilakukan Cloud NDB.
  3. Mengganti panggilan logging dengan print()

Setelah perubahan tersebut, fetch_visits() akan terlihat seperti ini:

SETELAH:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    visits = list(query.fetch(limit=limit))
    oldest = time.mktime(visits[-1]['timestamp'].timetuple())
    oldest_str = time.ctime(oldest)
    print('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

Biasanya, hanya itu yang diperlukan. Sayangnya, ada satu masalah utama.

(Mungkin) Membuat antrean (push) baru

Di Modul 7, kita menambahkan penggunaan taskqueue App Engine ke aplikasi Modul 1 yang ada. Salah satu manfaat utama memiliki tugas push sebagai fitur App Engine lama adalah bahwa antrean "default" dibuat secara otomatis. Saat aplikasi tersebut dimigrasikan ke Cloud Tasks di Modul 8, antrean default tersebut sudah ada, jadi kita masih tidak perlu mengkhawatirkannya saat itu. Hal itu berubah di Modul 9.

Salah satu aspek penting yang perlu dipertimbangkan adalah bahwa aplikasi App Engine baru tidak lagi menggunakan layanan App Engine, dan oleh karena itu, Anda tidak dapat lagi mengasumsikan bahwa App Engine secara otomatis membuat antrean tugas di produk lain (Cloud Tasks). Seperti yang ditulis, pembuatan tugas di fetch_visits() (untuk antrean yang tidak ada) akan gagal. Fungsi baru diperlukan untuk memeriksa apakah antrean ("default") ada, dan jika tidak, buat antrean.

Panggil fungsi ini _create_queue_if(), dan tambahkan ke aplikasi Anda tepat di atas fetch_visits() karena di situlah fungsi ini dipanggil. Isi fungsi yang akan ditambahkan:

def _create_queue_if():
    'app-internal function creating default queue if it does not exist'
    try:
        ts_client.get_queue(name=QUEUE_PATH)
    except Exception as e:
        if 'does not exist' in str(e):
            ts_client.create_queue(parent=PATH_PREFIX,
                    queue={'name': QUEUE_PATH})
    return True

Fungsi create_queue() Cloud Tasks memerlukan jalur nama lengkap antrean kecuali nama antrean. Agar lebih sederhana, buat variabel PATH_PREFIX lain yang merepresentasikan QUEUE_PATH dikurangi nama antrean (QUEUE_PATH.rsplit('/', 2)[0]). Tambahkan definisinya di dekat bagian atas sehingga blok kode dengan semua penetapan konstanta terlihat seperti ini:

_, PROJECT_ID = google.auth.default()
REGION_ID = 'REGION_ID'    # replace w/your own
QUEUE_NAME = 'default'     # replace w/your own
QUEUE_PATH = ts_client.queue_path(PROJECT_ID, REGION_ID, QUEUE_NAME)
PATH_PREFIX = QUEUE_PATH.rsplit('/', 2)[0]

Sekarang ubah baris terakhir di fetch_visits() untuk menggunakan _create_queue_if(), dengan membuat antrean terlebih dahulu jika perlu, lalu membuat tugas setelahnya:

    if _create_queue_if():
        ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

Secara keseluruhan, _create_queue_if() dan fetch_visits() sekarang akan terlihat seperti ini:

def _create_queue_if():
    'app-internal function creating default queue if it does not exist'
    try:
        ts_client.get_queue(name=QUEUE_PATH)
    except Exception as e:
        if 'does not exist' in str(e):
            ts_client.create_queue(parent=PATH_PREFIX,
                    queue={'name': QUEUE_PATH})
    return True

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    visits = list(query.fetch(limit=limit))
    oldest = time.mktime(visits[-1]['timestamp'].timetuple())
    oldest_str = time.ctime(oldest)
    print('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    if _create_queue_if():
        ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

Selain harus menambahkan kode tambahan ini, kode Cloud Tasks lainnya sebagian besar tetap utuh dari Modul 8. Bagian kode terakhir yang harus diperhatikan adalah handler tugas.

Memperbarui pengendali tugas (push)

Di handler tugas, trim(), kode Cloud NDB membuat kueri untuk kunjungan yang lebih lama dari yang ditampilkan paling lama. Laporan ini menggunakan kueri khusus kunci untuk mempercepat proses—mengapa harus mengambil semua data jika Anda hanya memerlukan ID Kunjungan? Setelah Anda memiliki semua ID kunjungan, hapus semuanya secara batch dengan fungsi delete_multi() Cloud NDB.

SEBELUM:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    with ds_client.context():
        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

Seperti fetch_visits(), sebagian besar perubahan melibatkan penggantian kode Cloud NDB dengan Cloud Datastore, penyesuaian gaya kueri, penghapusan penggunaan pengelola konteksnya, dan perubahan panggilan logging ke print().

SETELAH:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    query = ds_client.query(kind='Visit')
    query.add_filter('timestamp', '<', datetime.fromtimestamp(oldest))
    query.keys_only()
    keys = list(visit.key for visit in query.fetch())
    nkeys = len(keys)
    if nkeys:
        print('Deleting %d entities: %s' % (
                nkeys, ', '.join(str(k.id) for k in keys)))
        ds_client.delete_multi(keys)
    else:
        print('No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

Tidak ada perubahan pada handler aplikasi utama root().

Melakukan porting ke Python 3

Aplikasi contoh ini dirancang untuk berjalan di Python 2 dan 3. Perubahan khusus Python 3 telah dibahas sebelumnya di bagian yang relevan dalam tutorial ini. Tidak ada langkah tambahan maupun library kompatibilitas yang diperlukan.

Update Cloud Tasks

Versi akhir library klien Cloud Tasks yang mendukung Python 2 adalah 1.5.0. Pada saat penulisan ini, library klien untuk Python 3 versi terbaru sepenuhnya kompatibel dengan versi tersebut, sehingga tidak diperlukan update lebih lanjut.

Pembaruan template HTML

Tidak ada perubahan yang diperlukan dalam file template HTML, templates/index.html, sehingga semua perubahan yang diperlukan untuk mendapatkan aplikasi Modul 9 telah selesai.

6. Ringkasan/Pembersihan

Men-deploy dan memverifikasi aplikasi

Setelah Anda menyelesaikan pembaruan kode, terutama port ke Python 3, deploy aplikasi Anda dengan gcloud app deploy. Outputnya harus sama dengan aplikasi dari Modul 7 dan 8, kecuali Anda telah memindahkan akses database ke library klien Cloud Datastore dan telah mengupgrade ke Python 3:

Aplikasi visitme Modul 7

Langkah ini menyelesaikan codelab. Sebaiknya bandingkan kode Anda dengan yang ada di folder Modul 9. Selamat!

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/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • Link penyimpanan di atas bergantung pada PROJECT_ID dan *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:

Langkah berikutnya

Dengan demikian, kita telah menyelesaikan migrasi dari tugas push App Engine Task Queue ke Cloud Tasks. Migrasi opsional dari Cloud NDB ke Cloud Datastore juga dibahas secara terpisah (tanpa Task Queue atau Cloud Tasks) di Modul 3. Selain Modul 3, ada modul migrasi lain yang berfokus pada cara beralih dari layanan paket lama App Engine yang perlu dipertimbangkan, termasuk:

  • Modul 2: bermigrasi dari App Engine NDB ke Cloud NDB
  • Modul 3: bermigrasi dari Cloud NDB ke Cloud Datastore
  • Modul 12-13: bermigrasi dari App Engine Memcache ke Cloud Memorystore
  • Modul 15-16: bermigrasi dari Blobstore App Engine ke Cloud Storage
  • Modul 18-19: App Engine Task Queue (pull tasks) ke Cloud Pub/Sub

App Engine bukan lagi satu-satunya platform serverless di Google Cloud. Jika Anda memiliki aplikasi App Engine kecil atau aplikasi yang memiliki fungsi terbatas dan ingin mengubahnya menjadi microservice mandiri, atau Anda ingin memecah aplikasi monolitik menjadi beberapa komponen yang dapat digunakan kembali, ini adalah alasan yang baik untuk mempertimbangkan beralih ke Cloud Functions. Jika containerisasi telah menjadi bagian dari alur kerja pengembangan aplikasi Anda, terutama jika terdiri dari pipeline CI/CD (continuous integration/continuous delivery atau deployment), pertimbangkan untuk bermigrasi ke Cloud Run. Skenario ini dibahas dalam modul berikut:

  • Bermigrasi dari App Engine ke Cloud Functions: lihat Modul 11
  • Melakukan migrasi dari App Engine ke Cloud Run: lihat Modul 4 untuk mem-build aplikasi dalam container dengan Docker, atau Modul 5 untuk melakukannya tanpa container, pengetahuan Docker, atau Dockerfile

Beralih ke platform serverless lain bersifat opsional, dan sebaiknya pertimbangkan opsi terbaik untuk aplikasi dan kasus penggunaan Anda sebelum melakukan perubahan apa pun.

Terlepas dari modul migrasi mana yang akan Anda pertimbangkan berikutnya, semua konten Serverless Migration Station (codelab, video, kode sumber [jika tersedia]) dapat diakses di repo open source-nya. README repo juga memberikan panduan tentang migrasi mana yang perlu dipertimbangkan dan "urutan" Modul Migrasi yang relevan.

7. Referensi lainnya

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 8 (START) dan Modul 9 (FINISH) dapat ditemukan pada tabel di bawah. Link tersebut juga dapat diakses dari repo untuk semua migrasi codelab App Engine yang dapat Anda clone atau download file ZIP.

Codelab

Python 2

Python 3

Modul 8

kode

(T/A)

Modul 9

(T/A)

kode

Referensi online

Berikut adalah referensi online yang mungkin relevan untuk tutorial ini:

App Engine

Cloud NDB

Cloud Datastore

Cloud Tasks

Informasi Cloud lainnya

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.