Runtime Python

Runtime Python adalah stack software yang bertanggung jawab untuk menginstal kode aplikasi dan dependensi Anda, lalu menjalankan aplikasi tersebut di lingkungan fleksibel.

  • Versi 3.8 dan yang lebih baru dibuat menggunakan buildpack, yang mengharuskan Anda memilih sistem operasi di file app.yaml. Misalnya, untuk menggunakan Python 3.12, Anda harus menentukan Ubuntu 22 sebagai sistem operasi.

  • Versi 3.7 dan yang lebih lama dibangun menggunakan Docker.

Untuk daftar lengkap versi Python yang didukung, dan versi Ubuntu yang sesuai, lihat Jadwal dukungan runtime.

Versi runtime baru

Untuk runtime Python versi 3.8 dan yang lebih baru, Anda harus menyertakan setelan runtime_config dan operating_system dalam file app.yaml guna menentukan sistem operasi.

Untuk menggunakan runtime baru, Anda harus menginstal CLI gcloud versi 420.0.0 atau yang lebih baru. Anda dapat memperbarui alat CLI dengan menjalankan perintah gcloud components update. Untuk melihat versi yang diinstal, jalankan perintah gcloud version.

Opsional: Anda dapat menentukan versi runtime dengan menyertakan setelan runtime_version dalam file app.yaml. Secara default, versi Python terbaru digunakan jika setelan runtime_version tidak ditentukan.

Contoh

  • Untuk menentukan Python 3.12 di Ubuntu 22:

    runtime: python
    env: flex
    entrypoint: gunicorn -b :$PORT main:app
    
    runtime_config:
        operating_system: "ubuntu22"
        runtime_version: "3.12"
    
  • Untuk menentukan versi Python terbaru yang didukung di Ubuntu 22:

      runtime: python
      env: flex
      entrypoint: gunicorn -b :$PORT main:app
    
      runtime_config:
          operating_system: "ubuntu22"
    

Lihat halaman referensi app.yaml untuk informasi selengkapnya.

Versi runtime sebelumnya

Untuk Python versi 3.7 dan yang lebih lama, tentukan versi menggunakan setelan runtime_config dan python_version di file app.yaml aplikasi Anda.

Contoh

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3.7

Untuk Python versi 3.7 dan yang lebih lama, penafsir default-nya adalah Python 2.7.12 jika runtime_config atau python_version dihilangkan. Misalnya, Anda dapat menggunakan runtime default dengan menetapkan runtime: python dalam file app.yaml:

runtime: python
env: flex

Lihat halaman referensi app.yaml untuk informasi selengkapnya.

Penafsir yang di-deploy untuk setiap setelan versi ditampilkan dalam tabel berikut:

Setelan python_version Penafsir yang di-deploy ID Runtime Contoh app.yaml
2 (default) 2.7.12 python2 runtime_config:
python_version: 2
3.4 3.4.8 python34 runtime_config:
python_version: 3.4
3.5 3.5.9 python35 runtime_config:
python_version: 3.5
3 atau 3.6 3.6.10 python36 runtime_config:
python_version: 3
3.7 3.7.9 python37 runtime_config:
python_version: 3.7

Dukungan runtime Python lain

Jika versi Python yang diinginkan tidak tercantum, ada beberapa opsi:

  1. Lingkungan fleksibel App Engine: Buat runtime kustom dan pilih image dasar yang valid dengan versi Python yang Anda butuhkan.
  2. Lingkungan standar App Engine: Python 3.7, 3.8, 3.9, 3.10, dan 3.11 didukung.
  3. Cloud Functions: Python 3.7, 3.8, 3.9, dan 3.10 didukung.
  4. Cloud Run: Tempatkan aplikasi Anda ke dalam container berdasarkan image container untuk versi Python yang diperlukan (lihat Panduan Memulai Python). Karena image Python 3.10 sudah tersedia, Anda dapat men-deploy versi itu sekarang.

Untuk lingkungan fleksibel App Engine atau Cloud Run, lihat Membangun runtime kustom untuk image dasar yang disediakan Google atau Image dasar Python Docker untuk image Python yang saat ini tersedia, termasuk informasi image Python 2.

Untuk menyelidiki lebih lanjut menempatkan aplikasi App Engine ke dalam container untuk Cloud Run, lihat codelab dan konten video yang membahas containerization dengan Docker atau tanpa Docker. Perlu diperhatikan bahwa konten ini sekarang hanya mencakup lingkungan standar App Engine hingga migrasi Cloud Run.

