Menentukan dependensi di Python (generasi ke-1)

Ada dua cara untuk menentukan dependensi untuk fungsi Cloud Run yang ditulis dalam Python: menggunakan paket pengelola paket pip requirements.txt atau mengemas dependensi lokal bersama fungsi Anda.

Spesifikasi dependensi yang menggunakan standar Pipfile/Pipfile.lock tidak didukung. Project Anda tidak boleh menyertakan file ini.

Menentukan dependensi dengan pip

Dependensi pada Python dikelola dengan pip dan dinyatakan dalam file metadata yang disebut requirements.txt. File ini harus berada di direktori yang sama dengan file main.py yang berisi kode fungsi Anda.

Saat Anda men-deploy atau men-deploy ulang fungsi, fungsi Cloud Run menggunakan pip untuk mendownload dan menginstal versi terbaru dari dependensi seperti yang dideklarasikan dalam file requirements.txt. File requirements.txt berisi satu baris per paket. Setiap baris berisi nama paket, dan secara opsional, versi yang diminta. Untuk detail selengkapnya, lihat requirements.txt referensi.

Agar build Anda tidak terpengaruh oleh perubahan versi dependensi, pertimbangkan untuk memasang pin pada paket dependensi ke versi tertentu.

Berikut adalah contoh file requirements.txt:

functions-framework
requests==2.20.0
numpy

Functions Framework adalah dependensi wajib untuk semua fungsi. Meskipun fungsi Cloud Run menginstalnya atas nama Anda saat fungsi dibuat, sebaiknya Anda menyertakannya sebagai dependensi eksplisit agar lebih jelas.

Jika fungsi Anda bergantung pada dependensi pribadi, sebaiknya mencerminkan functions-framework ke registry pribadi Anda. Sertakan functions-framework yang diduplikasi sebagai dependensi ke fungsi Anda untuk menghindari penginstalan paket dari internet publik.

Memaketkan dependensi lokal

Anda juga dapat mengemas dan men-deploy dependensi bersama fungsi Anda. Ini ini berguna jika dependensi Anda tidak tersedia melalui pip pengelola paket atau jika akses internet lingkungan Cloud Run Anda aksesnya dibatasi.

Misalnya, Anda dapat menggunakan struktur direktori seperti berikut:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Kemudian, Anda dapat mengimpor kode seperti biasa dari localpackage menggunakan pernyataan import berikut.

# Code in main.py
from localpackage import script

Perhatikan bahwa pendekatan ini tidak akan menjalankan file setup.py apa pun. Paket dengan itu file masih dapat dipaketkan, tetapi mungkin tidak berjalan dengan benar pada fungsi Cloud Run.

Dependensi vendor

Dependensi vendor adalah dependensi yang sumbernya disertakan langsung dalam paket kode sumber Anda dan dibuat ulang bersama kode Anda sendiri. Gunakan variabel lingkungan build GOOGLE_VENDOR_PIP_DEPENDENCIES untuk membuat dependensi pip vendor dan menghindari menginstalnya selama deployment.

Membuat dependensi vendor

  1. Pastikan python3 diinstal di sistem pengembangan Anda.

  2. Mendeklarasikan dependensi aplikasi Anda dalam file requirements.txt di direktori utama pohon pengembangan Anda.

  3. Deklarasikan Framework Functions sebagai persyaratan dengan menyertakan functions-framework pada baris terpisah dalam file requirements.txt Anda.

  4. Download dependensi fungsi ke direktori lokal Anda. Langkah-langkah untuk melakukannya tergantung pada apakah dependensinya adalah file {i>wheel<i} Python (*.whl) atau file tar (*.tar.gz).

    1. Jika dependensinya adalah wheel Python (*.whl), download dependensinya ke root direktori pengembangan situs Anda dengan perintah pip ini:

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_VERSION \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      Ganti:

      • DIRECTORY: nama direktori lokal tempat unduh ke
      • PYTHON_RUNTIME_VERSION: versi Python yang akan digunakan pemeriksaan kompatibilitas. Misalnya 311 untuk Python 3.11.
        Versi ini harus cocok dengan salah satu runtime Python yang didukung

      Struktur direktori yang dihasilkan akan terlihat seperti ini:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. Jika dependensinya adalah file tar (*.tar.gz):

      1. Jika dependensi ditulis dalam Python, gunakan pip untuk mendownloadnya:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. Jika dependensi terdiri dari kode yang ditulis dalam C atau C++, Anda harus mendownload dan mengompilasinya secara terpisah.

  5. Deploy fungsi Anda dan dependensi vendornya:

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    Ganti:

    • FUNCTION_NAME: nama fungsi Cloud Run fungsi yang Anda deploy
    • PYTHON_RUNTIME_NAME: nama salah satu runtime Python yang didukung untuk menjalankan fungsi yang di-deploy di bawah - misalnya python311. Versi ini harus sama dengan versi runtime Python seperti yang Anda gunakan lingkungan pengembangan lokal Anda.
    • DIRECTORY:nama direktori yang berisi dependensi vendor

Untuk detail selengkapnya tentang penggunaan buildpack, lihat Bangun fungsi dengan buildpack.

Menggunakan dependensi pribadi

Dependensi pribadi dari Artifact Registry

Repositori Python Artifact Registry dapat menghosting dependensi pribadi untuk fungsi Python Anda. Saat men-deploy ke fungsi Cloud Run, proses build akan otomatis menghasilkan kredensial Artifact Registry untuk Akun layanan Cloud Build. Anda hanya perlu menyertakan URL Artifact Registry di requirements.txt tanpa membuat kredensial tambahan. Contoh:

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

Jika build Anda membutuhkan beberapa repositori, gunakan Repositori virtual Artifact Registry untuk mengontrol dengan aman urutan pip yang menelusuri repositori Anda.

Dependensi pribadi dari repositori lain

Dependensi diinstal di lingkungan Cloud Build yang tidak memberikan akses ke kunci SSH. Paket yang dihosting di repositori yang memerlukan autentikasi berbasis SSH harus di-vendor dan diupload bersama kode project Anda, seperti yang dijelaskan di bagian sebelumnya.

Anda dapat menggunakan perintah pip install dengan flag -t DIRECTORY untuk menyalin dependensi pribadi ke direktori lokal sebelum men-deploy aplikasi, seperti berikut:

  1. Salin dependensi Anda ke direktori lokal:

    pip install -t DIRECTORY DEPENDENCY
  2. Tambahkan file __init__.py kosong ke direktori DIRECTORY untuk mengubahnya menjadi modul.

  3. Impor dari modul ini untuk menggunakan dependensi Anda:

    import DIRECTORY.DEPENDENCY

Paket yang telah terpasang sebelumnya

Paket Python berikut akan otomatis diinstal bersama fungsi Anda selama deployment. Jika Anda menggunakan salah satu paket ini dalam kode fungsi, sebaiknya sertakan versi berikut dalam file requirements.txt:

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

Python 3.8 dan yang lebih baru

click==8.1.7
cloudevents==1.11.0
deprecation==2.1.0
Flask==2.2.5
functions-framework==3.8.1
gunicorn==23.0.0
importlib-metadata==6.7.0
itsdangerous==2.1.2
jinja2==3.1.4
MarkupSafe==2.1.5
packaging==24.0
typing_extensions==4.7.1
watchdog==3.0.0
Werkzeug==2.2.3
zipp==3.15.0

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

Selain itu, runtime Python menyertakan sejumlah paket sistem di lingkungan eksekusi. Jika fungsi Anda menggunakan dependensi yang memerlukan paket sistem yang tidak tercantum, Anda dapat meminta paket.