Tentukan penangan fungsi Lambda dengan Python - AWS Lambda

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

Tentukan penangan fungsi Lambda dengan 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 waktu habis.

Halaman ini menjelaskan cara bekerja dengan penangan fungsi Lambda dengan 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 di 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 di bucket Amazon S3:

contoh Fungsi Lambda Python
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 kode berikut:

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

  • Inisialisasi global klien SDK dan logger: Menyertakan kode inisialisasi di luar handler memanfaatkan penggunaan kembali lingkungan eksekusi untuk meningkatkan kinerja fungsi Anda. Lihat Praktik terbaik kode untuk fungsi Lambda Python 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 penangan fungsi Anda, runtime Lambda meneruskan dua argumen ke fungsi, objek peristiwa yang berisi data untuk fungsi Anda untuk diproses dan objek konteks yang berisi informasi tentang pemanggilan fungsi.

Konvensi penamaan handler

Nama fungsi handler 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 bernamalambda_function.py, handler akan ditentukan sebagailambda_function.lambda_handler. Ini adalah nama handler 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 fungsi handler (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 handler fungsi Anda.

  5. Pilih Simpan.

Menggunakan objek acara Lambda

Ketika Lambda memanggil fungsi Anda, ia meneruskan argumen objek peristiwa ke penangan 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 peristiwa tergantung pada layanan yang menjalankan fungsi Anda. Untuk melihat format acara untuk layanan tertentu, lihat halaman yang sesuai di bagian Memanggil Lambda dengan acara dari layanan lain AWS 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 kode contoh.

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

Jenis data JSON Tipe data Python
object kamus (dict)
array daftar (list)
number bilangan bulat (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 fungsi pemanggilan 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 dari salah satu properti objek konteks, gunakan metode yang sesuai pada objek konteks. Misalnya, cuplikan kode berikut menetapkan nilai aws_request_id properti (pengenal 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, lihat. Menggunakan objek konteks Lambda untuk mengambil informasi fungsi Python

Tanda tangan handler yang valid untuk penangan Python

Saat mendefinisikan fungsi handler Anda dengan Python, fungsi tersebut harus mengambil dua argumen. Argumen pertama adalah objek peristiwa Lambda dan yang kedua adalah objek konteks Lambda. Menurut konvensi, argumen masukan ini biasanya diberi nama event dancontext, tetapi Anda dapat memberi mereka nama apa pun yang Anda inginkan. Jika Anda mendeklarasikan fungsi handler Anda dengan satu argumen input, Lambda akan memunculkan kesalahan saat mencoba menjalankan fungsi Anda. Cara paling umum untuk mendeklarasikan fungsi handler dengan 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 AWS pengetikan khusus untuk peristiwa yang dihasilkan oleh other 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 tipe AWS-specific. Dalam contoh ini, acara yang diharapkan adalah acara 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 JSON serializable. Jenis pengembalian umum termasukdict,list,str,int,float, danbool.

Apa yang terjadi pada nilai yang dikembalikan tergantung pada jenis pemanggilan dan layanan yang memanggil fungsi. Sebagai contoh:

  • Jika Anda menggunakan tipe RequestResponse pemanggilan untuk menjalankan fungsi Lambda secara sinkron, Lambda mengembalikan hasil panggilan fungsi Python ke klien yang menjalankan fungsi Lambda (dalam respons HTTP terhadap permintaan pemanggilan, diserialisasikan ke JSON). Misalnya, konsol AWS Lambda menggunakan tipe invokasi RequestResponse, jadi ketika Anda melakukan invokasi fungsi menggunakan konsol, konsol akan 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 tipe Event pemanggilan (pemanggilan asinkron), nilainya akan dibuang.

Dalam kode contoh, handler mengembalikan kamus Python berikut:

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

Runtime Lambda membuat serial kamus ini dan mengembalikannya ke klien yang memanggil fungsi sebagai string JSON.

catatan

Dalam 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 orang lain Layanan AWS dan sumber daya. Cara termudah untuk berinteraksi dengan sumber daya ini adalah dengan menggunakan file AWS SDK for Python (Boto3). Semua runtime Lambda Python yang didukung menyertakan versi SDK untuk Python. Namun, kami sangat menyarankan agar Anda menyertakan SDK dalam paket penerapan fungsi Anda jika kode Anda perlu menggunakannya. Menyertakan SDK dalam paket penerapan memberi Anda kontrol penuh atas dependensi dan mengurangi risiko masalah ketidaksejajaran versi dengan pustaka lain. Lihat Dependensi runtime dengan Python dan Kompatibilitas mundur untuk mempelajari 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 boto3 pustaka ke paket penyebaran fungsi Anda. Untuk petunjuk terperinci tentang cara menambahkan dependensi ke paket penerapan.zip, lihat. Membuat paket penerapan.zip dengan dependensi Untuk mempelajari selengkapnya tentang menambahkan dependensi ke fungsi Lambda yang digunakan sebagai gambar kontainer, lihat atau. Membuat gambar dari gambar dasar Membuat gambar dari gambar dasar alternatif

Saat menggunakan boto3 kode Anda, Anda tidak perlu memberikan kredensil apa pun untuk menginisialisasi klien. Misalnya, dalam kode contoh, kami 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 kredensi. boto3SDK memeriksa variabel lingkungan fungsi Anda untuk kredensil ini selama inisialisasi.

Mengakses variabel lingkungan

Dalam kode handler Anda, Anda dapat mereferensikan variabel lingkungan dengan menggunakan os.environ.get metode ini. Dalam kode contoh, 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 Lambda Python

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

  • Pisahkan handler Lambda dari logika inti Anda. Ini memungkinkan Anda untuk membuat fungsi yang lebih dapat teruji. 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 file. AWS SDKs Untuk mengaktifkan serangkaian fitur dan pembaruan keamanan terbaru, Lambda akan memperbarui pustaka ini secara berkala. Pembaruan ini dapat memberikan perubahan kecil 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-nya. Ini akan mengurangi jumlah waktu yang dibutuhkan untuk mengunduh dan membongkar paket deployment Anda sebelum invokasi.

  • 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 arahan 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 Kembali Koneksi dengan Keep-Alive di 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 konkurensi fungsi cadangan untuk 0 segera membatasi semua pemanggilan ke fungsi, saat Anda memperbarui kode.

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

  • Tulis kode idempoten. Menulis kode idempoten 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 selengkapnya, lihat Bagaimana cara membuat fungsi Lambda saya idempoten? .