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

1. Ringkasan

Rangkaian codelab Stasiun Migrasi Serverless (tutorial interaktif dan mandiri) dan video terkait bertujuan untuk membantu developer tanpa server Google Cloud memodernisasi aplikasi mereka dengan memandu mereka melalui satu atau beberapa migrasi, terutama yang beralih dari layanan lama. Dengan melakukannya, aplikasi Anda akan menjadi lebih portabel serta memberi Anda lebih banyak opsi dan fleksibilitas, sehingga Anda dapat berintegrasi dengan dan mengakses lebih banyak produk Cloud serta melakukan upgrade 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 platform lainnya jika berlaku.

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

Kami menambahkan penggunaan Task Queue untuk tugas push di Modul 7, lalu memigrasikan penggunaan tersebut ke Cloud Tasks di Modul 8. Di Modul 9, kita akan lanjut ke Python 3 dan Cloud Datastore. Mereka yang menggunakan Task Queue untuk tugas pull akan dimigrasikan ke Cloud Pub/Sub dan harus merujuk ke Modul 18-19.

Anda akan mempelajari cara

  • Melakukan porting aplikasi contoh Modul 8 ke Python 3
  • Mengalihkan akses Datastore dari Cloud NDB ke library klien Cloud Datastore
  • Mengupgrade 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 App Engine Python 2 Flask. Di Modul 8, Anda akan memigrasikan aplikasi tersebut dari Task Queue ke Cloud Tasks. Di sini, di Modul 9, Anda akan melanjutkan perjalanan dan mem-port aplikasi tersebut ke Python 3 serta mengalihkan akses Datastore dari penggunaan Cloud NDB ke library klien Cloud Datastore native.

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

Terakhir, pengembangan library klien Cloud Tasks hanya berlanjut di Python 3, jadi kami "memigrasikan" dari salah satu versi Python 2 akhir ke Python 3 kontemporer-nya. Untungnya, tidak ada perubahan yang dapat menyebabkan gangguan dari Python 2, yang berarti tidak ada lagi yang perlu Anda lakukan di sini.

Tutorial ini menampilkan 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 kode siap untuk dimigrasikan ke layanan Cloud.

1. Siapkan project

Jika Anda telah 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 aktif dan aplikasi App Engine yang aktif. Temukan project ID Anda sesuai kebutuhan selama codelab ini, gunakan setiap kali Anda menemukan variabel PROJECT_ID.

2. Dapatkan aplikasi contoh dasar pengukuran

Salah satu prasyarat 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 memandu Anda melakukan migrasi, yang diakhiri dengan kode yang menyerupai yang ada di folder repo Modul 9 ("FINISH").

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

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

3. Deploy (ulang) dan validasi aplikasi dasar pengukuran

Jalankan 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 ulang lib. Anda mungkin harus menggunakan pip2 jika sudah menginstal Python 2 dan 3 pada mesin pengembangan Anda.
  2. Pastikan Anda telah menginstal dan melakukan inisialisasi alat command line gcloud dan meninjau penggunaannya.
  3. (opsional) Setel project Cloud dengan gcloud config set project PROJECT_ID jika Anda tidak ingin memasukkan PROJECT_ID dengan setiap perintah gcloud yang dikeluarkan.
  4. Men-deploy aplikasi contoh dengan gcloud app deploy
  5. Pastikan aplikasi berjalan seperti yang diharapkan tanpa masalah. Jika Anda sudah menyelesaikan codelab Modul 8, aplikasi akan menampilkan pengunjung teratas beserta kunjungan terbaru (diilustrasikan di bawah). Di bagian bawah, terdapat indikasi tugas lama yang akan dihapus.

4aa8a2cb5f527079.pngS

4. Update konfigurasi

requirements.txt

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

flask
google-cloud-datastore
google-cloud-tasks

File requirements.txt ini tidak menampilkan nomor versi apa pun, yang berarti versi terbaru akan dipilih. Jika muncul inkompatibilitas, penggunaan nomor versi untuk mengunci versi kerja aplikasi merupakan praktik standar.

app.yaml

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

Update 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 disalurkan dari aplikasi contoh ini, memiliki pengendali apa pun tidak akan relevan, jadi hapus juga seluruh bagian handlers.