Dependensi

Runtime mencari file requirements.txt dalam direktori sumber aplikasi Anda dan menggunakan pip untuk menginstal dependensi apa pun sebelum memulai aplikasi Anda. Untuk informasi selengkapnya tentang mendeklarasikan dan mengelola paket, lihat Menggunakan Library Python.

Jika aplikasi memerlukan dependensi pribadi, Anda harus menggunakan runtime kustom berdasarkan runtime Python untuk menginstal paket yang sesuai.

Menggunakan library C dengan Python

Untuk mengaktifkan penggunaan paket Python yang memerlukan ekstensi C, header untuk versi Python saat ini dan paket Ubuntu berikut sudah diinstal sebelumnya di sistem:

  • build-essential
  • ca-certificates
  • curl
  • gfortran
  • git
  • libatlas-dev
  • libblas-dev
  • libcurl4-openssl-dev
  • libffi-dev
  • libfreetype6-dev
  • libjpeg-dev
  • liblapack-dev
  • libmemcached-dev
  • libmysqlclient-dev
  • libpng12-dev
  • libpq-dev
  • libquadmath0
  • libsasl2-2
  • libsasl2-dev
  • libsasl2-modules
  • libsqlite3-dev
  • libssl-dev
  • libxml2-dev
  • libxslt1-dev
  • libz-dev
  • mercurial
  • netbase
  • pkg-config
  • sasl2-bin
  • swig
  • wget
  • zlib1g-dev

Paket-paket ini memungkinkan penginstalan library Python yang paling populer. Jika aplikasi memerlukan dependensi tingkat sistem operasi tambahan, Anda harus menggunakan runtime kustom berdasarkan runtime ini untuk menginstal paket yang sesuai.

Proses mulai aplikasi

Runtime memulai aplikasi Anda menggunakan entrypoint yang ditentukan dalam file app.yaml. Titik entri akan memulai proses yang merespons permintaan HTTP di port yang ditentukan oleh variabel lingkungan PORT.

Sebagian besar aplikasi web menggunakan server WSGI seperti Gunicorn, uWSGI, atau Waitress.

Sebelum dapat menggunakan salah satu server ini, Anda harus menambahkannya sebagai dependensi dalam requirements.txt aplikasi Anda. Jika Anda menggunakan gunicorn untuk aplikasi Flask, pastikan versi Python aplikasi Anda kompatibel dengan gunicorn.

Runtime memastikan bahwa semua dependensi diinstal sebelum titik entri Anda dipanggil.

Flask==2.0.2
gunicorn==20.1.0

Contoh titik entri yang menggunakan gunicorn untuk aplikasi Flask:

entrypoint: gunicorn -b :$PORT main:app

Contoh titik entri yang menggunakan gunicorn untuk aplikasi Django:

entrypoint: gunicorn -b :$PORT mydjangoapp:wsgi

Gunicorn adalah server WSGI yang direkomendasikan, tetapi Anda dapat menggunakan server WSGI lainnya. Misalnya, berikut adalah titik entri yang menggunakan uWSGI dengan Flask:

entrypoint: uwsgi --http :$PORT --wsgi-file main.py --callable app

Untuk aplikasi yang dapat menangani permintaan tanpa server WSGI, Anda cukup mengeksekusi skrip Python:

entrypoint: python main.py

Contoh titik entri dasar yang ditampilkan di atas dimaksudkan sebagai titik awal dan mungkin sesuai dengan aplikasi web Anda. Namun, sebagian besar aplikasi perlu mengonfigurasi lebih lanjut server WSGI. Alih-alih menetapkan semua setelan pada titik entri, buatlah file gunicorn.conf.py dalam direktori root project, tempat file app.yaml Anda berada, lalu tentukan di titik entri:

entrypoint: gunicorn -c gunicorn.conf.py -b :$PORT main:app

Anda dapat membaca semua nilai konfigurasi Gunicorn dalam dokumentasinya.

Worker

Gunicorn menggunakan worker untuk menangani permintaan. Secara default, Gunicorn menggunakan worker sinkronisasi. Class worker ini kompatibel dengan semua aplikasi web, tetapi setiap worker hanya dapat menangani satu permintaan dalam satu waktu. Secara default, gunicorn hanya menggunakan salah satu worker tersebut. Hal ini sering kali dapat menyebabkan instance Anda kurang dimanfaatkan dan meningkatkan latensi dalam aplikasi saat bebannya tinggi.

