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.

Anda dapat menggunakan sintaksis umum berikut ketika membuat handler fungsi di Python:

def handler_name(event, context): ... return some_value

Penamaan

Nama handler fungsi Lambda yang ditentukan pada saat Anda membuat fungsi Lambda berasal dari berikut ini:

  • Nama file tempat fungsi handler Lambda berada.

  • Nama fungsi handler Python.

Handler fungsi dapat berupa nama apa saja; Namun, nama default di konsol Lambda adalah lambda_function.lambda_handler. Nama handler fungsi ini mencerminkan nama fungsi (lambda_handler) dan file tempat kode handler disimpan (lambda_function.py).

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.

Cara kerjanya

Ketika Lambda memanggil handler fungsi Anda, Runtime Lambda meneruskan dua argumen ke handler fungsi:

  • Argumen pertama adalah objek peristiwa. Peristiwa adalah dokumen JSON berformat yang berisi data untuk fungsi Lambda untuk diproses. Runtime Lambda mengonversi peristiwa menjadi objek dan menyampaikannya ke kode fungsi Anda. Ini biasanya dari jenis dict Python. Ini juga dapat bertipe list, str, int, float, atau NoneType.

    Objek peristiwa berisi informasi dari layanan invokasi. Saat Anda mengaktifkan fungsi, Anda menentukan struktur dan konten peristiwa. Ketika AWS layanan memanggil fungsi Anda, layanan mendefinisikan struktur acara. Untuk informasi selengkapnya tentang acara dari AWS layanan, lihatMemanggil Lambda dengan acara dari layanan lain AWS.

  • Argumen kedua adalah objek konteks. Objek konteks diteruskan ke fungsi Anda dengan Lambda saat runtime. Objek ini menyediakan metode dan properti yang memberikan informasi tentang lingkungan invokasi, fungsi, dan lingkungan runtime.

Mengembalikan nilai

Handler dapat mengembalikan nilai secara opsional. Apa yang terjadi pada nilai yang dikembalikan tergantung pada jenis pemanggilan dan layanan yang memanggil fungsi. Sebagai contoh:

  • Jika Anda menggunakan jenis RequestResponse pemanggilan, sepertiMemanggil fungsi Lambda secara sinkron, AWS Lambda mengembalikan hasil panggilan fungsi Python ke klien yang menjalankan fungsi Lambda (sebagai HTTP respons terhadap permintaan pemanggilan, diserialisasikan ke dalam). 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.

catatan

Dalam Python 3.9 dan rilis yang lebih baru, Lambda menyertakan pemanggilan dalam requestId respons kesalahan.

Contoh

Bagian berikut menunjukkan contoh fungsi Python yang dapat Anda gunakan dengan Lambda. Jika Anda menggunakan konsol Lambda untuk membuat fungsi, Anda tidak perlu melampirkan file arsip .zip untuk menjalankan fungsi di bagian ini. Fungsi ini menggunakan pustaka Python standar yang disertakan dengan runtime Lambda yang Anda pilih. Untuk informasi selengkapnya, lihat Paket deployment.

Mengembalikan pesan

Contoh berikut menunjukkan fungsi yang disebutlambda_handler. Fungsi ini menerima input pengguna dari nama depan dan belakang, serta mengembalikan pesan yang berisi data dari peristiwa yang diterima sebagai input.

def lambda_handler(event, context): message = 'Hello {} {}!'.format(event['first_name'], event['last_name']) return { 'message' : message }

Anda dapat menggunakan data peristiwa berikut untuk memanggil fungsi:

{ "first_name": "John", "last_name": "Smith" }

Respons menunjukkan data peristiwa yang diteruskan sebagai input:

{ "message": "Hello John Smith!" }

Menguraikan respons

Contoh berikut menunjukkan fungsi yang disebutlambda_handler. Fungsi ini menggunakan data peristiwa yang diteruskan oleh Lambda pada saat runtime. Ini mem-parsing variabel lingkungan yang AWS_REGION dikembalikan dalam JSON respons.

import os import json def lambda_handler(event, context): json_region = os.environ['AWS_REGION'] return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": json.dumps({ "Region ": json_region }) }

Anda dapat menggunakan data peristiwa berikut untuk memanggil fungsi:

{ "key1": "value1", "key2": "value2", "key3": "value3" }

Runtime Lambda menetapkan beberapa variabel lingkungan selama permulaan. Untuk informasi selengkapnya tentang variabel lingkungan yang dikembalikan dalam respons saat runtime, lihat Gunakan variabel lingkungan Lambda untuk mengonfigurasi nilai dalam kode.

Fungsi dalam contoh ini tergantung pada respon yang berhasil (in200) dari InvokeAPI. Untuk informasi selengkapnya tentang API status Panggilan, lihat Sintaks Respons Panggilan.

Mengembalikan perhitungan

Contoh berikut menunjukkan fungsi yang disebutlambda_handler. Fungsi ini menerima input pengguna dan mengembalikan perhitungan kepada pengguna. Untuk informasi selengkapnya tentang contoh ini, lihat aws-doc-sdk-examples GitHub repositori.

import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ... result = None action = event.get('action') if action == 'increment': result = event.get('number', 0) + 1 logger.info('Calculated result of %s', result) else: logger.error("%s is not a valid action.", action) response = {'result': result} return response

Anda dapat menggunakan data peristiwa berikut untuk memanggil fungsi:

{ "action": "increment", "number": 3 }

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 SDK klien dan koneksi database di luar fungsi handler, dan cache 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 kode rekursif dalam fungsi Lambda Anda, di mana fungsi secara otomatis memanggil diri sendiri sampai beberapa kriteria arbitrer terpenuhi. Hal ini dapat menyebabkan volume invokasi fungsi yang tidak diinginkan dan peningkatan biaya. Jika Anda melakukannya secara tidak sengaja, segera atur fungsi konkurensi terpesan ke 0 untuk melakukan throttle semua invokasi fungsi, sembari 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 APIPembaruan 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 APIreferensi 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? .