Halaman ini membahas petunjuk untuk bermigrasi dari runtime Python generasi pertama ke generasi kedua. Untuk mengupgrade aplikasi generasi kedua agar dapat menggunakan versi terbaru Python yang didukung, lihat Mengupgrade aplikasi yang ada.
Python 2.7 telah mencapai akhir dukungan pada 31 Januari 2024. Aplikasi Python 2.7 yang ada akan terus berjalan dan menerima traffic. Namun, App Engine mungkin memblokir deployment ulang aplikasi yang menggunakan runtime setelah tanggal akhir dukungannya. Sebaiknya migrasikan ke versi Python terbaru yang didukung menggunakan panduan di halaman ini.
Dengan bermigrasi ke runtime Python 3, Anda dapat menggunakan fitur bahasa terbaru
dan membangun aplikasi yang lebih portabel dengan kode idiomatis. Runtime Python 3
menggunakan penafsir Python open source versi terbaru yang disediakan oleh
Python Software Foundation.
Aplikasi yang di-build dalam runtime Python 3 dapat menggunakan ekosistem paket
dan framework Python yang kaya di aplikasi Anda, termasuk yang menggunakan kode C, dengan mendeklarasikan
dependensi dalam file requirements.txt
.
Ringkasan proses migrasi runtime
Kami merekomendasikan pendekatan inkremental berikut untuk migrasi runtime, dengan Anda mempertahankan aplikasi yang berfungsi dan dapat diuji selama proses berlangsung:
Upgrade aplikasi Anda agar kompatibel dengan Python 3.
Beberapa solusi tersedia untuk membantu upgrade ini. Misalnya, gunakan Six, Python-Future, atau Python-Modernize.
Untuk informasi selengkapnya tentang langkah proses migrasi runtime ini, lihat Melakukan porting Kode Python 2 ke Python 3 di situs dokumentasi Python Software Foundation.
Pilih salah satu strategi implementasi berikut untuk layanan paket App Engine yang digunakan aplikasi Anda:
Migrasikan layanan paket lama di aplikasi Python 2 Anda ke layanan Google Cloud yang tidak dipaketkan, layanan pihak ketiga, atau pengganti yang direkomendasikan lainnya.
Terus menggunakan paket layanan lama di aplikasi Python 3 Anda. Pendekatan ini memberi Anda fleksibilitas untuk beralih ke layanan yang tidak terpaket nanti selama siklus migrasi.
Pastikan untuk menguji aplikasi Anda setelah memigrasikan setiap layanan.
Siapkan file konfigurasi App Engine untuk runtime Python 3. Beberapa perubahan penting memengaruhi setelan konfigurasi di
app.yaml
, termasuk, tetapi tidak terbatas pada:- Aplikasi sekarang diasumsikan sebagai threadsafe. Jika aplikasi Anda tidak
threadsafe, Anda harus menetapkan
max_concurrent_requests
diapp.yaml
ke 1. Setelan ini dapat menyebabkan lebih banyak instance yang dibuat daripada yang dibutuhkan untuk aplikasi threadsafe, dan menyebabkan biaya yang tidak perlu. File
app.yaml
tidak lagi merutekan permintaan ke skrip Anda. Sebagai gantinya, Anda harus menggunakan framework web dengan perutean dalam aplikasi, dan memperbarui atau menghapus semua pengendaliscript
diapp.yaml
. Untuk contoh cara melakukannya dengan framework Flask, lihat contoh kode panduan migrasi App Engine di GitHub.Untuk mempelajari lebih lanjut cara mengubah file ini dan file konfigurasi lainnya, lihat bagian File konfigurasi.
- Aplikasi sekarang diasumsikan sebagai threadsafe. Jika aplikasi Anda tidak
threadsafe, Anda harus menetapkan
Dalam runtime generasi kedua, log aplikasi tidak lagi disusun secara bertingkat dalam log permintaan. Langkah-langkah tambahan diperlukan untuk menampilkan tampilan bertingkat log permintaan dan aplikasi di Logs Explorer. Untuk informasi selengkapnya, lihat Bermigrasi ke Cloud Logging.
Uji dan deploy aplikasi yang telah diupgrade di lingkungan Python 3.
Setelah semua pengujian lulus, deploy aplikasi yang telah diupgrade ke App Engine, tetapi cegah traffic memilih rute secara otomatis ke versi baru. Gunakan pemisahan traffic untuk memigrasikan traffic secara perlahan dari aplikasi Anda di runtime Python 2 ke aplikasi di runtime Python 3. Jika mengalami masalah, Anda dapat mengarahkan semua traffic ke versi stabil hingga masalah tersebut diperbaiki.
Untuk contoh cara mengonversi aplikasi Python 2 ke Python 3, Anda dapat merujuk resource tambahan ini.
Perbedaan utama antara runtime Python 2 dan Python 3
Sebagian besar perubahan yang perlu Anda buat selama migrasi runtime berasal dari perbedaan berikut antara runtime Python 2 dan Python 3:
- Perbedaan penggunaan memori
- Perbedaan penggunaan CPU
- Perbedaan header permintaan
- Perbedaan pekerja Gunicorn
- Masalah kompatibilitas antara Python 2 dan Python 3
- Layanan paket App Engine di runtime Python 3
- Perbedaan file konfigurasi
- Framework web diperlukan untuk mengarahkan permintaan konten dinamis
- Aplikasi dengan konten statis saja
- Perbedaan pengujian
- Perbedaan deployment
Perbedaan penggunaan memori
Runtime generasi kedua memiliki dasar penggunaan memori yang lebih tinggi dibandingkan dengan runtime generasi pertama. Hal ini disebabkan oleh beberapa faktor, seperti versi gambar dasar yang berbeda, dan perbedaan dalam cara kedua generasi menghitung penggunaan memori.
Runtime generasi kedua menghitung penggunaan memori instance sebagai jumlah dari apa yang digunakan proses aplikasi, dan jumlah file aplikasi yang di-cache secara dinamis di memori. Agar aplikasi yang intensif memori tidak mengalami penghentian instance karena melebihi batas memori, upgrade ke class instance yang lebih besar dengan lebih banyak memori.
Perbedaan penggunaan CPU
Runtime generasi kedua dapat melihat baseline penggunaan CPU yang lebih tinggi saat cold start instance. Bergantung pada konfigurasi penskalaan aplikasi, hal ini mungkin memiliki efek samping yang tidak diinginkan, seperti jumlah instance yang lebih tinggi dari yang diperkirakan jika aplikasi dikonfigurasi untuk diskalakan berdasarkan penggunaan CPU. Untuk menghindari masalah ini, tinjau dan uji konfigurasi penskalaan aplikasi untuk memastikan jumlah instance dapat diterima.
Perbedaan header permintaan
Runtime generasi pertama memungkinkan header permintaan dengan garis bawah
(misalnya, X-Test-Foo_bar
) diteruskan ke aplikasi. Runtime generasi kedua memperkenalkan Nginx ke dalam arsitektur host. Sebagai akibat dari perubahan
ini, runtime generasi kedua dikonfigurasi untuk otomatis menghapus
header dengan garis bawah (_
). Untuk mencegah masalah aplikasi, hindari penggunaan
garis bawah di header permintaan aplikasi.
Perbedaan pekerja Gunicorn
Untuk runtime Python 3+, jumlah pekerja Gunicorn memiliki dampak langsung pada penggunaan memori. Peningkatan penggunaan memori berbanding lurus dengan peningkatan jumlah pekerja. Untuk mengurangi konsumsi memori, pertimbangkan untuk mengurangi jumlah pekerja Gunicorn. Lihat Praktik terbaik titik entri untuk mengetahui petunjuk cara mengonfigurasi jumlah pekerja Gunicorn
Masalah kompatibilitas antara Python 2 dan Python 3
Saat Python 3 pertama kali dirilis pada tahun 2008,
beberapa perubahan yang tidak kompatibel dengan versi sebelumnya
diperkenalkan ke bahasa ini. Beberapa perubahan ini hanya memerlukan update kecil
pada kode Anda, seperti mengubah pernyataan print
menjadi fungsi print()
.
Perubahan lain mungkin memerlukan update signifikan pada kode Anda, seperti memperbarui
cara menangani data biner, teks, dan string.
Banyak library open source yang populer, termasuk library standar Python, juga berubah saat berpindah dari Python 2 ke Python 3.
Layanan paket App Engine di runtime Python 3
Untuk mengurangi upaya dan kompleksitas migrasi, lingkungan standar App Engine memungkinkan Anda mengakses banyak layanan dan API paket lama di runtime Python 3, seperti Memcache. Aplikasi Python 3 Anda dapat memanggil API layanan paket melalui library idiomatis bahasa, dan mengakses fungsi yang sama seperti pada runtime Python 2.
Anda juga memiliki opsi untuk menggunakan produk Google Cloud yang menawarkan fungsi serupa dengan layanan paket lama. Sebaiknya pertimbangkan untuk bermigrasi ke produk Google Cloud yang tidak dipaketkan agar Anda dapat memanfaatkan peningkatan berkelanjutan dan fitur baru.
Untuk paket layanan yang tidak tersedia sebagai produk terpisah di Google Cloud, seperti pemrosesan gambar, penelusuran, dan pesan, Anda dapat menggunakan penyedia pihak ketiga atau solusi lain yang disarankan.
File konfigurasi
Sebelum dapat menjalankan aplikasi di runtime Python 3 di lingkungan standar App Engine, Anda mungkin perlu mengubah beberapa file konfigurasi yang digunakan App Engine:
app.yaml
. Perilaku beberapa kolom dalam file konfigurasiapp.yaml
Anda telah diubah. Hapus kolom yang tidak digunakan lagi dan perbarui kolom lain seperti yang dijelaskan dalam panduan migrasi.requirements.txt
. Buat file ini untuk menginstal dependensi pihak ketiga, termasuk paket Python yang memerlukan ekstensi C native. App Engine otomatis menginstal dependensi ini selama deployment aplikasi di runtime Python 3. Sebelumnya, untuk menginstal dependensi di runtime Python 2, Anda harus mencantumkan library yang disalin atau dipaketkan sendiri dalam file ini lalu jalankan perintahpip install -t lib -r requirements.txt
, atau cantumkan library pihak ketiga 'bawaan' yang diwajibkan aplikasi Anda di File app.yaml.appengine_config.py
. File ini tidak digunakan dalam runtime Python 3 dan akan diabaikan jika di-deploy. Sebelumnya, dalam runtime Python 2, file ini digunakan untuk mengonfigurasi modul Python dan mengarahkan aplikasi ke library pihak ketiga yang disalin atau dipaketkan sendiri.
Framework web yang diperlukan untuk mengarahkan permintaan konten dinamis
Pada runtime Python 2, Anda dapat membuat pengendali URL di file app.yaml
untuk menentukan aplikasi yang akan dijalankan
saat ada permintaan URL atau pola URL tertentu.
Pada runtime Python 3, aplikasi Anda harus menggunakan framework web seperti
Flask atau Django untuk merutekan permintaan konten dinamis, bukan menggunakan
pengendali URL di app.yaml
. Untuk konten statis, Anda dapat terus membuat pengendali
URL
di file app.yaml
aplikasi Anda.
Aplikasi dengan konten statis saja
Saat menghosting aplikasi web statis di App Engine,
Anda menentukan pengendali di file app.yaml
untuk memetakan URL ke file statis Anda.
Di Python 2, jika permintaan tidak cocok dengan salah satu pengendali yang ditentukan dalam
file app.yaml
, App Engine akan menampilkan kode error 404
.
Di Python 3, jika permintaan tidak cocok dengan salah satu pengendali, App Engine
akan mencari file main.py
, dan menampilkan error 5xx
jika file main.py
tidak
ditemukan. Karena aplikasi App Engine dengan konten statis saja tidak memerlukan
file main.py
, sebagian besar pengguna akan melihat error ini, selain melihat error
pengaktifan instance dalam log aplikasi.
Untuk mempertahankan perilaku yang sama yang menampilkan error 404
jika tidak ada pengendali statis
yang cocok, dan untuk menghindari error dalam log, Anda dapat:
- Menambahkan pengendali statis generik yang mengarah ke direktori kosong di file
app.yaml
- Menambahkan aplikasi dinamis sederhana di file
main.py
untuk menampilkan error404
Contoh penggunaan salah satu opsi:
app.yaml
Buat direktori kosong di direktori aplikasi root, seperti empty/
.
Di bagian pengendali file app.yaml
, buat pengendali baru di bagian paling akhir untuk menangkap
semua pola URL lainnya, lalu tentukan direktori empty
di
static_files
dan elemen upload
:
handlers:
- url:
.
.
.
- url: /(.*)$
static_files: empty/\1
upload: empty/.*$
main.py
Buat file main.py
dan tambahkan kode berikut untuk menampilkan error 404
:
def app(env, start_response):
start_response('404 Not Found', [('Content-Type','text/html')])
return [b"Not Found"]
Pengujian
Sebaiknya gunakan pendekatan pengujian yang idiomatis untuk Python,
bukan bergantung pada dev_appserver
. Misalnya, Anda dapat menggunakan venv
untuk
membuat lingkungan Python 3 lokal yang terisolasi. Semua framework pengujian
Python standar dapat digunakan untuk menulis pengujian unit, integrasi, dan sistem Anda. Anda
juga dapat mempertimbangkan untuk menyiapkan versi pengembangan layanan Anda atau menggunakan
emulator lokal yang tersedia untuk berbagai produk Google Cloud.
Secara opsional, Anda dapat menggunakan versi pratinjau dev_appserver
yang mendukung
Python 3. Untuk mempelajari fitur pengujian ini lebih lanjut, baca
Menggunakan Server Pengembangan Lokal.
Men-deploy
Deployment melalui appcfg.py
tidak
tidak didukung untuk Python 3.
Sebagai gantinya, gunakan
alat command line gcloud
untuk men-deploy aplikasi Anda.
Logging
Logging di runtime Python 3 mengikuti standar logging di Cloud Logging. Pada runtime Python 3, log aplikasi tidak lagi dipaketkan dengan log permintaan, tetapi dipisahkan dalam data yang berbeda. Untuk mempelajari lebih lanjut cara membaca dan menulis log di runtime Python 3, lihat panduan logging.
Referensi migrasi tambahan
Untuk informasi tambahan tentang cara memigrasikan aplikasi App Engine ke layanan Cloud mandiri atau runtime Python 3, Anda dapat merujuk resource App Engine berikut:
- Video dan codelab migrasi aplikasi serverless
- Contoh hasil kontribusi komunitas migrasi aplikasi Python 2 ke Python 3