Sebaiknya tetapkan jumlah worker 2-4 kali jumlah core CPU untuk instance Anda ditambah satu. Anda dapat menentukan ini di gunicorn.conf.py sebagai:

import multiprocessing

workers = multiprocessing.cpu_count() * 2 + 1

Selain itu, beberapa aplikasi web yang sebagian besar terikat I/O dapat ditingkatkan performanya menggunakan class worker yang berbeda. Jika class worker Anda memerlukan dependensi tambahan seperti gevent atau tornado, dependensi tersebut harus dideklarasikan dalam requirements.txt aplikasi Anda.

HTTPS dan proxy penerusan

App Engine menghentikan koneksi HTTPS di load balancer dan meneruskan permintaan ke aplikasi Anda. Sebagian besar aplikasi tidak perlu mengetahui apakah permintaan dikirim melalui HTTPS atau tidak, tetapi aplikasi yang memerlukan informasi ini harus mengonfigurasi Gunicorn untuk memercayai proxy App Engine di gunicorn.conf.py:

forwarded_allow_ips = '*'
secure_scheme_headers = {'X-FORWARDED-PROTO': 'https'}

Gunicorn sekarang akan memastikan bahwa wsgi.url_scheme menjadi 'https', yang akan digunakan oleh sebagian besar framework web sebagai indikasi permintaan aman. Jika server atau framework WSGI Anda tidak mendukungnya, cukup periksa nilai header X-Forwarded-Proto secara manual.

Beberapa aplikasi juga perlu memastikan alamat IP pengguna. Ini tersedia di header X-Forwarded-For.

Perhatikan bahwa setelan secure_scheme_headers di gunicorn.conf.py harus berupa huruf besar, seperti X-FORWARDED-PROTO, tetapi header yang dapat dibaca kode akan menggunakan huruf besar dan kecil, seperti X-Forwarded-Proto.

Memperpanjang runtime

Runtime Python lingkungan fleksibel dapat digunakan untuk membuat runtime kustom. Lihat Menyesuaikan Python untuk informasi selengkapnya.

Variabel lingkungan

Variabel lingkungan berikut ditetapkan oleh lingkungan runtime:

Variabel Lingkungan Deskripsi
GAE_INSTANCE Nama instance saat ini.
GAE_MEMORY_MB Jumlah memori yang tersedia untuk proses aplikasi.
GAE_SERVICE Nama layanan yang ditentukan dalam file app.yaml aplikasi Anda, atau jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default.
GAE_VERSION Label versi aplikasi saat ini.
GOOGLE_CLOUD_PROJECT Project ID yang terkait dengan aplikasi Anda, yang terlihat di konsol Google Cloud
PORT Port yang akan menerima permintaan HTTP.

Anda dapat menetapkan variabel lingkungan tambahan di file app.yaml.

Server metadata

Setiap instance aplikasi Anda dapat menggunakan server metadata Compute Engine untuk mengkueri informasi tentang instance, termasuk nama host, alamat IP eksternal, ID instance, metadata kustom, dan informasi akun layanan. App Engine tidak mengizinkan Anda menetapkan metadata kustom untuk setiap instance, tetapi Anda dapat menetapkan metadata kustom tingkat project dan membacanya dari instance App Engine dan Compute Engine.

Fungsi contoh ini menggunakan server metadata untuk mendapatkan alamat IP eksternal instance:

METADATA_NETWORK_INTERFACE_URL = (
    "http://metadata/computeMetadata/v1/instance/network-interfaces/0/"
    "access-configs/0/external-ip"
)

def get_external_ip():
    """Gets the instance's external IP address from the Compute Engine metadata
    server.

    If the metadata server is unavailable, it assumes that the application is running locally.

    Returns:
        The instance's external IP address, or the string 'localhost' if the IP address
        is not available.
    """
    try:
        r = requests.get(
            METADATA_NETWORK_INTERFACE_URL,
            headers={"Metadata-Flavor": "Google"},
            timeout=2,
        )
        return r.text
    except requests.RequestException:
        logging.info("Metadata server could not be reached, assuming local.")
        return "localhost"