View a markdown version of this page

Tentukan pengendali fungsi Lambda di Python - AWS Lambda

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

Tentukan pengendali fungsi Lambda di Python

Handler fungsi Lambda Anda adalah metode dalam kode fungsi Anda yang memproses peristiwa. Saat fungsi Anda diaktifkan, Lambda menjalankan metode handler. Fungsi Anda berjalan sampai handler mengembalikan respons, keluar, atau batas waktu.

Halaman ini menjelaskan cara bekerja dengan penangan fungsi Lambda di Python, termasuk konvensi penamaan, tanda tangan handler yang valid, dan praktik terbaik kode. Halaman ini juga menyertakan contoh fungsi Python Lambda yang mengambil informasi tentang pesanan, menghasilkan tanda terima file teks, dan menempatkan file ini dalam bucket Amazon Simple Storage Service (Amazon S3).

Contoh kode fungsi Python Lambda

Contoh kode fungsi Python Lambda berikut mengambil informasi tentang pesanan, menghasilkan tanda terima file teks, dan menempatkan file ini dalam bucket Amazon S3:

contoh Fungsi Python Lambda
import json import os import logging import boto3 # Initialize the S3 client outside of the handler s3_client = boto3.client('s3') # Initialize the logger logger = logging.getLogger() logger.setLevel("INFO") def upload_receipt_to_s3(bucket_name, key, receipt_content): """Helper function to upload receipt to S3""" try: s3_client.put_object( Bucket=bucket_name, Key=key, Body=receipt_content ) except Exception as e: logger.error(f"Failed to upload receipt to S3: {str(e)}") raise def lambda_handler(event, context): """ Main Lambda handler function Parameters: event: Dict containing the Lambda function event data context: Lambda runtime context Returns: Dict containing status message """ try: # Parse the input event order_id = event['Order_id'] amount = event['Amount'] item = event['Item'] # Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET') if not bucket_name: raise ValueError("Missing required environment variable RECEIPT_BUCKET") # Create the receipt content and key destination receipt_content = ( f"OrderID: {order_id}\n" f"Amount: ${amount}\n" f"Item: {item}" ) key = f"receipts/{order_id}.txt" # Upload the receipt to S3 upload_receipt_to_s3(bucket_name, key, receipt_content) logger.info(f"Successfully processed order {order_id} and stored receipt in S3 bucket {bucket_name}") return { "statusCode": 200, "message": "Receipt processed successfully" } except Exception as e: logger.error(f"Error processing order: {str(e)}") raise

File ini berisi bagian-bagian kode berikut:

  • importblok: Gunakan blok ini untuk menyertakan pustaka yang dibutuhkan fungsi Lambda Anda.

  • Inisialisasi global klien dan logger SDK: Termasuk kode inisialisasi di luar handler memanfaatkan penggunaan kembali lingkungan eksekusi untuk meningkatkan kinerja fungsi Anda. Lihat Praktik terbaik kode untuk fungsi Python Lambda untuk mempelajari selengkapnya.

  • def upload_receipt_to_s3(bucket_name, key, receipt_content):Ini adalah fungsi pembantu yang dipanggil oleh lambda_handler fungsi utama.

  • def lambda_handler(event, context):Ini adalah fungsi handler utama untuk kode Anda, yang berisi logika aplikasi utama Anda. Ketika Lambda memanggil handler fungsi Anda, runtime Lambda mener uskan dua argumen ke fungsi, objek peristiwa yang berisi data untuk diproses fungsi Anda dan objek konteks yang berisi informasi tentang pemanggilan fungsi.

Konvensi penamaan handler

Nama pengendali fungsi yang ditentukan pada saat Anda membuat fungsi Lambda berasal dari:

  • Nama file tempat fungsi handler Lambda berada.

  • Nama fungsi handler Python.

Dalam contoh di atas, jika file diberi lambda_function.py nama, handler akan ditentukan sebagailambda_function.lambda_handler. Ini adalah nama penangan default yang diberikan untuk fungsi yang Anda buat menggunakan konsol Lambda.

Jika Anda membuat fungsi di konsol menggunakan nama file atau nama pengendali fungsi yang berbeda, Anda harus mengedit nama handler default.

Untuk mengubah nama pengendali fungsi (konsol)
  1. Buka halaman Fungsi di konsol Lambda dan pilih fungsi Anda.

  2. Pilih tab Kode.

  3. Gulir ke bawah ke panel pengaturan Runtime dan pilih Edit.

  4. Di Handler, masukkan nama baru untuk pengendali fungsi Anda.

  5. Pilih Simpan.