Satu-satunya hal yang diperlukan di app.yaml adalah menetapkan runtime ke versi Python 3 yang didukung, misalnya 3.10. Buat perubahan ini sehingga app.yaml baru yang disingkat hanya berisi 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 oleh developer ke cloud. Library ini tidak lagi tersedia di runtime generasi ke-2.
  • Menyalin library non-bawaan (terkadang disebut "vendor" atau "bundling mandiri") tidak lagi diperlukan dalam runtime generasi ke-2. Sebaliknya, aplikasi tersebut akan tercantum di requirements.txt tempat sistem build menginstalnya secara otomatis atas nama Anda pada waktu deployment.

Akibat perubahan pada pengelolaan paket pihak ketiga tersebut, file appengine_config.py atau folder lib tidak diperlukan, jadi hapus file tersebut. Pada runtime generasi ke-2, App Engine menginstal paket pihak ketiga secara otomatis yang tercantum di requirements.txt. Merangkum:

  1. Tidak ada library pihak ketiga yang dipaketkan sendiri atau disalin; cantumkan di requirements.txt
  2. Tidak ada pip install dalam folder lib, artinya tidak ada periode folder lib
  3. Tidak ada listingan library pihak ketiga bawaan (sehingga tidak ada bagian libraries) di app.yaml; cantumkan di requirements.txt
  4. Tidak ada library pihak ketiga yang menjadi referensi dari aplikasi Anda, artinya 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 "perbedaan" ilustrasi tentang perubahan keseluruhan yang perlu dilakukan untuk memfaktorkan ulang kode yang ada ke dalam aplikasi baru. Pembaca tidak diharapkan membaca kode baris demi baris, karena tujuannya hanya untuk mendapatkan gambaran umum tentang apa yang diperlukan dalam pemfaktoran ulang ini (tetapi jangan ragu untuk membuka di tab baru atau mendownload dan memperbesar jika diinginkan).

5d043768ba7be742.pngS

Memperbarui impor dan inisialisasi

Bagian impor di main.py untuk Modul 8 menggunakan Cloud NDB dan Cloud Tasks; tampilannya akan terlihat 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 dalam 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)

Dengan demikian, 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. Dengan perubahan yang dibuat ini, bagian atas aplikasi baru Anda sekarang 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, Visit. Fungsi store_visit() berfungsi sama di semua modul migrasi lainnya: fungsi ini mendaftarkan kunjungan dengan membuat data Visit baru, sehingga menyimpan alamat IP klien dan agen pengguna (jenis browser) 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 secara otomatis membuat stempel waktu saat kumpulan 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(). Fungsi ini tidak hanya menjalankan kueri asli untuk Visit terbaru, tetapi juga mengambil stempel waktu Visit terakhir yang ditampilkan dan membuat tugas push yang memanggil /trim (sehingga trim()) untuk menghapus Visit lama secara massal. Berikut ini menggunakan 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. Menukar kueri Cloud NDB dengan 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 inilah yang diperlukan. Sayangnya, ada satu masalah utama.

(Mungkin) Buat antrean (push) baru

Dalam Modul 7, kita menambahkan penggunaan App Engine taskqueue ke aplikasi Modul 1 yang ada. Salah satu manfaat utama memiliki tugas push sebagai fitur App Engine lama adalah "default" antrean akan otomatis dibuat. Saat aplikasi tersebut dimigrasikan ke Cloud Tasks di Modul 8, antrean default tersebut sudah ada di sana, sehingga kita masih tidak perlu mengkhawatirkannya. Itu perubahan di sini di Modul 9.

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

Panggil fungsi ini _create_queue_if(), dan tambahkan ke aplikasi Anda tepat di atas fetch_visits() karena di situlah fungsi tersebut 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 nama jalur lengkap antrean kecuali nama antrean. Untuk mempermudah, buat variabel lain PATH_PREFIX yang mewakili QUEUE_PATH dikurangi nama antrean (QUEUE_PATH.rsplit('/', 2)[0]). Tambahkan definisinya di dekat bagian atas sehingga blok kode dengan semua penetapan konstan 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(), pertama-tama membuat antrean jika perlu, lalu membuat tugas setelahnya:

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

_create_queue_if() dan fetch_visits() sekarang akan terlihat seperti ini secara gabungan:

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 masih utuh dari Modul 8. Bagian terakhir kode yang harus dilihat adalah pengendali tugas.

Memperbarui pengendali tugas (push)

