Jalankan pembacaan paralel objek S3 dengan menggunakan Python dalam suatu fungsi AWS Lambda - AWS Prescriptive Guidance

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

Jalankan pembacaan paralel objek S3 dengan menggunakan Python dalam suatu fungsi AWS Lambda

Eduardo Bortoluzzi, Amazon Web Services

Ringkasan

Anda dapat menggunakan pola ini untuk mengambil dan meringkas daftar dokumen dari Amazon Simple Storage Service (Amazon S3) bucket secara real time. Pola ini memberikan contoh kode ke objek baca paralel dari bucket S3 di Amazon Web Services ()AWS. Pola ini menampilkan cara menjalankan tugas I/O terikat secara efisien dengan AWS Lambda fungsi menggunakan Python.

Sebuah perusahaan keuangan menggunakan pola ini dalam solusi interaktif untuk secara manual menyetujui atau menolak transaksi keuangan yang berkorelasi secara real time. Dokumen transaksi keuangan disimpan dalam ember S3 yang terkait dengan pasar. Operator memilih daftar dokumen dari bucket S3, menganalisis nilai total transaksi yang dihitung oleh solusi, dan memutuskan untuk menyetujui atau menolak batch yang dipilih.

Tugas terikat I/O mendukung banyak utas. Dalam contoh kode ini, concurrent.futures. ThreadPoolExecutordigunakan dengan maksimal 30 utas simultan, meskipun fungsi Lambda mendukung hingga 1.024 utas (dengan salah satu utas tersebut menjadi proses utama Anda). Batas ini karena terlalu banyak utas menciptakan masalah latensi karena peralihan konteks dan pemanfaatan sumber daya komputasi. Anda juga perlu meningkatkan koneksi pool maksimum botocore sehingga semua thread dapat melakukan download objek S3 secara bersamaan.

Kode contoh menggunakan satu objek 8,3 KB, dengan data JSON, dalam ember S3. Objek dibaca beberapa kali. Setelah fungsi Lambda membaca objek, data JSON diterjemahkan ke objek Python. Pada bulan Desember 2024, hasil setelah menjalankan contoh ini adalah 1.000 pembacaan diproses dalam 2,3 detik dan 10.000 pembacaan diproses dalam 27 detik menggunakan fungsi Lambda yang dikonfigurasi dengan memori 2.304 MB. AWS Lambda mendukung konfigurasi memori dari 128 MB menjadi 10.240 MB (10 GB), meskipun meningkatkan Lambdamemory melebihi 2.304 MB tidak membantu mengurangi waktu untuk menjalankan tugas terikat I/O khusus ini.

Alat AWS Lambda Power Tuning digunakan untuk menguji konfigurasi memori Lambda yang berbeda dan memverifikasi rasio performance-to-cost terbaik untuk tugas tersebut. Untuk hasil tes, lihat bagian Informasi tambahan.

Prasyarat dan batasan

Prasyarat

  • Aktif Akun AWS

  • Kemahiran dengan pengembangan Python

Batasan

Versi produk

  • Python 3.9 atau yang lebih baru

  • AWS Cloud Development Kit (AWS CDK) v2

  • AWS Command Line Interface (AWS CLI) versi 2

  • AWS Lambda Power Tuning 4.3.6 (opsional)

Arsitektur

Tumpukan teknologi target

  • AWS Lambda

  • Amazon S3

  • AWS Step Functions (jika AWS Lambda Power Tuning digunakan)

Arsitektur target

Diagram berikut menunjukkan fungsi Lambda yang membaca objek dari bucket S3 secara paralel. Diagram juga memiliki alur kerja Step Functions untuk alat AWS Lambda Power Tuning untuk menyempurnakan memori fungsi Lambda. Penyetelan halus ini membantu mencapai keseimbangan yang baik antara biaya dan kinerja.

Diagram yang menampilkan fungsi Lambda, bucket S3, dan AWS Step Functions.

Otomatisasi dan skala

Fungsi Lambda berskala cepat saat diperlukan. Untuk menghindari kesalahan 503 Slow Down dari Amazon S3 selama permintaan tinggi, kami sarankan untuk membatasi penskalaan.

Alat