Menggunakan objek peristiwa Lambda

Ketika Lambda memanggil fungsi Anda, ia meneruskan argumen objek peristiwa ke pengendali fungsi. Objek JSON adalah format acara yang paling umum untuk fungsi Lambda. Dalam contoh kode di bagian sebelumnya, fungsi mengharapkan input dalam format berikut:

{ "Order_id": "12345", "Amount": 199.99, "Item": "Wireless Headphones" }

Jika fungsi Anda dipanggil oleh yang lain Layanan AWS, peristiwa input juga merupakan objek JSON. Format yang tepat dari objek acara tergantung pada layanan yang memanggil fungsi Anda. Untuk melihat format acara untuk layanan tertentu, lihat halaman yang sesuai di bagian Memanggil Lambda dengan acara dari yang lain AWS layanan ini.

Jika peristiwa input dalam bentuk objek JSON, runtime Lambda mengubah objek ke kamus Python. Untuk menetapkan nilai dalam input JSON ke variabel dalam kode Anda, gunakan metode kamus Python standar seperti yang diilustrasikan dalam contoh kode.

Anda juga dapat meneruskan data ke fungsi Anda sebagai array JSON, atau sebagai salah satu jenis data JSON valid lainnya. Tabel berikut mendefinisikan bagaimana runtime Python mengonversi tipe JSON ini.

Jenis data JSON Jenis data Python
object kamus (dict)
array daftar (list)
number integer (int) atau bilangan titik mengambang (float)
string string (str)
Boolean Boolean () bool
null NoneType (NoneType)

Mengakses dan menggunakan objek konteks Lambda

Objek konteks Lambda berisi informasi tentang pemanggilan fungsi dan lingkungan eksekusi. Lambda meneruskan objek konteks ke fungsi Anda secara otomatis saat dipanggil. Anda dapat menggunakan objek konteks untuk menampilkan informasi tentang pemanggilan fungsi Anda untuk tujuan pemantauan.

Objek konteks adalah kelas Python yang didefinisikan dalam klien antarmuka runtime Lambda. Untuk mengembalikan nilai salah satu properti objek konteks, gunakan metode yang sesuai pada objek konteks. Misalnya, cuplikan kode berikut menetapkan nilai aws_request_id properti (pengidentifikasi untuk permintaan pemanggilan) ke variabel bernama. request

request = context.aws_request_id

Untuk mempelajari lebih lanjut tentang menggunakan objek konteks Lambda, dan untuk melihat daftar lengkap metode dan properti yang tersedia, lihatMenggunakan objek konteks Lambda untuk mengambil informasi fungsi Python.

Tanda tangan handler yang valid untuk penangan Python

Saat mendefinisikan fungsi handler Anda di Python, fungsi harus mengambil dua argumen. Yang pertama dari argumen ini adalah objek peristiwa Lambda dan yang kedua adalah objek konteks Lambda. Secara konvensi, argumen input ini biasanya diberi nama event dancontext, tetapi Anda dapat memberinya nama apa pun yang Anda inginkan. Jika Anda mendeklarasikan fungsi handler Anda dengan argumen input tunggal, Lambda memunculkan kesalahan saat mencoba menjalankan fungsi Anda. Cara paling umum untuk mendeklarasikan fungsi handler di Python adalah sebagai berikut:

def lambda_handler(event, context):

Anda juga dapat menggunakan petunjuk tipe Python dalam deklarasi fungsi Anda, seperti yang ditunjukkan pada contoh berikut:

from typing import Dict, Any def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:

Untuk menggunakan penge AWS tikan khusus untuk peristiwa yang dihasilkan oleh lainnya Layanan AWS dan untuk objek konteks, tambahkan aws-lambda-typing paket ke paket penerapan fungsi Anda. Anda dapat menginstal pustaka ini di lingkungan pengembangan Anda dengan menjalankanpip install aws-lambda-typing. Cuplikan kode berikut menunjukkan cara menggunakan petunjuk AWS tipe spesifik. Dalam contoh ini, peristiwa yang diharapkan adalah peristiwa Amazon S3.

from aws_lambda_typing.events import S3Event from aws_lambda_typing.context import Context from typing import Dict, Any def lambda_handler(event: S3Event, context: Context) -> Dict[str, Any]:

Anda tidak dapat menggunakan tipe async fungsi Python untuk fungsi handler Anda.

Mengembalikan nilai