Di pengendali tugas, trim(), kueri kode Cloud NDB untuk kunjungan yang lebih lama dari kunjungan terlama yang ditampilkan. Kueri ini menggunakan kueri khusus kunci untuk mempercepat proses—mengapa mengambil semua data jika Anda hanya memerlukan ID Kunjungan? Setelah Anda memiliki semua ID kunjungan, hapus semuanya dalam satu 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 pertukaran kode Cloud NDB untuk Cloud Datastore, mengubah gaya kueri, menghapus penggunaan pengelola konteksnya, dan mengubah 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 pengendali aplikasi utama root().

Port ke Python 3

Aplikasi contoh ini dirancang untuk berjalan di Python 2 dan 3. Semua perubahan khusus Python 3 dibahas sebelumnya di bagian yang relevan dari tutorial ini. Tidak ada langkah tambahan atau library kompatibilitas yang diperlukan.

Info terbaru tentang Cloud Tasks

Versi final library klien Cloud Tasks yang mendukung Python 2 adalah 1.5.0. Pada saat penulisan ini, versi terbaru library klien untuk Python 3 sudah 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 menyelesaikan semua perubahan yang diperlukan untuk sampai di aplikasi Modul 9.

6. Ringkasan/Pembersihan

Men-deploy dan memverifikasi aplikasi

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

Aplikasi visitme Modul 7

Langkah ini menyelesaikan codelab. Kami mengundang Anda untuk membandingkan kode Anda dengan yang ada di folder Modul 9. Selamat!

Pembersihan

Umum

Jika sudah selesai untuk saat ini, sebaiknya nonaktifkan aplikasi App Engine agar tidak menimbulkan penagihan. Namun, jika Anda ingin menguji atau bereksperimen lagi, platform App Engine memiliki kuota gratis, dan asalkan Anda tidak melebihi tingkat penggunaan tersebut, Anda tidak akan dikenai biaya. Itu berlaku 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 "Khusus untuk codelab ini" di bawah ini.

Untuk pengungkapan penuh, deployment ke platform komputasi serverless Google Cloud seperti App Engine akan menimbulkan biaya build dan penyimpanan yang kecil. Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Penyimpanan gambar tersebut menghabiskan sebagian kuota tersebut. Namun, Anda mungkin tinggal di region yang tidak memiliki paket gratis tersebut, jadi perhatikan penggunaan penyimpanan Anda untuk meminimalkan potensi biaya. "Folder" Cloud Storage tertentu yang harus Anda tinjau mencakup:

  • 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*asi Anda, misalnya, "us" jika aplikasi Anda dihosting di AS.

Di sisi lain, jika Anda tidak akan melanjutkan aplikasi ini atau codelab migrasi terkait lainnya dan ingin menghapus semuanya sepenuhnya, nonaktifkan project Anda.

Khusus untuk codelab ini

Layanan yang tercantum di bawah bersifat unik untuk codelab ini. Lihat dokumentasi setiap produk untuk mengetahui informasi selengkapnya:

Langkah berikutnya

Ini mengakhiri migrasi kita dari tugas push Task Queue App Engine ke Cloud Tasks. Migrasi opsional dari Cloud NDB ke Cloud Datastore juga dibahas secara mandiri (tanpa Task Queue atau Cloud Tasks) dalam Modul 3. Selain Modul 3, ada modul migrasi lain yang berfokus untuk beralih dari layanan paket lama App Engine yang perlu dipertimbangkan meliputi:

  • Modul 2: bermigrasi dari NDB App Engine ke Cloud NDB
  • Modul 3: bermigrasi dari Cloud NDB ke Cloud Datastore
  • Modul 12-13: bermigrasi dari Memcache App Engine ke Cloud Memorystore
  • Modul 15-16: bermigrasi dari Blobstore App Engine ke Cloud Storage
  • Modul 18-19: Task Queue App Engine (tugas pull) 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, berikut adalah alasan bagus untuk mempertimbangkan beralih ke Cloud Functions. Jika containerization telah menjadi bagian dari alur kerja pengembangan aplikasi Anda, terutama jika terdiri dari pipeline CI/CD (continuous integration/continuous delivery atau deployment), sebaiknya lakukan migrasi ke Cloud Run. Skenario ini dibahas dalam modul berikut:

  • Bermigrasi dari App Engine ke Cloud Functions: lihat Modul 11
  • Bermigrasi dari App Engine ke Cloud Run: lihat Modul 4 untuk menyimpan aplikasi Anda ke dalam container dengan Docker, atau Modul 5 untuk melakukannya tanpa container, pengetahuan Docker, atau Dockerfile

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

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

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

Sumber daya {i>online<i}

Di bawah ini 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.