Layanan AWS

  • AWS Cloud Development Kit (AWS CDK) v2 adalah kerangka pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan AWS Cloud infrastruktur dalam kode. Infrastruktur contoh dibuat untuk digunakan. AWS CDK

  • AWS Command Line InterfaceAWS CLIadalah alat open source yang membantu Anda berinteraksi Layanan AWS melalui perintah di shell baris perintah Anda. Dalam pola ini, AWS CLI versi 2 digunakan untuk mengunggah contoh file JSON.

  • AWS Lambdaadalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.

  • Amazon Simple Storage Service Amazon S3 adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.

  • AWS Step Functionsadalah layanan orkestrasi tanpa server yang membantu Anda menggabungkan fungsi AWS Lambda dan layanan AWS lainnya untuk membangun aplikasi yang penting bagi bisnis.

Alat-alat lainnya

Repositori kode

Kode untuk pola ini tersedia di aws-lambda-parallel-download GitHub repositori.

Praktik terbaik

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Periksa versi yang diinstal Python.

Kode ini telah diuji secara khusus pada Python 3.9 dan Python 3.13, dan harus bekerja pada semua versi di antara rilis ini. Untuk memeriksa versi Python Anda, jalankan python3 -V di terminal Anda, dan instal versi yang lebih baru jika diperlukan.

Untuk memverifikasi bahwa modul yang diperlukan diinstal, jalankanpython3 -c "import pip, venv". Tidak ada pesan kesalahan berarti modul diinstal dengan benar dan Anda siap untuk menjalankan contoh ini.

Arsitek awan

Instal AWS CDK.

Untuk menginstal AWS CDK jika belum diinstal, ikuti petunjuk di Memulai dengan AWS CDK. Untuk mengonfirmasi bahwa AWS CDK versi yang diinstal adalah 2.0 atau yang lebih baru, jalankancdk –version.

Arsitek awan

Bootstrap lingkungan Anda.

Untuk bootstrap lingkungan Anda, jika belum dilakukan, ikuti instruksi di Bootstrap lingkungan Anda untuk digunakan dengan AWS CDK.

Arsitek awan
TugasDeskripsiKeterampilan yang dibutuhkan

Kloning repositori.

Untuk mengkloning versi terbaru dari repositori, jalankan perintah berikut:

git clone --depth 1 --branch v1.2.0 \ git@github.com:aws-samples/aws-lambda-parallel-download.git
Arsitek awan

Ubah direktori kerja ke repositori kloning.

Jalankan perintah berikut:

cd aws-lambda-parallel-download
Arsitek awan

Buat lingkungan virtual Python.

Untuk membuat lingkungan virtual Python, jalankan perintah berikut:

python3 -m venv .venv
Arsitek awan

Aktifkan lingkungan virtual.

Untuk mengaktifkan lingkungan virtual, jalankan perintah berikut:

source .venv/bin/activate
Arsitek awan

Instal dependensi.

Untuk menginstal dependensi Python, jalankan perintah: pip

pip install -r requirements.txt
Arsitek awan

Jelajahi kodenya.

(Opsional) Contoh kode yang mengunduh objek dari bucket S3 ada diresources/parallel.py.

Kode infrastruktur ada di parallel_download folder.

Arsitek awan
TugasDeskripsiKeterampilan yang dibutuhkan

Terapkan aplikasi.

Jalankan cdk deploy.

Tuliskan AWS CDK outputnya:

  • ParallelDownloadStack.LambdaFunctionARN

  • ParallelDownloadStack.SampleS3BucketName

  • ParallelDownloadStack.StateMachineARN

Arsitek awan

Unggah contoh file JSON.

Repositori berisi contoh file JSON sekitar 9 KB. Untuk mengunggah file ke bucket S3 dari tumpukan yang dibuat, jalankan perintah berikut:

aws s3 cp sample.json s3://<ParallelDownloadStack.SampleS3BucketName>

Ganti <ParallelDownloadStack.SampleS3BucketName> dengan nilai yang sesuai dari AWS CDK output.

Arsitek awan

Jalankan aplikasi.