Secara opsional, handler dapat mengembalikan nilai, yang harus dapat diserialkan JSON. Jenis pengembalian umum termasukdict,list,str,int,float, danbool.

Apa yang terjadi pada nilai yang dikembalikan tergantung pada jenis pemang gilan dan layanan yang memanggil fungsi. Contoh:

  • Jika Anda menggunakan tipe pem RequestResponse anggilan untuk memanggil fungsi Lambda secara sinkron, Lambda mengembalikan hasil panggilan fungsi Python ke klien yang memanggil fungsi Lambda (dalam respons HTTP terhadap permintaan pemanggilan, diserialkan menjadi JSON). Misalnya, AWS Lambda konsol menggunakan jenis pem RequestResponse anggilan, jadi ketika Anda memanggil fungsi di konsol, konsol menampilkan nilai yang dikembalikan.

  • Jika penangan mengembalikan objek yang tidak dapat diserialkan json.dumps, waktu pengoperasian akan mengembalikan kesalahan.

  • Jika penangan mengembalikan None, sebagaimana fungsi Python tanpa pernyataan return yang dilakukan secara implisit, hasil waktu pengoperasian akan mengembalikan null.

  • Jika Anda menggunakan jenis pem Event anggilan (pemanggilan asinkron), nilainya dibuang.

Dalam kode contoh, handler mengembalikan kamus Python berikut:

{ "statusCode": 200, "message": "Receipt processed successfully" }

Lambda runtime serialisasi kamus ini dan mengembalikannya ke klien yang memanggil fungsi sebagai string JSON.

catatan

Di Python 3.9 dan rilis yang lebih baru, Lambda menyertakan requestID dari pemanggilan dalam respons kesalahan.

Menggunakan AWS SDK for Python (Boto3) di handler Anda

Seringkali, Anda akan menggunakan fungsi Lambda untuk berinteraksi dengan sumber daya Layanan AWS lainnya. Cara paling sederhana untuk berinteraksi dengan sumber daya ini adalah dengan menggunakan AWS SDK for Python (Boto3). Semua runtime Lambda Python yang didukung menyertakan versi SDK untuk Python.

Namun, kami sangat menyarankan Anda menyertakan SDK dalam paket penerapan fungsi Anda jika kode Anda perlu menggunakannya. Menyertakan SDK dalam paket penerapan Anda memberi Anda kontrol penuh atas dependensi Anda dan mengurangi risiko masalah ketidakselarasan versi dengan pustaka lain. Lihat Dependensi runtime di Python dan Kompatibilitas mundur pelajari lebih lanjut.

Untuk menggunakan SDK untuk Python dalam fungsi Lambda Anda, tambahkan pernyataan berikut ke blok impor di awal kode fungsi Anda:

import boto3

Gunakan pip install perintah untuk menambahkan pust boto3 aka ke paket penerapan fungsi Anda. Untuk petunjuk terperinci tentang cara menambahkan dependensi ke paket penerapan.zip, lihat. Membuat paket penyebaran.zip dengan dependensi Untuk mempelajari lebih lanjut tentang menambahkan dependensi ke fungsi Lambda yang digunakan sebagai gambar kontainer, lihat Membuat gambar dari gambar dasar atau. Membuat gambar dari gambar dasar alternatif

Saat menggunakan boto3 kode Anda, Anda tidak perlu memberikan kredenSIAL apa pun untuk menginisialisasi klien. Misalnya, dalam kode contoh, kita menggunakan baris kode berikut untuk menginisialisasi klien Amazon S3:

# Initialize the S3 client outside of the handler s3_client = boto3.client('s3')

Dengan Python, Lambda secara otomatis membuat variabel lingkungan dengan kredenSIAL. boto3SDK memeriksa variabel lingkungan fungsi Anda untuk kredenSIAL ini selama inisialisasi.

Mengakses variabel lingkungan

Dalam kode handler Anda, Anda dapat merefer ensikan variabel lingkungan dengan menggunakan os.environ.get metode. Dalam contoh kode, kami mereferensikan variabel RECEIPT_BUCKET lingkungan yang ditentukan menggunakan baris kode berikut:

# Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET')

Jangan lupa untuk menyertakan import os pernyataan di blok impor di awal kode Anda.

Praktik terbaik kode untuk fungsi Python Lambda

