View a markdown version of this page

Runtime Python untuk Instans Terkelola Lambda - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Runtime Python untuk Instans Terkelola Lambda

Lambda runtime menggunakan beberapa proses Python untuk menangani permintaan bersamaan. Setiap permintaan bersamaan berjalan dalam proses terpisah dengan ruang memori dan inisialisasi sendiri. Setiap proses menangani satu permintaan pada satu waktu, secara sinkron. Proses tidak berbagi memori secara langsung, sehingga variabel global, cache tingkat modul, dan objek tunggal diisolasi di antara permintaan bersamaan.

Konfigurasi konkurensi

Jumlah maksimum permintaan bersamaan yang dikirim Lambda ke setiap lingkungan eksekusi dikendalikan oleh PerExecutionEnvironmentMaxConcurrency pengaturan dalam konfigurasi fungsi. Ini adalah pengaturan opsional, dan nilai default bervariasi tergantung pada runtime. Untuk runtime Python, defaultnya adalah 16 permintaan bersamaan per vCPU, atau Anda dapat mengonfigurasi nilai Anda sendiri. Nilai ini juga menentukan jumlah proses yang digunakan oleh runtime Python. Lambda secara otomatis menyesuaikan jumlah permintaan bersamaan hingga maksimum yang dikonfigurasi berdasarkan kapasitas setiap lingkungan eksekusi untuk menyerap permintaan tersebut.

penting

Menggunakan konkurensi berbasis proses berarti setiap proses runtime worker melakukan inisialisasi sendiri. Total penggunaan memori sama dengan memori per proses dikalikan dengan jumlah proses bersamaan. Jika Anda memuat perpustakaan besar atau kumpulan data dan memiliki konkurensi tinggi, Anda memiliki jejak memori yang besar. Sesuai dengan beban kerja Anda, Anda mungkin perlu menyesuaikan CPU-to-memory rasio atau menggunakan pengaturan konkurensi yang lebih rendah untuk menghindari melebihi memori yang tersedia. Anda dapat menggunakan MemoryUtilization metrik CloudWatch untuk melacak konsumsi memori.

Membangun fungsi untuk multi-konkurensi

Karena model multi-konkurensi berbasis proses, fungsi Instans Terkelola Lambda menggunakan runtime Python tidak mengakses sumber daya dalam memori secara bersamaan dari beberapa panggilan. Anda tidak perlu menerapkan praktik pengkodean untuk keamanan konkurensi dalam memori.

Direktori /tmp bersama

Direk /tmp tori dibagikan di semua permintaan bersamaan di lingkungan eksekusi. Penulisan bersamaan ke file yang sama dapat menyebabkan kerusakan data, misalnya jika proses lain mengganti file. Untuk mengatasi hal ini, terapkan penguncian file untuk file bersama atau gunakan nama file unik per proses atau per permintaan untuk menghindari konflik. Ingatlah untuk membersihkan file yang tidak dibutuhkan untuk menghindari kehabisan ruang yang tersedia.

Pencatatan

Interleaving log (entri log dari permintaan berbeda yang disisipkan dalam log) normal dalam sistem multi-concurrent.

Fungsi yang menggunakan Instans Terkelola Lambda selalu menggunakan format log JSON terstruktur yang diperkenalkan dengan kontrol logging lanjutan. Format ini mencakuprequestId, memungkinkan entri log untuk dikorelasikan dengan satu permintaan. Ketika Anda menggunakan logging modul dari pustaka standar Python di Lambda, secara otomatis requestId disertakan dalam setiap entri log. Untuk informasi lebih lanjut, lihat Menggunakan kontrol logging lanjutan Lambda dengan Python.

Permintaan konteks

Gunakan context.aws_request_id untuk mengakses ID permintaan untuk permintaan saat ini.

Dengan runtime Python, Anda dapat menggunakan variabel _X_AMZN_TRACE_ID lingkungan untuk mengakses ID X-Ray jejak dengan Lambda Managed Instances. ID X-Ray jejak disebarkan secara otomatis saat menggunakan AWS SDK.

Gunakan context.get_remaining_time_in_millis() untuk mendeteksi batas waktu. Untuk informasi selengkapnya, lihat Penanganan dan pemulihan kesalahan.

Contoh: Penanganan batas waktu

Periksa sisa waktu sebelum setiap unit kerja dan hentikan pemrosesan sebelum batas waktu dimulai. Konfigur BUFFER_MS asikan berdasarkan durasi yang diharapkan dari potongan pekerjaan Anda berikutnya.

BUFFER_MS = 2000 # Configure based on your next chunk of work def handler(event, context): for item in event["items"]: if context.get_remaining_time_in_millis() < BUFFER_MS: return {"statusCode": 206, "body": "Timeout approaching, stopping early"} process_item(item) return {"statusCode": 200, "body": "Done"}

Contoh: Menyebarkan tenggat waktu ke panggilan hilir

Saat melakukan panggilan ke layanan hilir, sebarkan waktu yang tersisa sebagai batas waktu untuk menghindari ketergantungan pada panggilan jaringan yang akan bertahan lebih lama dari panggilan Anda. SDK boto3 tidak mendukung batas waktu per permintaan pada klien yang ada, jadi Anda harus membuat klien dengan batas waktu yang diinginkan. Untuk fungsi throughput tinggi, evaluasi apakah batas waktu tetap yang dikonfigurasi pada inisialisasi lebih tepat daripada pembuatan klien per permintaan.

import boto3 from botocore.config import Config def handler(event, context): remaining = context.get_remaining_time_in_millis() / 1000 timeout = max(1, remaining - 0.5) s3 = boto3.client("s3", config=Config(read_timeout=timeout, connect_timeout=timeout)) response = s3.get_object(Bucket="my-bucket", Key="my-key") return {"statusCode": 200, "body": "Done"}

Inisialisasi dan shutdown

Inisialisasi fungsi terjadi sekali per proses. Anda mungkin melihat entri log berulang jika fungsi Anda memancarkan log selama inisialisasi.

Untuk fungsi Lambda dengan ekstensi, lingkungan eksekusi memancarkan sinyal SIGTERM selama shutdown. Sinyal ini digunakan oleh ekstensi untuk memicu tugas pembersihan, seperti buffer pembilasan. Anda dapat berlangganan peristiwa SIGTERM untuk memicu tugas pembersihan fungsi, seperti menutup koneksi database. Untuk mempelajari lebih lanjut tentang siklus hidup lingkungan eksekusi, lihatMemahami siklus hidup lingkungan pelaksanaan Lambda.

Versi ketergantungan

Instans Terkelola Lambda memerlukan versi paket minimum berikut:

  • Powertools untuk AWS Lambda (Python): versi 3.23.0 atau yang lebih baru

Powertools untuk AWS Lambda (Python)

Powertools for AWS Lambda (Python) kompatibel dengan Lambda Managed Instances dan menyediakan utilitas untuk logging, pelacakan, metrik, dan banyak lagi. Untuk informasi selengkapnya, lihat Powertools untuk AWS Lambda (Python).

Langkah selanjutnya