Untuk menjalankan aplikasi, lakukan hal berikut:

  1. Masuk ke AWS Management Console, navigasikan ke konsol Lambda, dan temukan fungsi Lambda yang memiliki ARN dari output. AWS CDK ParallelDownloadStack.LambdaFunctionARN

  2. Pada tab Uji, ubah Event JSON menjadi yang berikut:

    {"objectKey": "sample.json"}
  3. Pilih Uji.

  4. Untuk melihat hasilnya, pilih detail. Detailnya akan menunjukkan statistik unduhan paralel, informasi run, dan log.

Arsitek awan

Tambahkan jumlah unduhan.

(Opsional) Untuk menjalankan 1.500 get panggilan objek, gunakan JSON berikut di Event JSON parameter: Test

{"repeat": 1500, "objectKey": "sample.json"}
Arsitek awan
TugasDeskripsiKeterampilan yang dibutuhkan

Jalankan alat AWS Lambda Power Tuning.

  1. Masuk ke konsol, dan navigasikan ke Step Functions.

  2. Temukan mesin negara dengan ARN dari output. AWS CDK ParallelDownloadStack.StateMachineARN

  3. Pilih Mulai eksekusi, dan tempel JSON berikut:

    { "lambdaARN": "<ParallelDownloadStack.LambdaFunctionARN>", "num": 10, "strategy": "balanced", "payload": {"repeat": 2000, "objectKey": "sample.json"} }

    Ingatlah untuk mengganti <ParallelDownloadStack.LambdaFunctionARN> dengan nilai dari AWS CDK output.

Di akhir proses, hasilnya akan berada di tab input dan output Eksekusi.

Arsitek awan

Lihat hasil AWS Lambda Power Tuning dalam grafik.

Pada tab Input dan output eksekusi, salin tautan visualization properti, dan tempel di tab browser baru.

Arsitek awan
TugasDeskripsiKeterampilan yang dibutuhkan

Hapus objek dari ember S3.

Sebelum Anda menghancurkan sumber daya yang digunakan, Anda menghapus semua objek dari bucket S3:

aws s3 rm s3://<ParallelDownloadStack.SampleS3BucketName> \ --recursive

Ingatlah untuk mengganti <ParallelDownloadStack.SampleS3BucketName> dengan nilai dari AWS CDK output.

Arsitek awan

Hancurkan sumber daya.

Untuk menghancurkan semua sumber daya yang dibuat untuk pilot ini, jalankan perintah berikut:

cdk destroy
Arsitek awan

Pemecahan Masalah

IsuSolusi

'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008

Untuk akun baru, Anda mungkin tidak dapat mengonfigurasi lebih dari 3.008 MB di fungsi Lambda Anda. Untuk menguji menggunakan AWS Lambda Power Tuning, tambahkan properti berikut pada input JSON saat Anda memulai eksekusi Step Functions:

"powerValues": [ 512, 1024, 1536, 2048, 2560, 3008 ]

Sumber daya terkait

Informasi tambahan

Kode

Cuplikan kode berikut melakukan pemrosesan I/O paralel:

with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: for result in executor.map(a_function, (the_arguments)): ...

ThreadPoolExecutorMenggunakan kembali utas saat tersedia.

Pengujian dan hasil

Tes ini dilakukan pada Desember 2024.

Tes pertama memproses 2.500 pembacaan objek, dengan hasil sebagai berikut.

Waktu doa turun dan biaya doa meningkat seiring dengan meningkatnya memori.

Mulai dari 3.009 MB, tingkat waktu pemrosesan tetap hampir sama untuk setiap peningkatan memori, tetapi biaya meningkat seiring dengan meningkatnya ukuran memori.

Tes lain menyelidiki kisaran antara 1.536 MB dan 3.072 MB memori, menggunakan nilai yang kelipatan 256 MB dan memproses 10.000 pembacaan objek, dengan hasil sebagai berikut.

Penurunan perbedaan antara penurunan waktu doa dan kenaikan biaya doa.

performance-to-costRasio terbaik adalah dengan konfigurasi Lambda memori 2.304 MB.

Sebagai perbandingan, proses sekuensial 2.500 pembacaan objek membutuhkan waktu 47 detik. Proses paralel menggunakan konfigurasi Lambda 2.304 MB membutuhkan waktu 7 detik, yaitu 85 persen lebih sedikit.

Bagan yang menunjukkan penurunan waktu saat beralih dari pemrosesan sekuensial ke paralel.