Patuhi pedoman dalam daftar berikut untuk menggunakan praktik pengkodean terbaik saat membangun fungsi Lambda Anda:

  • Pisahkan handler Lambda dari logika inti Anda. Ini membuatnya lebih mudah untuk membuat fungsi yang lebih dapat diuji unit. Misalnya, di Python, ini mungkin terlihat seperti:

    def lambda_handler(event, context): foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo, bar) def my_lambda_function(foo, bar): // MyLambdaFunction logic here
  • Kontrol dependensi dalam paket penerapan fungsi Anda. Lingkungan AWS Lambda eksekusi berisi sejumlah pustaka. Untuk runtime Node.js dan Python, ini termasuk AWS SDK.

    Untuk mengaktifkan serangkaian fitur terbaru dan pembaruan keamanan, Lambda memperbarui pustaka ini secara berkala. Pembaruan ini mungkin memperkenalkan perubahan halus pada perilaku fungsi Lambda Anda. Untuk memiliki kendali penuh atas dependensi yang digunakan fungsi Anda, kemas semua dependensi Anda dengan paket deployment Anda.

  • Minimalkan kompleksitas dependensi Anda. Utamakan memilih kerangka kerja lebih sederhana yang cepat dimuat dalam memulai lingkungan eksekusi.

  • Minimalkan ukuran paket penerapan Anda sesuai kebutuhan runtime. Ini mengurangi jumlah waktu yang diperlukan untuk paket penerapan Anda untuk diunduh dan dibongkar sebelum pemanggilan.

Manfaatkan penggunaan kembali lingkungan eksekusi untuk meningkatkan kinerja fungsi Anda. Inisialisasi klien SDK dan koneksi basis data di luar fungsi handler, dan lakukan caching aset statis secara lokal di direktori /tmp. Invokasi selanjutnya yang diproses oleh instans yang sama dari fungsi Anda dapat menggunakan kembali sumber daya ini. Ini menghemat biaya dengan mengurangi waktu pengoperasian fungsi.

Untuk menghindari potensi kebocoran data di seluruh invokasi, jangan menggunakan lingkungan eksekusi untuk menyimpan data pengguna, peristiwa, atau informasi lainnya implikasi keamanan. Jika fungsi Anda bergantung pada status yang dapat disenyapkan yang tidak dapat disimpan dalam memori di dalam handler, pertimbangkan untuk membuat fungsi terpisah atau versi terpisah dari fungsi untuk setiap pengguna.

Gunakan direktif keep-alive untuk mempertahankan koneksi yang persisten. Lambda membersihkan koneksi idle dari waktu ke waktu. Mencoba menggunakan ulang koneksi idle saat mengidentifikasi suatu fungsi akan menyebabkan kesalahan koneksi. Untuk mempertahankan koneksi yang persisten, gunakan arahan tetap aktif yang berkaitan dengan runtime Anda. Sebagai contoh, lihat Menggunakan Kem bali Koneksi dengan Keep-Alive in Node.js.

Gunakan variabel lingkungan untuk meneruskan parameter operasional ke fungsi Anda. Misalnya, jika Anda ingin menulis ke bucket Amazon S3 alih-alih melakukan hard-coding nama bucket yang Anda tulis, konfigurasikan nama bucket sebagai variabel lingkungan.

Hindari menggunakan pemanggilan rekursif dalam fungsi Lambda Anda, di mana fungsi memanggil dirinya sendiri atau memulai proses yang dapat memanggil fungsi lagi. Hal ini dapat menyebabkan volume invokasi fungsi yang tidak diinginkan dan peningkatan biaya. Jika Anda melihat volume pemanggilan yang tidak diinginkan, setel fungsi reservasi konkurensi ke 0 segera untuk membatasi semua pemanggilan ke fungsi, saat Anda memperbarui kode.

Jangan gunakan API non-publik yang tidak terdokumentasi dalam kode fungsi Lambda Anda. Untuk runtime AWS Lambda terkelola, Lambda secara berkala menerapkan pembaruan keamanan dan fungsional ke API internal Lambda. Pembaruan API internal ini mungkin tidak kompatibel ke belakang, yang menyebabkan konsekuensi yang tidak diinginkan seperti kegagalan pemanggilan jika fungsi Anda memiliki ketergantungan pada API non-publik ini. Lihat referensi API untuk daftar API yang tersedia untuk umum.

Tulis kode idempotent. Menulis kode idempotent untuk fungsi Anda memastikan bahwa peristiwa duplikat ditangani dengan cara yang sama. Kode Anda harus memvalidasi peristiwa dengan benar dan menangani peristiwa duplikat dengan anggun. Untuk informasi lebih lanjut, lihat Bagaimana cara membuat fungsi Lambda saya idempoten? .