Bermigrasi dari Python 2.7 ke runtime Python 3 terbaru

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:

  1. 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.

  2. Pilih salah satu strategi implementasi berikut untuk layanan paket App Engine yang digunakan aplikasi Anda:

    1. Migrasikan layanan paket lama di aplikasi Python 2 Anda ke layanan Google Cloud yang tidak dipaketkan, layanan pihak ketiga, atau pengganti yang direkomendasikan lainnya.

    2. 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.

  3. 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 di app.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 pengendali script di app.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.

  4. 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.

  5. 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

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 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 setelah 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:

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 error 404

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: